我正在使用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中工作但在正常终端中失败。
答案 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”)“程序中的某个地方,看看价值如何变化。