【问题标题】:Using NULL bytes in bash (for buffer overflow)在 bash 中使用 NULL 字节(用于缓冲区溢出)
【发布时间】:2017-11-13 17:24:51
【问题描述】:

我编写了一个容易受到缓冲区溢出影响的小 C 程序。一切都按预期工作,尽管我现在遇到了一个小问题:

我想调用一个位于地址 0x00007ffff7a79450 上的函数,因为我正在通过 bash 终端传递缓冲区溢出的参数(如下所示:

./a "$(python -c 'print "aaaaaaaaaaaaaaaaaaaaaa\x50\x94\xA7\xF7\xFF\x7F\x00\x00"')" )

我收到 bash 忽略空字节的错误。

/bin/bash: warning: command substitution: ignored null byte in input

结果我在内存中得到了错误的地址(0x7ffff7a79450而不是0x00007ffff7a79450)。

现在我的问题是:如何生成前导 0 并将它们作为参数提供给我的程序?

【问题讨论】:

  • 另一个程序...
  • NULL 是一个带有 空指针常量 的宏。切勿将其用于char。而且您的代码没有问题。你故意调用未定义的行为,这正是你得到的。案件结案。
  • 参见this answerthis one 。 bash 将空字节作为空格处理。
  • 您正试图在错误的地方解决问题。修复易受缓冲区溢出影响的小 C 程序。
  • @ArturR.Czechowski:出于培训/演示目的,他的目的是让他的程序容易受到缓冲区溢出的影响。他只是想解析一个包含空字节的函数的地址。

标签: python c linux bash


【解决方案1】:

我将采取一个大胆的举措,并断言您想要做的事情在 POSIX 环境中是不可能的,因为参数传递的方式。

程序使用execve 系统调用运行。

int execve(const char *filename, char *const argv[], char *const envp[]);

还有一些其他函数,但它们都在最后包装 execve 或使用具有以下属性的扩展系统调用:

  • 程序参数使用以 NUL 结尾的字符串数组传递。

这意味着当内核接受你的参数并将它们放在一边供新程序使用时,它只会读取它们直到第一个 NUL 字符,并丢弃后面的任何内容。

因此,如果必须包含 nul 字符,则无法使您的示例正常工作。这就是为什么我建议改为从标准输入读取,它没有这样的限制:

char buf[256];
read(STDIN_FILENO, buf, 2*sizeof(buf));

您通常需要检查read 的返回值。对于一个玩具问题,您应该足以触发您的漏洞利用。只需将您的恶意输入通过管道传输到您的程序中即可。

【讨论】:

    猜你喜欢
    • 2016-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-16
    • 1970-01-01
    • 2010-11-11
    • 1970-01-01
    • 2013-04-12
    相关资源
    最近更新 更多