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之外,有没有解决这个问题的方法?
如果您正在学习漏洞利用,那么您需要真正深入研究细节。
来吧,阅读机器代码!您也许能够找到如何绕过 Snow Leopard 使用的任何检查方法的溢出。
问题可能也比这更简单。没有任何规则要求编译器必须将buffer_one和buffer_two以任何特定顺序放入堆栈中,甚至根本不将它们放入堆栈中。请注意,它buffer_one实际上适合寄存器。
当然,这里的情况并非如此,但我看到 buffer_two 放置在 buffer_one之前。这意味着将溢出写入buffer_one将永远不会写入buffer_two。我无法解释为什么它最终包含'',但在内存中f8d0肯定是在之前。 f8e0
| 归档时间: |
|
| 查看次数: |
1084 次 |
| 最近记录: |