题目链接:https://pan.baidu.com/s/1p3s_RpW_fO_CUWXriFGuAQ
提取码:4lvd
(提示:给出的这道题是我脱壳后的,因为没有及时保存原题,抱歉,不过是简单的UXP壳,大家直接用工具去脱也是可以的,所以相信大家没毛病)
这题是当时打南宁杯时的题目,拿到题目一起分析下:
1、首先用PEID查壳,发现是UXP壳,直接用工具脱壳,我的工具如下(这一步相信都没问题的):
![](https://img.haomeiwen.com/i9085575/3c339111e1cec126.png)
2、脱完壳,拖进OD,看看情况:
![](https://img.haomeiwen.com/i9085575/d959370e9f0ac87f.png)
3、接着拖进ida看看,F5大法:
![](https://img.haomeiwen.com/i9085575/011d1053fe407ca1.png)
![](https://img.haomeiwen.com/i9085575/23a26ac40d3e95dc.png)
从逻辑上看可以知道,do里面的就是检验的过程,是简单的异或加密,就是把输入的字符的前八位与dword_40803里面的东西异或,和右边的比较,相同则v7加一,然后继续下一位,直到v7 = 8,就是说验证前8位都是正确的后,才进入下一层sub_401170(第二关),否则肯定是报错啦。
那么逻辑就是A^B=C,则C^B=A;我们要求input1,也就是要把dword_40803的东西与input[aMwwCTw-input]里面的东西进行异或才能得到input,下面去看看汇编:
![](https://img.haomeiwen.com/i9085575/f7307a39e19d873c.png)
这里无法直接看到,于是可以使用动态调试,地址是00401268,然后重点关注EBX和EBP寄存器的内容,运行OD:
分析逻辑,在00401253(循环开始的上方)在00401258和00401282这3个地方都下个断点
![](https://img.haomeiwen.com/i9085575/922712d79273c762.png)
然后挂完断点跑程序,随便输入29位的字符,记住最后一位是},如下:
![](https://img.haomeiwen.com/i9085575/a29a07f71c63da1c.png)
在XOR指令那里记录EBX寄存器的值,即dword_40803里面的东西,在CMP指令那里记录EBP寄存器的值,即右边的input[aMwwCTw-input]里面的东西,
![](https://img.haomeiwen.com/i9085575/f68af98bbc047b43.png)
![](https://img.haomeiwen.com/i9085575/0ed04c95d3af0ba8.png)
![](https://img.haomeiwen.com/i9085575/340c90aac74d24ad.png)
接着继续第二关:
![](https://img.haomeiwen.com/i9085575/0c53b167de05ae87.png)
![](https://img.haomeiwen.com/i9085575/d92305fefe0c7758.png)
![](https://img.haomeiwen.com/i9085575/ee70155566d980e1.png)
![](https://img.haomeiwen.com/i9085575/2743edb446f4de4a.png)
其实大家想说那是不是在动态调试时也可以看到?答案是肯定的!所以如果没有给出的话,加大难度,那我们就动态调试出来,这里啰嗦下:
![](https://img.haomeiwen.com/i9085575/f5318650d0d5bd63.png)
![](https://img.haomeiwen.com/i9085575/e1e858702389504f.png)
接下来继续闯关!
![](https://img.haomeiwen.com/i9085575/c3417badbd44ecad.png)
![](https://img.haomeiwen.com/i9085575/299167e46bfb606b.png)
![](https://img.haomeiwen.com/i9085575/b0c3be74c0970c55.png)
![](https://img.haomeiwen.com/i9085575/97ecb4f4197e2843.png)
![](https://img.haomeiwen.com/i9085575/b3b41a0bfed35871.png)
![](https://img.haomeiwen.com/i9085575/d1d234a1238e1d95.png)
![](https://img.haomeiwen.com/i9085575/781dd16dc74db1a2.png)
![](https://img.haomeiwen.com/i9085575/a81af2ea57a7fa89.png)
由前面的可以知道,总共破解了8+5+9=22位字符,总长度29位,所以这是对接下来的6位字符(因为最后一位是“}”)的操作,分析逻辑可以知道,看do里面的if,右边的内容减2就是左边的,所以得先知道右边是什么,看汇编,再次动态调试:
![](https://img.haomeiwen.com/i9085575/ec079fc9a9430274.png)
![](https://img.haomeiwen.com/i9085575/6f6cd41f36da8a81.png)
![](https://img.haomeiwen.com/i9085575/fb58ac1fa1f7269c.png)
整合下代码,最终的flag就是gxnnctf{Se1f-M0difying_c0de!},我们去提交下吧!
![](https://img.haomeiwen.com/i9085575/154bf0f3e18c9a8a.png)
总结经验:本题是对动态调试查看栈里面的内容,以及异或加密操作,经历过后,我们的动态调试能力有所提升,汇编语言也学习到了一些,对于学习逆向的帮助还是很大的,这是一大技巧,希望能对大家有用,我也在学习的过程中,一起加油吧!
网友评论