0%

《逆向工程核心原理》学习笔记3

逆向工程核心原理第五章

image-20211122201000078

栈的作用
  • 暂时保存函数内的局部变量
  • 调用函数时传递参数
  • 保存函数返回后的地址
栈的特征
  • 栈的内存结果如上图所示,栈底==>栈顶 是从高地址到低地址扩展。一个进程中,栈顶指针(ESP)初始状态指向栈底端。当执行PUSH命令将数据压入栈时,栈顶指针就会上移到栈顶端,反之当执行POP命令从栈中弹出数据,若栈为空,则栈顶指针重新移动到栈的底端。

  • 下面测试栈实际是怎样运作的,用Ollydbg打开任意一个exe,这里还是用之前的LittleEndian.exe为例,在main函数起始位置下断点,运行后如下图,可以看到初始时ESP值为"006FFCF8"

    image-20211122202044385

  • 按空格修改汇编指令为push 100,F7运行,然后查看ESP的变化,从下图的寄存器窗口可以看到ESP的值变为了"006FFCF4",比原来少了4个字节,并且从右下角的栈窗口可以看到006FFCF4存放的值为100,也就是我们压入栈的数据

    截屏2021-11-22 下午8.24.35

  • 按空格修改汇编指令为pop eax,F7运行,如下图,可以看到ESP的值变回了"006FFCF8",而且EAX的值变成了100,这说明pop eax指令含义是从栈弹出数据并赋值给EAX。继续观察右下角的栈窗口,可以看到光标停在了"006FFCF8",代表栈顶指针指向该位置,而且可以看到"006FFCF4"的值仍为4,说明pop指令并不会去修改数据的值,只是移动栈顶指针。

    截屏2021-11-22 下午8.29.47


逆向工程核心原理第6章

分析abex' crackme1
  • 首先运行crackme,大致了解软件,运行后如下图,只有一个弹窗

    image-20211122214315722

  • 点击确定后弹出另外一个窗

    image-20211122214510630

  • 从弹窗提示的内容可以知道,需要做的是让软件将我们的硬盘识别为CD-ROM

  • 接下来,用Ollydbg打开crackme

  • 从截图可以看到,跟我们之前自己编译得到的HelloWrold.exe不同,软件的EP代码非常短,这是因为这个crackme是使用汇编语言编写的

    image-20211122214725326

  • 从图中代码,基本可以知道,软件运行时会获取我们的C盘的盘类型:CD-ROM or Other,我们需要做的是让软件识别为 CD-ROM

    image-20211122215044068

  • 修改方式有多种,例如:可以修改00401026地址处代码,将je short 0040103D改为jmp short 0040103D,这里"je"代表"jump if equal","je"改为"jmp"即无条件跳转至地址"0040103D"处,修改后运行,点确定后可以看到弹出跟最初不一样的窗口,破解成功

    image-20211122215508393

  • 还可以将cmp eax, esi的前几行汇编代码修改为mov eax, esi,这样在程序比较eax和esi值之前,我们让它们值变为一样,这样也可以达到跟上面一样的效果