1

我正在使用 Mac OSX。我创建了一个缓冲区溢出易受攻击的程序:

#include<stdio.h>
#include<string.h>

int neverCalled() {
    puts("You got me to be called");
    return 0;
}

int main() {
    puts("Name: ");
    char name[64];
    gets(name);
    return 0;
}

我还创建了一个包含 88 个 "A" ( 0x414141...) 的输入文件和0x700E000001000000

在 gdb 中运行时:

(gdb) run < input

我得到输出:You got me to be called然后是一个EXC_BAD_ACCESS错误。这意味着我成功地利用了该程序。

在终端运行时:

$ ./vulnerable < input

我得到了输出:仅此Segmentation fault: 11而已。

为什么我的缓冲区溢出在 gdb 中有效,但在普通终端中失败。

4

2 回答 2

1

mac os X 上的 gdb 似乎禁用了地址空间布局随机化

http://reverse.put.as/2011/08/11/how-gdb-disables-aslr-in-mac-os-x-lion/

于 2013-02-18T15:27:24.653 回答
0

为什么是 0x700E000001000000?您的漏洞利用似乎是特定于布局的,可能与键入“p neverCalled”时 gdb 打印的内容不同。

在所有执行中都不能保证这一点。正如 cabellicar123 正确指出的那样,库和可执行文件在进程中映射的布局是随机的,并且不能保证在执行之间是相同的。

出于某种原因,gdb 似乎总是得到相同的布局。作为练习,在您的程序中的某处包含“printf("%p"\n", neverCalled)" 并查看值如何变化。

于 2013-02-18T15:33:42.380 回答