首先下载下来,拖入exeinfo,发现是upx的壳,直接脱壳就好了。然后拖入IDA,我靠,什么都显示不出来,F5键一点也是用不了,发现是main函数下面IDA无法识别,奇怪,识别不了只能动调了。
其实我是很怀疑是不是jnz指令存在混淆,导致IDA识别了错误的call指令,毕竟固定的地址也是错误的
下面就是一大段字节码,没有被IDA识别的内容 (这个就是maze behind junk吗?)

我们从输出的字符串入手,设置断点,在x64dbg中查找(Shift + D ) 本模块”Go through …” 的字符串,并且定位到调用的位置


这里很容易看出,push ebp 就是一个函数入口函数,毕竟这个是x86的程序,高亮的那一行就是参数入栈,那么自然下面一句就是printf之类的函数
程序需要输入内容,那么自然可以联想到必定有类似scanf的函数调用,并且通过scanf的字符串可以观察到 “%14s” 就是接受14个字符串,下面可以假设为scanf
然后接着往下,这个也是被识别为call指令,但实际上又不会发生跳转,我们接着往下执行

高亮的那一行被许多分支指向,然后自己又回到了上面,可以判断是一个循环,然后我们再看下面就有了 “Congratulation”的字样,说明上面就是flag的判断,这道题是迷宫题,我们还是需要寻找到迷宫。

这个只能一句一句分析,并且随便输入点东西来看。逻辑一定是会检测输入的内容,于是我们随便输入点东西,并且让程序执行到下面:

首先可以确定几个局部变量: [ebp-0x14]和 [ebp-0x18] 与 [ebp-0x10] ,
一个一个在内存中查看:
0x10: 这个很明显就是scanf 输入

0x14 暂时还无法判断

0x18 根据逻辑可以分析出来,
1 | 00401048 | MOV EDX,DWORD PTR SS:[EBP-0x14] | |
取0x10+ edx的内容到eax,再写入到0x18中,然后再写入ecx,并且减去 0x61 (就是 a ),然后再写入0x18中
这个就是纯纯脱裤子放屁
根据这个,我们可以推断出edx 就是计数器,类似于for 循环中的i一样,并且在看下的:

0x14的值与13进行比较,大于跳出,大于恰好就是14个,也就是输入14个字母,这一段的逻辑就能说得通了
不过这样其实还离我们的目标很远,只是分析出了程序的大概逻辑
在x32dbg的图表中:

我们很明显可以看到4个结构,并且我们能够发现两个神秘的地址:
0x40807C和0x408078

并且上面的4个结构做的事情就是对这两个地址的其中一个进行加减操作
并且我们查看这里的内存时,就能发现:

欸,这个不就是很像迷宫的结构,于是转到IDA进行分析:

尝试构成一个合理的迷宫:

并且我们看下面的 db7,0 也知道这个就是+的位置
那么一切都是简单的了,直接可以得到flag:
ssaaasaassdddw
结束