代码之家  ›  专栏  ›  技术社区  ›  REALFREE

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

  •  4
  • REALFREE  · 技术社区  · 14 年前

    我正在尝试学习栈基溢出,并编写一个简单的代码来利用栈。但不知何故,它根本不起作用,只是在我的机器上显示了一个中止陷阱(mac os leopard)

    我猜MacOS对待溢出的处理方式不同,它不允许我通过C代码覆盖内存。例如,

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

    在Linux机器上,此代码成功覆盖下一个堆栈,但在Mac OS上被阻止(中止陷阱)

    有人知道如何在Mac计算机上执行简单的堆栈基溢出吗?

    4 回复  |  直到 14 年前
        1
  •  6
  •   jbcreix    14 年前

    包括

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

    并称之为:

    printf "0123456789abcdefghij\260\037" | ./a.out
    

    \ 260\037是主地址(这里是0x1FB0),按八进制和小尾数顺序排列。

    在出现总线错误之前,您应该看到两次Hello打印。诀窍是使用一个调试器(甚至gdb也会这样做)来知道您希望在哪里结束,以及返回地址在哪里。它不会和Linux中的一样!

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

    编辑:刚意识到我用clang作为编译器。所以你需要适应GCC,但我可以告诉你,它的工作没有什么变化:P。

        2
  •  11
  •   Community T.Woody    7 年前

    @joveha's answer 是正确的,对于gcc,您必须使用 -fno-stack-protector 打开缓冲区溢出保护。

    但是,另外,您需要禁用 FORTIFY_SOURCE 选项,否则,如果尝试执行使用类似于 strcpy memcpy .

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

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

    来源: Turning off buffer overflow protections in GCC .

        3
  •  4
  •   AnT stands with Russia    14 年前

    堆栈溢出?

    术语 栈溢出 指堆栈大小试图超过当前平台和/或配置允许的最大限制时的情况。您所要做的与堆栈溢出完全没有关系。如果希望看到堆栈溢出,请编写一个无限递归函数,执行它,然后等待它溢出:

    void foo() {
      foo();
    }
    

    (希望编译器不会将尾部递归优化为一个循环。如果是这样的话,就让它变得更复杂一些,无尾递归。)

    你要做的似乎是复制臭名昭著的 缓冲区溢出 剥削。虽然所讨论的缓冲区应该在堆栈中分配,但该漏洞从未被称为“堆栈溢出”。为了实际演示该漏洞,仅仅超出某个缓冲区的界限是不够的。整点是在存储的返回地址最初占用的堆栈区域中放置一个预先确定的值,这样当函数完成时,它会“返回”到其他(可能是恶意的)代码,而不是原始的调用代码。

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

        4
  •  3
  •   joveha    14 年前

    Mac OS上的编译器已在 stack canary 这给了你中止陷阱。在编译器手册中搜索如何禁用它。

    对于GCC,此选项是 -fno-stack-protector .

    另一方面,1字节的溢出肯定不足以触发除编译器堆栈检查之外的任何操作。使用类似12字节的值:)