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;
这道题目是数独游戏,要求我们填完整个数独,使得每一行、每一列、每一个 $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}
``
原文地址: https://www.cveoy.top/t/topic/fdmy 著作权归作者所有。请勿转载和采集!