下载附件解压,为了方便,我将文件名改为了maze.exe
一般我们先查壳,确实存在UPX壳
对于刚接触逆向的我,一键脱掉哈哈哈
不过还是要说一下,这种脱壳处理有可能会产生其它损坏或者影响,需要进行一定的修复
可以看到已经没壳了,我们尝试运行exe文件
大概意思是需要我们输入正确的东西来获取flag
经过检查,这是一个32位程序
我们将文件用IDA打开,F5反编译发现没反应
观察程序停在的地方,这里的 jnz 指令会实现一个跳转,并且下面的0EC85D78Bh被标红了,应该是一个不存在的地址,这些东西就会导致IDA无法正常反汇编出原始代码,也称为花指令。
我们需要将它们Nop掉(即使用Nop指令将它们改为空,Nop的hex是90)
找到这个选项
我们需要从75一直Nop到58
OK之后这四行都成了空
我们再找到这个选项
OK,居然直接成功了,我最开始将文件放在桌面似乎权限不够
(如果遇到权限不够的报错,尝试将文件放到D盘或者其他盘,不要放C盘)
现在我们再使用IDA打开修改后的文件,便可F5反编译成功
咦~ wsad 怎么看着这么眼熟,这不就是键盘上的上下左右吗
当你做逆向久了你就会知道,这其实是逆向的一种典型迷宫题
我们跟进上面的函数,找到了迷宫的内容
Format db '%14s' 是一个格式化字符串, %14s表示格式化一个字符串并占用14个字符的宽度
(可以理解为我们在迷宫里需要并且只能走十四步)
绿色框里的就是程序运行时会输出的内容
我们将迷宫内容导出,共有70个位置,这里我们猜它是10*7的迷宫
构造出迷宫的样子
def main():
maze = "*******+********* ****** **** ******* **F****** **************"
sid = maze.index("+")
eid = maze.index("F")
ex,ey = -4,5
c = (eid - ey) // (-ex)
r = len(maze) // c
print(r,c)
for i in range(r):
print(maze[c*i:c*(i+1)])
if __name__ == "__main__":
main()
我们需要从+,经过14步,走到F
关于这个图可能容易产生误解,这里说明一下:
这个+和F其实都是夹在*中间的,并且竖着的*之间是没有空留位置的,一个*即对应着一格
可以等效为下图:
这里可以选择的路线不唯一,所以flag也应该是有多个的
下面给出两种可行的走法:
aasssssssswwww 或者 ssaaasaassdddw (w上s下a左d右,看你键盘)
都是可以的
最终拿到flag
flag{aasssssssswwww} 或 flag{ssaaasaassdddw}