gpt4 book ai didi

c - C 中自引发的缓冲区溢出

转载 作者:行者123 更新时间:2023-11-30 19:01:37 25 4
gpt4 key购买 nike


我想知道是否可以以编程方式生成缓冲区溢出,我的意思是,无需任何用户输入。

我一直在尝试使用 memcpy 函数导致缓冲区溢出,将缓冲区的内容复制到另一个较小的缓冲区中。现在,段错误仅在源缓冲区初始化时才会触发,如下所示:

char * overflow = "\x40\40\x40...";

或者:

char * overflow = {"\x40\40\x40..."};

如果我将此缓冲区复制到另一个较小大小的变量中,它会成功溢出。但是这种声明使源缓冲区只读,所以我想知道是否可以动态生成缓冲区的内容,例如,程序可以在运行时生成一个缓冲区,可以将指令指针重定向到某个缓冲区内存地址也在运行时计算。所以我尝试将其更改为:

char overflow[] = {"\x40\x40\x40\x40..."}

但是,由于某种我不太明白的原因,无论缓冲区有多长,此声明都不会触发段错误。

为什么只读常量字符串可以触发缓冲区溢出,而变量却不能?

这是我正在使用的代码:

int WINAPI mainCRTStartup(){
char buffer[100];
char * overflow = { "\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40"
"\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40"
"\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40"
"\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40"
"\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40"
"\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x64\x63\x62\x61\x40\x40\x40\x40"
"\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40"
"\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40"
"\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40"
"\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40"
};

printf("Ready:\n");
// 117
memcpy(buffer, overflow, 117);
//strcpy(buffer, overflow);
printf("String: %s\n", buffer);
return 0;
}

我编译它:

i686-w64-mingw32-gcc -O2 -s -DNDEBUG -static \
-nostdlib -m32 \
-o deleteme.exe deleteme.c \
-lkernel32 -lmsvcrt -fno-stack-protector

此代码成功将指令指针设置为地址0x61626364。
我知道这可能没有任何实际用途,我只是对这种行为感到好奇。

最佳答案

当您使用char Overflow[]时,overflow数组的内存与buffer位于同一堆栈帧中,并且它可能是位于它之后。因此,当超出 buffer 的范围时,您将写回 overflow,而不是覆盖堆栈帧中的返回地址字段。

将其设为static char Overflow[],或将overflow设为全局变量。那么它就不会在堆栈框架中。您也可以尝试更改两个变量声明的顺序。

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

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