首页
社区
课程
招聘
未解决 SEH利用失败原因排查【结帖】
发表于: 2020-5-6 12:35 2139

未解决 SEH利用失败原因排查【结帖】

2020-5-6 12:35
2139

在利用SEH时选用的pop pop retn不同,影响了结果是否成功,从下图可以看出与是否启用safeseh无关。

 

如下选择了4个不同的pop地址,都是位于.text段,但是结果不同。

# exp += b'\x21\x30\xd3\x74' # pop esi;pop ebx;retn -->success |oledlg.dll
# exp += b'\x41\x02\x9f\x7c' # pop edi; pop esi;retn -->fail | shell32.dll
exp += b'\x41\x02\x9f\x7c' # pop esi; pop ebx;retn -->fail | shell32.dll
# pop2ret = b"\xed\x8d\x01\x10" # pop ebp ; pop ecx ; ret -->sucess | SSLEAY32.dll

跟踪SEH运行步骤如下

ntdll.7c90eaf0

ntdll.7c9377c1

call ntdll.7c903920后eax指向了seh附近

mov ebx,eax

push [ebx+4]

关键在call ntdll.7c9378a1这个函数执行结果后al的值,al为1则溢出能成功,

失败前push 的参数为shell32.7c9f0241

ntdll.7c903753

ntdll.7c903799

mov ecx,[ebp+18]

call ecx

 


 

ntdll的加载基址为7c900000

.text为7c901000

查找ntdll.7c9378a1这个函数,没找到这个函数

>>> hex(0x7c9378a1-0x7c900000)
'0x378a1'

 

 

有大佬知道利用失败的原因吗,虽然最后结果靠运气试出来了,但是中间被这个问题磨了两个小时。


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

最后于 2020-5-6 19:07 被Jmp_e5p编辑 ,原因:
收藏
免费 0
支持
分享
最新回复 (1)
雪    币: 39
活跃值: (32)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
最后还是自问自答吧,感谢“双黄连你跟板蓝根”大佬的提示,我在csdn上找到xp sp2的调试符号表的补丁包,用ida加载ntdll.dll并导入ntdll.pdb文件,这样可以查看到所有函数名。ntdll.7c9378a1函数名为RtlIsValidHandler()。这是safeSEH保护措施的一个函数,会判断SEH处理函数指针是否合法,SSLEAY32.dll和oledlg.dll都未启用SafeSEH,所以能跳转到其pop命令执行,而shell32.dll启用了SafeSEH,但是又不在Safe SEH表中,所以TtlIsValidHandler()返回0(溢出SEH失败)。本问题出现的原因还是因为自己对SafeSEH的理解有偏差。参考http://yllen.lofter.com/post/30e12f_6793d49
2020-5-6 19:06
0
游客
登录 | 注册 方可回帖
返回
//