在雪豹中创建缓冲区溢出

use*_*275 9 c security buffer-overflow osx-snow-leopard fortify-source

作为大学计算机安全课程的一部分,我很快就要学习缓冲区溢出以及如何将它们用作漏洞.我正在尝试使用以下代码执行一些简单的缓冲区溢出:

#include <stdio.h>
#include <string.h>

int main(int argc, char *argv[])
{
    char buffer_one[4], buffer_two[16];

    strcpy(buffer_one, "one");
    strcpy(buffer_two, "two");

    strcpy(buffer_one, argv[1]);

    printf("buffer_two is at %p and contains \'%s\'\n", buffer_two, buffer_two);
    printf("buffer_one is at %p and contains \'%s\'\n", buffer_one, buffer_one);
}
Run Code Online (Sandbox Code Playgroud)

如果我运行,我可以使用null终止符覆盖buffer_one的内容

$./overflow 1234567890123456
 buffer_two is at 0x7fff5fbff8d0 and contains '1234567890123456'
 buffer_one is at 0x7fff5fbff8e0 and contains ''
Run Code Online (Sandbox Code Playgroud)

但是如果我发送超过16个字符作为参数,程序将发送Abort陷阱.我认为这是Snow Leopard上的某种缓冲保护(可能是ASLR?).如果if的大小为buffer_two <16,那么adresse仍然是16位

我正在运行gcc -o overflow overflow.c -fno-stack-protector以删除堆栈保护

除了安装运行linux dist的VM之外,有没有解决这个问题的方法?

Zan*_*ynx 1

如果您正在学习漏洞利用,那么您需要真正深入研究细节。

来吧,阅读机器代码!您也许能够找到如何绕过 Snow Leopard 使用的任何检查方法的溢出。

问题可能也比这更简单。没有任何规则要求编译器必须将buffer_onebuffer_two以任何特定顺序放入堆栈中,甚至根本不将它们放入堆栈中。请注意,它buffer_one实际上适合寄存器。

当然,这里的情况并非如此,但我看到 buffer_two 放置在 buffer_one之前。这意味着将溢出写入buffer_one将永远不会写入buffer_two。我无法解释为什么它最终包含'',但在内存中f8d0肯定是在之前。 f8e0