4.覆盖函数地址
单步执行 1 次,由于 strcpy 语句导致了 name[16]数组的缓冲区溢出,因而往后覆盖myfunc()的值为 0x62626262,如图 4.21 所示。
5.程序出错
再次单步执行 myfunc()函数时发生错误,指令地址为 0x62626262,这与覆盖返回地址类似,如果要控制程序的流程,需要将 myfunc()函数指针修改为某个跳转地址。在这个例子中,程序出错时按“ ALT” +“ 5”组合键调出寄存器窗口,可以观察到此时EAX=0x0012ff6c,正好指向 name[16]的地址,因此可以将 myfunc 的值改为 jmp eax 指令所在的地址。覆盖函数指针完成跳转如图 4.22 所示。
4.7.4 实验要求
使用 VC 6.0 跟踪覆盖函数地址的全过程,并给出过程中相关参数和内存的变化情况,说明程序出错的原因。
4.8 覆盖 SEH 链表实验
4.8.1 实验目的
本实验要求了解通过覆盖 SEH 链表进行缓冲区溢出利用的原理,掌握覆盖 SHE 链表
的过程。
4.8.2 实验内容及环境
1.实验内容
本实验使用 OllyDbg 调试器加载程序,从 main 函数开始处进行单步步入运行,观察栈中 SHE 链表节点和局部变量 a 的变化,跟踪异常处理过程,了解和掌握通过覆盖 SEH链表进行缓冲区溢出利用的技术。
2.实验环境
(1)靶机系统环境为 Windows XP SP3 32 位;
(2) VC 6.0:详见本书 4.3 节实验工具介绍;
(3) OllyDbg:详见本书 4.3 节实验工具介绍。
4.8.3 实验步骤
1.实验要求
通过 VC 6.0 将以下代码编译成 debug 版的.exe 文件。
1