[HDCTF2019]Maze(初识逆向)

下载附件解压,为了方便,我将文件名改为了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}

猜你喜欢

转载自blog.csdn.net/Myon5/article/details/131663816
今日推荐