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.
| 归档时间: |
|
| 查看次数: |
6692 次 |
| 最近记录: |