c/c++语言开发共享在Mac OS 10.6上执行简单的缓冲区溢出

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

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

strcpy(buffer, input) // lets say char buffer[6] but input is 7 bytes 

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

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

    包括

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

    并称之为:

     printf "0123456789abcdefghij26037" | ./a.out 

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

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

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

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

    @joveha的答案是正确的,使用GCC你必须使用-fno-stack-protector编译来转换缓冲区溢出保护。

    但是,您还需要禁用FORTIFY_SOURCE选项,否则如果尝试使用strcpymemcpy类的缓冲区溢出,则会获得“Abort trap”。

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

     gcc -g -fno-stack-protector -D_FORTIFY_SOURCE=0 -o overflow overflow.c 

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

    堆栈溢出?

    术语堆栈溢出是指堆栈大小试图超出当前平台和/或配置所允许的最大限制时的情况。 你要做的事情与堆栈溢出无关。 如果你想看堆栈溢出,写一个无限递归函数,执行它,等待它溢出:

     void foo() { foo(); } 

    (希望编译器不会将尾递归优化到一个循环中。如果确实如此,请使它更复杂,非尾递归。)

    你似乎要做的是重现臭名昭着的缓冲区溢出漏洞。 虽然有问题的缓冲区应该在堆栈中分配,但漏洞从未被称为“堆栈溢出”。 为了实际演示漏洞,仅仅超出某些缓冲区的边界是不够的。 重点是在最初由存储的返回地址占用的堆栈区域中设置一个预定值,这样当函数完成时,它“返回”到其他一些(可能是恶意的)代码而不是原始的调用代码。 。

    那么,你想做什么呢? 堆栈溢出? 还是缓冲区溢出?

    您在Mac OS上的编译器已经编译成堆栈金丝雀 ,它会为您提供中止陷阱。 在编译器手册中搜索如何禁用它。

    使用GCC,此选项是-fno-stack-protector

    另请注意,溢出1个字节肯定不足以触发除编译器堆栈检查之外的任何内容。 使用像12字节的东西:)

    需要了解更多c/c++开发分享在Mac OS 10.6上执行简单的缓冲区溢出,也可以关注C/ C++技术分享栏目—计算机技术网(www.ctvol.com)!

      以上就是c/c++开发分享在Mac OS 10.6上执行简单的缓冲区溢出相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

      ctvol管理联系方式QQ:251552304

      本文章地址:https://www.ctvol.com/c-cdevelopment/979235.html

      (0)
      上一篇 2021年12月12日
      下一篇 2021年12月12日

      精彩推荐