南宁杯re之SMC.exe——OD动态调试查看栈内容
题目链接:https://pan.baidu.com/s/1p3s_RpW_fO_CUWXriFGuAQ
提取码:4lvd
(提示:给出的这道题是我脱壳后的,因为没有及时保存原题,抱歉,不过是简单的UXP壳,大家直接用工具去脱也是可以的,所以相信大家没毛病)
这题是当时打南宁杯时的题目,拿到题目一起分析下:
1、首先用PEID查壳,发现是UXP壳,直接用工具脱壳,我的工具如下(这一步相信都没问题的):

2、脱完壳,拖进OD,看看情况:

3、接着拖进ida看看,F5大法:


从逻辑上看可以知道,do里面的就是检验的过程,是简单的异或加密,就是把输入的字符的前八位与dword_40803里面的东西异或,和右边的比较,相同则v7加一,然后继续下一位,直到v7 = 8,就是说验证前8位都是正确的后,才进入下一层sub_401170(第二关),否则肯定是报错啦。
那么逻辑就是A^B=C,则C^B=A;我们要求input1,也就是要把dword_40803的东西与input[aMwwCTw-input]里面的东西进行异或才能得到input,下面去看看汇编:

这里无法直接看到,于是可以使用动态调试,地址是00401268,然后重点关注EBX和EBP寄存器的内容,运行OD:
分析逻辑,在00401253(循环开始的上方)在00401258和00401282这3个地方都下个断点

然后挂完断点跑程序,随便输入29位的字符,记住最后一位是},如下:

在XOR指令那里记录EBX寄存器的值,即dword_40803里面的东西,在CMP指令那里记录EBP寄存器的值,即右边的input[aMwwCTw-input]里面的东西,



接着继续第二关:




其实大家想说那是不是在动态调试时也可以看到?答案是肯定的!所以如果没有给出的话,加大难度,那我们就动态调试出来,这里啰嗦下:


接下来继续闯关!








由前面的可以知道,总共破解了8+5+9=22位字符,总长度29位,所以这是对接下来的6位字符(因为最后一位是“}”)的操作,分析逻辑可以知道,看do里面的if,右边的内容减2就是左边的,所以得先知道右边是什么,看汇编,再次动态调试:



整合下代码,最终的flag就是gxnnctf{Se1f-M0difying_c0de!},我们去提交下吧!

总结经验:本题是对动态调试查看栈里面的内容,以及异或加密操作,经历过后,我们的动态调试能力有所提升,汇编语言也学习到了一些,对于学习逆向的帮助还是很大的,这是一大技巧,希望能对大家有用,我也在学习的过程中,一起加油吧!