在利用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编辑
,原因: