gpt4 book ai didi

c - 为什么这个分配在堆栈而不是堆上?

转载 作者:太空宇宙 更新时间:2023-11-04 06:17:36 24 4
gpt4 key购买 nike

编辑:我原来的问题不再准确,所以我重写了它。

所以我正在编写一个程序来用 C 语言演示堆喷射(我知道这很不寻常)。我正在使用 malloc 分配一个巨大的缓冲区 (100MB),但它分配到标记为映射而不是 [堆] 的段中,我不明白为什么。

我的代码:

int NOPSize = 960;
int ShellcodeSize = 64;
int PayloadSize = NOPSize + ShellcodeSize;
char Payload[PayloadSize];
char* HeapBuf = (char*)malloc(0x6400000); //104,857,600 (100MB)

for (int x = 0; x < PayloadSize; x++)
Payload[x] = (x <= NOPSize) ? '\x90' : '\x41';

for (int x = 0; x < 0x6400000; x++)
HeapBuf[x] = Payload[x % PayloadSize];

printf("%x\n", HeapBuf);
free(HeapBuf);

使用 GDB-PEDA 的 vmmap 输出取自调用 free 时设置的断点:

0x80000000 0x80001000 r-xp  /root/Documents/a.out
0x80001000 0x80002000 r--p /root/Documents/a.out
0x80002000 0x80003000 rw-p /root/Documents/a.out
0x80003000 0x80024000 rw-p [heap]
0xb19fd000 0xb7dfe000 rw-p mapped
0xb7dfe000 0xb7faf000 r-xp /lib/i386-linux-gnu/libc-2.24.so
0xb7faf000 0xb7fb1000 r--p /lib/i386-linux-gnu/libc-2.24.so
0xb7fb1000 0xb7fb2000 rw-p /lib/i386-linux-gnu/libc-2.24.so
0xb7fb2000 0xb7fb5000 rw-p mapped
0xb7fd4000 0xb7fd7000 rw-p mapped
0xb7fd7000 0xb7fd9000 r--p [vvar]
0xb7fd9000 0xb7fdb000 r-xp [vdso]
0xb7fdb000 0xb7ffd000 r-xp /lib/i386-linux-gnu/ld-2.24.so
0xb7ffe000 0xb7fff000 r--p /lib/i386-linux-gnu/ld-2.24.so
0xb7fff000 0xb8000000 rw-p /lib/i386-linux-gnu/ld-2.24.so
0xbffdf000 0xc0000000 rw-p [stack]

printf 输出位于顶部映射段中的 0xb19fd008

有趣的是,如果我删除对 printf 的调用,[heap] 段就会消失。所以我的问题是,为什么 [heap] 段的存在取决于对 printf 的调用,为什么打印的地址在映射段中而不是在 [堆] 段?谢谢。

最佳答案

HeapBuf 就像任何其他 intlongchar 一样驻留在堆栈中你的代码,因为指针本身只是一个数字。但是它指向的内存确实分配在堆上。

关于c - 为什么这个分配在堆栈而不是堆上?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42044976/

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