gpt4 book ai didi

c - C 中的缓冲区溢出

转载 作者:太空狗 更新时间:2023-10-29 16:29:48 26 4
gpt4 key购买 nike

我正在尝试在 Mac OS X 10.6 64 位上使用 C 编写一个简单的缓冲区溢出。这是概念:

void function() {
char buffer[64];
buffer[offset] += 7; // i'm not sure how large offset needs to be, or if
// 7 is correct.
}

int main() {

int x = 0;
function();
x += 1;
printf("%d\n", x); // the idea is to modify the return address so that
// the x += 1 expression is not executed and 0 gets
// printed

return 0;
}

这是 main 的汇编程序转储的一部分:

...
0x0000000100000ebe <main+30>: callq 0x100000e30 <function>
0x0000000100000ec3 <main+35>: movl $0x1,-0x8(%rbp)
0x0000000100000eca <main+42>: mov -0x8(%rbp),%esi
0x0000000100000ecd <main+45>: xor %al,%al
0x0000000100000ecf <main+47>: lea 0x56(%rip),%rdi # 0x100000f2c
0x0000000100000ed6 <main+54>: callq 0x100000ef4 <dyld_stub_printf>
...

我想跳过 movl 指令,这意味着我需要将返回地址递增 42 - 35 = 7(正确吗?)。现在我需要知道返回地址的存储位置,以便计算正确的偏移量。

我已尝试手动搜索正确的值,但要么打印出 1,要么我得到 abort trap – 是否可能正在进行某种缓冲区溢出保护?


在我的机器上使用 88 的偏移量。我使用 Nemo 的方法找出返回地址。

最佳答案

这个32 位 示例说明了如何解决这个问题,请参阅下面的 64 位示例:

#include <stdio.h>

void function() {
char buffer[64];
char *p;
asm("lea 4(%%ebp),%0" : "=r" (p)); // loads address of return address
printf("%d\n", p - buffer); // computes offset
buffer[p - buffer] += 9; // 9 from disassembling main
}

int main() {
volatile int x = 7;
function();
x++;
printf("x = %d\n", x); // prints 7, not 8
}

在我的系统上,偏移量是 76。这是缓冲区的 64 字节(记住,堆栈会向下增长,因此缓冲区的开始距离返回地址很远)加上中间的任何其他碎屑。

显然,如果您正在攻击现有程序,您不能指望它为您计算答案,但我认为这说明了原理。

(此外,我们很幸运 +9 不会执行到另一个字节。否则单字节递增将不会按照我们的预期设置返回地址。如果你运气不好,这个例子可能会中断返回地址在main)

我以某种方式忽略了原始问题的 64 位。 x86-64 的等效项是 8(%rbp),因为指针的长度为 8 个字节。在那种情况下,我的测试构建恰好产生了 104 的偏移量。在上面的代码中,使用双 %% 替换 8(%%rbp) 来获得单个 % 在输出程序集中。这在 this ABI document 中有描述。 .搜索 8(%rbp)

评论中有人提示说 4(%ebp)76 或任何其他任意数字一样神奇。事实上,寄存器 %ebp(也称为“帧指针”)的含义及其与堆栈上返回地址位置的关系是标准化的。我很快用谷歌搜索的一个例子是 here .那篇文章使用了术语“基本指针”。如果您想在其他架构上利用缓冲区溢出,则需要对该 CPU 的调用约定有类似的详细了解。

关于c - C 中的缓冲区溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6220212/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com