数独游戏:int __cdecl main(int argc, const char **argv, const char **envp) 解题
这道题目是数独游戏,要求我们填完整个数独,使得每一行、每一列、每一个'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}
原文地址: https://www.cveoy.top/t/topic/n5Pj 著作权归作者所有。请勿转载和采集!