逆向工程核心原理第五章
栈
栈的作用
- 暂时保存函数内的局部变量
- 调用函数时传递参数
- 保存函数返回后的地址
栈的特征
栈的内存结果如上图所示,栈底==>栈顶 是从高地址到低地址扩展。一个进程中,栈顶指针(ESP)初始状态指向栈底端。当执行PUSH命令将数据压入栈时,栈顶指针就会上移到栈顶端,反之当执行POP命令从栈中弹出数据,若栈为空,则栈顶指针重新移动到栈的底端。
下面测试栈实际是怎样运作的,用Ollydbg打开任意一个exe,这里还是用之前的LittleEndian.exe为例,在main函数起始位置下断点,运行后如下图,可以看到初始时ESP值为"006FFCF8"
按空格修改汇编指令为
push 100
,F7运行,然后查看ESP的变化,从下图的寄存器窗口可以看到ESP的值变为了"006FFCF4",比原来少了4个字节,并且从右下角的栈窗口可以看到006FFCF4存放的值为100,也就是我们压入栈的数据按空格修改汇编指令为
pop eax
,F7运行,如下图,可以看到ESP的值变回了"006FFCF8",而且EAX的值变成了100,这说明pop eax
指令含义是从栈弹出数据并赋值给EAX。继续观察右下角的栈窗口,可以看到光标停在了"006FFCF8",代表栈顶指针指向该位置,而且可以看到"006FFCF4"的值仍为4,说明pop
指令并不会去修改数据的值,只是移动栈顶指针。
逆向工程核心原理第6章
分析abex' crackme1
首先运行crackme,大致了解软件,运行后如下图,只有一个弹窗
点击确定后弹出另外一个窗
从弹窗提示的内容可以知道,需要做的是让软件将我们的硬盘识别为CD-ROM
接下来,用Ollydbg打开crackme
从截图可以看到,跟我们之前自己编译得到的HelloWrold.exe不同,软件的EP代码非常短,这是因为这个crackme是使用汇编语言编写的
从图中代码,基本可以知道,软件运行时会获取我们的C盘的盘类型:CD-ROM or Other,我们需要做的是让软件识别为 CD-ROM
修改方式有多种,例如:可以修改00401026地址处代码,将
je short 0040103D
改为jmp short 0040103D
,这里"je"代表"jump if equal","je"改为"jmp"即无条件跳转至地址"0040103D"处,修改后运行,点确定后可以看到弹出跟最初不一样的窗口,破解成功还可以将
cmp eax, esi
的前几行汇编代码修改为mov eax, esi
,这样在程序比较eax和esi值之前,我们让它们值变为一样,这样也可以达到跟上面一样的效果