编辑:我原来的问题不再准确,所以我重写了它。为什么这个分配堆栈而不是堆?
因此,我正在编写一个程序来演示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
的调用,为什么映射段中的打印地址而不是[heap]
段?谢谢。
在free(HeapBuf)之前,内存映射看起来像什么样? –
这是免费的。它是在'free'执行之前从断点取得的。 – Cryptomancer
您似乎正在以“root”身份运行桌面。不要这样做。 – zwol