在Mac OS 10.6上执行简单的缓冲区溢出

REA*_*EE 4 c macos buffer-overflow fortify-source

我正在尝试了解堆栈基础溢出并编写一个简单的代码来利用堆栈.但不知怎的,它根本不起作用,只显示我的机器上的Abort陷阱(mac os豹)

我猜Mac OS对待溢出的方式不同,它不允许我通过c代码覆盖内存.例如,

strcpy(buffer, input) // lets say char buffer[6] but input is 7 bytes 
Run Code Online (Sandbox Code Playgroud)

在Linux机器上,此代码成功覆盖下一个堆栈,但在mac os上被阻止(Abort trap)

任何人都知道如何在mac机器上执行简单的堆栈溢出?

Pao*_*tti 12

@joveha的答案是正确的,有了GCC,你必须编译-fno-stack-protector用于转向缓冲区溢出保护.

但是,另外你需要禁用该FORTIFY_SOURCE选项,否则你会得到"Abort trap",如果你试图做一个像strcpy或那样的缓冲区溢出memcpy.

要禁用它,只需使用标志-D_FORTIFY_SOURCE=0进行编译,例如:

gcc -g -fno-stack-protector -D_FORTIFY_SOURCE=0 -o overflow overflow.c
Run Code Online (Sandbox Code Playgroud)

来源:关闭GCC中的缓冲区溢出保护.


小智 6

包括

int main(int argc, char **argv) {
    char buffer[4];
    puts("Hello");
    gets(buffer);
    return 0;)
}
Run Code Online (Sandbox Code Playgroud)

并称之为:

printf "0123456789abcdefghij\260\037" | ./a.out
Run Code Online (Sandbox Code Playgroud)

\ 260\037是以八进制和小端顺序的main(0x1fb0)的地址.

在发生总线错误之前,您应该看到hello print两次.诀窍是使用调试器(甚至gdb会这样做)知道你想要结束的地方和返回地址.它与Linux中的不一样!

用于i386的MacOS X(大多数用于i386的操作系统,实际上包括Linux和Windows),尤其是<= Leopard,并不是最安全的操作系统.

编辑:刚刚意识到我使用clang作为编译器.因此,您需要将其调整为gcc,但我可以告诉您它的工作变化不大:p.