题目
题目地址:Take the maze
解题
说句实话,这题看起来很简单,但其实是一道非常狗的题,谁做谁知道!
我们直接进OD查字符串,定位到key error这里:
这里可以看到,并没有什么跳转可以跳过它,说明这是一个外部调用,我们需要出这个CALL去分析,我们在断尾下断,以免程序跑飞了:
出CALL后发现有一个JE可以跳过它,我们把它改为jnz。
然后随便输入一串key让它判断去吧,程序断在我们的断点,我们F8出CALL,下面的第一个JMP会跳过程序输出flag,所以我们要NOP掉:
到这里还没完,我们继续F8往下走,下面的这个jge会跳过一个二次判断,但是这里没有实现跳转,我们把它改为jnz:
到这里继续F8,把这里的je改为jnz,让他执行那三次函数调用,这里我跑过了,不过不影响我们解题。
继续F8,程序跑起来了,我们按照他说的,按任意键继续,途中的断点我们都取消,成功绕过了程序的判断,让程序输出了最终的flag.png~
扫码后拿到提示:Congratulations! The flag is your input + “Docupa”,当时我就蒙了,这可不是我想要的flag啊!
到这里就是(kai)一(shi)个(gou)坑(le),程序虽然我们已经破解了,但是正确的flag必须根据input+Docupa来组成,我们前面输入的肯定是不对的,最终还是看了论坛大佬写的帖子,按照他最终的脚本拿到的flag。
a = list("06360836063b0839073e0639")
a[16] = chr(ord(a[16]) ^ 1)
for i in range(24):
print(chr(ord(a[i])^i), end='')
运行结果:
最终flag:zsctf{07154=518?9i<5=6!&!v$#%.Docupa}
相关链接:吾爱破解