gpt4 book ai didi

c - 防止 gcc(或 clang)将参数复制到堆栈

转载 作者:行者123 更新时间:2023-11-30 20:26:08 25 4
gpt4 key购买 nike

我正在创建一个练习来演示缓冲区溢出的不同概念。我遇到了以下奇怪的问题 - 我无法获取参数地址。我有以下简单的功能:

void vuln(char *str) {
char buf[64];
strcpy(buf, str);
dump_stack((void **) buf, 32, (void **) &str);
}

dump_stack 定义为:void dump_stack(void **stack, size_t n, void **arg0)

当我使用 gcc 或 clang 编译并运行 x86 代码时,我看到了同样的问题:编译器为 str 创建一个堆栈变量,将参数复制到其中,并且 &str 指向此本地堆栈变量 而不是争论!

对 vuln 调用的反汇编如下所示:

mov     eax, [ebp+argv]
add eax, 4
mov eax, [eax]
mov [esp], eax
call vuln

vuln函数的反汇编如下:

public vuln
vuln proc near

src= dword ptr -5Ch
dest= byte ptr -4Ch
var_C= dword ptr -0Ch
arg_0= dword ptr 8

push ebp
mov ebp, esp
sub esp, 78h
mov eax, [ebp+arg_0]
mov [ebp+src], eax
mov eax, large gs:14h
mov [ebp+var_C], eax
xor eax, eax
mov eax, [ebp+src]
mov [esp+4], eax ; src
lea eax, [ebp+dest]
mov [esp], eax ; dest
call _strcpy

正如人们所看到的,该函数采用第一个参数并将其存储在局部变量中。所以我的 C 代码中无法获取堆栈上参数的地址。

我尝试了不同的优化设置,但无法将其编译为我期望的效果!我需要的只是一种获取第一个参数所在的堆栈地址的方法

最佳答案

嗯,我发现这个巧妙的功能是 GCC 堆栈保护的一部分,默认情况下是打开的。如果我使用此处的建议将其关闭 How to turn off gcc compiler optimization to enable buffer overflow - 我的问题已经解决了。

关于c - 防止 gcc(或 clang)将参数复制到堆栈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26766211/

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