题目crackme
解法
第一次做这样的题,可以说是奇难了。
1.手动脱壳,这道题是nspack,没见过这个壳,去找别的师傅学习了一下,https://blog.csdn.net/xiao__1bai/article/details/120230397讲的非常详细了,但我还是想用我的语言把我的理解再复述一遍。nspack,北斗壳,也是一种压缩壳加密壳。用的是堆栈平衡原理,这个原理就是要在加壳的时候保证壳初始化的现场环境,就会有pushad,pushfd这样的指令。可以把壳当做一个子程序,当壳把代码解压前后,要遵循这个堆栈平衡的原理。
下面开始详细步骤,打开odg。
ok很标准
对esp右键数据窗口追踪
按f7两步步入这时候两个push已经压栈完毕,可以看到esp现在所指向的地方
对这个地方下硬件断点
执行过来是这样的界面,可以看到下面一行就要call了。我们步入。
来到了这里就是我们的oep。用dump工具进行脱壳
再用ida打开看看
已经是脱完壳的状态了。
算法也很简单,但不知道为什么,这里的print和scanf没给我识别出来,但也无伤大雅吧。直接写出脚本
题目debug
解法
这道题也是从来没做过ida反汇编出来是这个东西
一时间也盲头了。直接去看别人的wp。
2.是要用.net反编译去做,有两款软件ILSPY和dnSPY,我用的是dnSPY。在dnspy中几个关键操作是:F9为添加新的断点;F5为调试程序集;F10为逐过程运行程序语句;F11为逐语句调试;shift+F11为跳出。
打开之后找到关键函数的地方。然后分析一下。
这里主函数已经读入我们的内容之后与他内置的flag进行一个对比,所以我们直接就在比较的地方下断,看一下存的到底是什么flag
直接看到flag
题目ReverseMe-120
解法
这题没有前面两题这么抽象,ida分析就可以看到过程
判断正误的就在于红框内的代码。那我们就要看v12在哪里动了手脚了。
很奇怪,居然没有传入。确实是很蹊跷点击进入这个才恍然大悟。
3.这里就有一个知识点,在外面的时候可以看到只是对v11进行了操作,但是点进去之后才发现这是对寄存器进行传参了,只是ida识别不出来而已。
ok,那么这个函数就是比较关键的处理函数。
这里我没看懂,看了别人的writeup,才明白这里是一个base64加解密的过程,关键可以看看这里
所以逆向思路也清晰了,you_know_how_to_remove_junk_code,异或操作,base64加解密
贴出脚本
总结:
crakeme 脱壳题 栈堆平衡
debug 初识.net
ReverseMe-120函数传参 base64