缓冲区溢出在GDB中工作,但在终端中不起作用

时间:2013-02-17 22:46:45

标签: terminal gdb buffer-overflow

我正在使用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中工作但在正常终端中失败。

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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

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

出于某种原因,似乎gdb总是得到相同的布局。作为练习包括“printf(”%p“\ n”,“neverCalled”)“程序中的某个地方,看看价值如何变化。