[HDCTF2019]Maze(初识逆向)

简介: [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}

目录
相关文章
|
12月前
|
C++
spfa判断负环的应用
spfa判断负环的应用
45 0
|
人工智能
poj 2299 Ultra-QuickSort 求逆序数 树状数组解法
所谓离散化,我们的了解就是对原数组排序,然后用所在位置的下标代替原数,这样我们就可以把数据范围缩小到1-500000,这个数组是开的下的。
42 0
|
人工智能
POJ 2299 Ultra-QuickSort(树状数组+离散化+求逆序数)
POJ 2299 Ultra-QuickSort(树状数组+离散化+求逆序数)
|
机器学习/深度学习
UPC 换位置游戏(BFS || 并查集判环)
UPC 换位置游戏(BFS || 并查集判环)
104 0
UPC 换位置游戏(BFS || 并查集判环)
AtCoder Beginner Contest 216 D - Pair of Balls (思维建图 拓扑排序判断有向图是否有环)
AtCoder Beginner Contest 216 D - Pair of Balls (思维建图 拓扑排序判断有向图是否有环)
123 0
|
算法 测试技术
【算法笔记题解】PAT A1075 PAT Judge
【算法笔记题解】PAT A1075 PAT Judge
【算法笔记题解】PAT A1075 PAT Judge