这道题目是数独游戏,要求我们填完整个数独,使得每一行、每一列、每一个 $3\times 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 mainint argc const char argv const char envp char v3; rbp int v4; er14 unsigned int v5; er12 __int64 i; rbx char v7; al int v8; eax char v9; rax v3 = char &matrix; v4 = 1;

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

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