****核心原理第六章
0x00 前言
逆向还是学一学吧,万一有一天就用到了呢。
abex’crackme #1的**。
0x01 正文
1.试用
运行效果
点击确定之后
2.od分析
我们来一步一步的进行分析。
首先初始状态ESP指向栈底,此时为0018FF84。
EIP则是00401000,其实就是程序运行的地址。
这里显示的应该是内存空间,可以看到现在栈里是空的。
F7一下。直接看图,ESP递减,EIP增加
继续F7
F7
F7,这里可以看到push栈结束了,类似于创建了一个数组
F8,此时会直接显示弹窗。按确认之后进行下一步。
被框起来的就是改变了的值。
接着看这里调用了GetDriveType,GetDriveType可以获取目录和盘号的属性。
这里是先push了一个c判断,然后获取属性。
F8一下
继续F8,此时相当于GetDriveType已经运行完成了。
继续F8一下,这里是inc esi inc指令就是+1,那么这里就是esi寄存器+1
继续F8,dec的意思是-1 这里是将eax-1
F8,jmp 00401021,跳转到00401021位置,但是由于00401021就是下一行,所以这一行代码就是所谓的垃圾代码。
F8 inc esi 连续两个。就是esi=esi+2
F8 dec eax eax+=1
继续F8 cmp eax,esi.
cmp指令的含义就是对两个操作数进行比较,如果一致,ZF被置为1
这明显是不一样的,Z是0
然后剩下的内容其实都是重复的。
3.**
这里**就很简单了
3.1 方法一
直接把je改成jmp,这样就不管一不一样就可以直接跳转了。
3.2 方法二
判断不可能的,直接在0040101D 处写 jmp short 0040103D 就ok了,不用去等判断
3.3 方法三
下断点,然后动态修改EAX的值和ESI的值一致即可。
3.4 方法四
下断点,cmp之后,把ZF改成1就行。
可以看到这里是直接跳转了的。