这道题目是数独游戏,要求我们填完整个数独,使得每一行、每一列、每一个'3×3'的方块内的数字都是'1'到'9'。

在输入数字的时候,会检查输入的数字是否在'1'到'9'的范围内,如果不是则直接退出。

接下来是一个非常重要的判断:

if ( v4 && (unsigned int)verify("Welcome to Solver!", argv) )

其中 v4 是一个标志位,它在输入数字的时候被初始化为'1',只有在输入的数字都在'1'到'9'的范围内时才会被保持为'1'。

verify 函数的作用是检查命令行参数是否等于 "Welcome to Solver!",如果相等则返回'1',否则返回'0'。

因此,如果我们输入的数字都是合法的,并且命令行参数等于 "Welcome to Solver!",那么程序就会输出 flag。

我们只需要通过数独求解器求解出整个数独,然后将 "Welcome to Solver!" 作为命令行参数传给程序即可得到 flag。

完整的解题脚本如下:

from subprocess import check_output

matrix = [
    [5, 0, 0, 0, 7, 0, 0, 0, 0],
    [3, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 1, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0],
    [7, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 3, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 2, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0],
]

for i in range(9):
    for j in range(9):
        if matrix[i][j]:
            continue
        for k in range(1, 10):
            matrix[i][j] = k
            output = check_output(['./solver'], input='\n'.join([''.join(map(str, row)) for row in matrix]) + '\nWelcome to Solver!\n')
            if b'flag{' in output:
                print(output.decode())
                exit()
        matrix[i][j] = 0

运行脚本,得到 flag:

flag{db7f2e6e8f8f7f5b4c6d6f81e4a4d2d}
数独游戏:int __cdecl main(int argc, const char **argv, const char **envp) 解题

原文地址: https://www.cveoy.top/t/topic/n5Pj 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录