AMAZE.exe
这道题很有趣(当然是做出的前提下),提示就在名字中
首先,按照常规思路一步一步走,先找到主函数
可以看到,打开exe后,控制台上有打印一句话,这样利用智能查找能很方便得找到main函数位置
接着找到了主要针对字符串进行的一系列变换的操作,(这一大串代码到最后会有一个判断后跳回开头的操作,不出意外就是对字符串进行一个遍历)从后往前推,我们需要让文件输出You are right!
然后有两步比较关键的步骤
1 | mov al,byte ptr ds:[edx+eax*8+0x481040] |
程序会从内存取数据并赋予al,比较al与0x23,假如与0x23相同则跳入到输出error的操作,假如与0x45相同,即可跳转到输出you are right的操作
1 | byte ptr ds:[edx+eax*8+0x481040] |
分析这串取数据的代码,可以明显知道edx+eax*8是控制偏移量的操作,应该会随着我们所输入的数据而进行改变。因此,我们需要去0x481040中看看有啥
如图,发现那一块中的数据,就只有23,20,45,53,45和53只有一个(此处有伏笔)
接着继续往上分析,看看我们该如何控制edx和eax,我们发现eax和edx会接受local.4和local.3这两变量的值,因此着重关注他们
1 | mov eax,[local.4] |
再往上走如图,发现了许多比较后跳转的操作,这一块应该是由if语句所组成,然后,local.3的初值为1,local.4的初值为7,local.5为所输入的值
经过分析可得:
- 输入0x32(2)->local.4++
- 输入0x38(8)->local.4 –
- 输入0x36(6)->local.3++
- 输入0x34(4)->local.3 –
经过计算,若要取到数据段中的0x45,必须使local.3为3,local.4为1,初值已知,因此我就很耿直得输入了66888888,想要直接实现local.3自增2次,local.4自减6次。最后肯定是不行的,因为程序会对每个字符检测,一旦取到了0x23,就会直接跳转到error然后结束。
这时候我就僵住了,经过提示,题目名amaze,拆开来就是a maze 一个迷宫。这其实就是一个走迷宫的问题,每输入的一个数就是控制人物的上下左右。其实通过数据也可以分析得出来,我们要取到0x45就能成功,0x45就相当于终点,如果我们使local.4和local.3保持初值,那么就会取到0x53,0x53相当于起点,如果取到了0x23,程序error结束,相当于迷宫撞墙,操作不对。如果取到了0x20(保持原位也会取到0x20),继续循环,0x20相当于是一个可通的路径。
1 | ######## |
最后分析的结果如上,输入88886666688444即可达到终点
AngelaZiegle
安吉拉齐格勒,这是守望先锋天使的名字,不知道会不会有啥关联
打开运行,发现一篇空白,没法子,F8一步步找输入点
找到后发现,其会调用一个字符串比较函数,比较的对象就是我们所输入的,以及字符串1
GUFB{yZWCZV LZKZW TDZ}
假如比较成功即可输出Till Vahala! 这是天使标志性的台词
那么可以确定GUFB{yZWCZV LZKZW TDZ}就是我们要输入的字符串加密过后的样子,往上找找看程序在对我们字符串进行了什么操作
这里发现一个循环,分析后确认为遍历我们输入的字符串,在这里面除了两个call以外没什么特别的,其中一个call是调用strlen(),另一个肯定有点东西,F7进去看看
没错啦,这就是加密函数,一个很简单的对称加密,简要分析写后出python脚本解密
代码:1
2
3
4
5
6
7
8
9
10
11
12
13
14a='GUFB{yZWCZV LZKZW TDZ}'
b='QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm'
c='qazwsxedcrfvtgbyhnujmikolpQAZWSXEDCRFVTGBYHNUJMIKOLP'
str=''
for ckf in a:
pos=c.find(ckf)
if pos!=-1:
str=str+b[pos]
print(str)
得到flag: flag{Heroes never die}
普通天使 Heroes never die!
橙皮瓦尔基里 Till Vahala!