跟到main里发现main里的SHE节点已经初始化
p1
重启程序找到初始化main的SHE节点的函数
p2
进入test函数的SHE节点初始化
p3
触发断点后可以看见eip跳到了test函数的SE处理函数(并且在跳过去的过程中又创建了一个节点)
p4
进入vcruntim, 往下找到获取异常处理函数地址的位置
p5

回到strcpy处, 计算buf变量到SEH节点(保存处理函数的地址处)的相对偏移(==0xd8)
覆盖成功
p6


基本流程梳理清楚了 尝试覆盖函数地址

vs2019关闭SAFESEH
p7

程序无法跳到栈上执行(检查了目标地址是否在栈内)
p9
所以采用直接跳到全局变量shellcode(0x403018)处执行
p8
shellcode:

坑:

  1. 之前用了DEBUG版本, 发现eip并不能跳到指定位置, 程序在开始处理异常后会卡死, 猜测是进行了检查
  2. 程序没有触发异常, 发现是shellcode把变量zero的值给覆盖成了0x90909090, 然后把shellcode对应位置改成\x00后发现strcpy会截断\x00后的内容, 所以在strcpy后重新给zero重新赋0值(环境不同, 编译出的结果不同)

开启safeSEH

绕过safeSEH的方法还是挺多的

这里利用堆绕过

shellCode内容相同, 执行的位置从全局变量区到了堆区(safeSHE允许在堆上执行)

jumpCode覆盖处理异常的函数的地址