Редактировать: Мой оригинальный вопрос больше не точен, поэтому я переписал его.Почему это выделяется в стеке вместо кучи?
Так что я пишу программу, чтобы продемонстрировать кучу спрея в C (что я знаю необычно). Я выделяю огромный буфер (100 МБ) с помощью malloc, но он выделяет сегмент с отображением, а не [кучу], и я не могу понять, почему.
Мой код:
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);
Выход VMMap с помощью GDB-ПЕДА взяты из точки останова, установленной на вызове 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
, который находится в верхнем сопоставляются сегменте.
Интересно, что сегмент [heap]
исчезает, если я удалю звонок до printf
. Итак, мои вопросы, почему присутствие сегмента [heap]
зависит от вызова printf
и почему это печатный адрес в отображенном сегменте, а не в сегменте [heap]
? Благодарю.
Что карты памяти выглядят как * перед * свободным (HeapBuf) '? –
Это до освобождения. Он берется с точки останова прямо перед выполнением 'free'. – Cryptomancer
Кажется, что ваш рабочий стол работает как «root». Не делай этого. – zwol