Основываясь на знаниях, которые я нашел в Интернете, и моих собственных предположениях, я считаю, что атака на переполнение кучи включает в себя перезапись метаданных в куче, например: указатель на функцию для выполнения кода, который хочет запустить злоумышленник.
Однако, когда я использую GDB для проверки памяти, выделенной malloc, я обнаруживаю, что заголовок кучи содержит только размер, выделенный malloc, а нижний колонтитул содержит только оставшийся доступный размер.
Почему???
Вот процесс, которому я следовал, чтобы проверить память:
источник c:< /p>
Код: Выделить всё
#include
#include
#include
int main(int argc, char const *argv[])
{
char *buf,*buf2;
buf=(char*)malloc(1024);
buf2=(char*)malloc(1024*2);
free(buf2);
strcpy(buf,argv[1]);
printf("Done.");
return 0;
}
- компилировать:
Код: Выделить всё
gcc heap2.c -o heap2 -g- Запустить GDB:
Код: Выделить всё
┌──(kali㉿kali)-[~/Desktop/book_c]
└─$ gdb heap2
GNU gdb (Debian 15.2-1+b1) 15.2
Copyright (C) 2024 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Type "show copying" and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
.
Find the GDB manual and other documentation resources online at:
.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from heap2...
(gdb)
- Установка точки останова в main:
Код: Выделить всё
(gdb) b main
Breakpoint 1 at 0x1178: file heap2.c, line 8.
(gdb)
- запустить:
Код: Выделить всё
(gdb) run AAAAAAAA
Starting program: /home/kali/Desktop/book_c/heap2 AAAAAAAA
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
Breakpoint 1, main (argc=2, argv=0x7fffffffdd88) at heap2.c:8
8 buf=(char*)malloc(1024);
(gdb)
- Выполнение команды n, позволяющей malloc выделять память
Код: Выделить всё
(gdb) n
9 buf2=(char*)malloc(1024*2);
(gdb)
- Просмотр памяти
Код: Выделить всё
(gdb) x/32wx buf-32
0x555555559280: 0x00000000 0x00000000 0x00000000 0x00000000
0x555555559290: 0x00000000 0x00000000 0x00000411 0x00000000
0x5555555592a0: 0x00000000 0x00000000 0x00000000 0x00000000
0x5555555592b0: 0x00000000 0x00000000 0x00000000 0x00000000
0x5555555592c0: 0x00000000 0x00000000 0x00000000 0x00000000
0x5555555592d0: 0x00000000 0x00000000 0x00000000 0x00000000
0x5555555592e0: 0x00000000 0x00000000 0x00000000 0x00000000
0x5555555592f0: 0x00000000 0x00000000 0x00000000 0x00000000
(gdb)
Я предполагаю, что метаданные могут быть в конце, поэтому я проверил память в конце выделенного блока.
Код: Выделить всё
(gdb) x/32wx buf-32+0x00000411-1
0x555555559690: 0x00000000 0x00000000 0x00000000 0x00000000
0x5555555596a0: 0x00000000 0x00000000 0x00020961 0x00000000
0x5555555596b0: 0x00000000 0x00000000 0x00000000 0x00000000
0x5555555596c0: 0x00000000 0x00000000 0x00000000 0x00000000
0x5555555596d0: 0x00000000 0x00000000 0x00000000 0x00000000
0x5555555596e0: 0x00000000 0x00000000 0x00000000 0x00000000
0x5555555596f0: 0x00000000 0x00000000 0x00000000 0x00000000
0x555555559700: 0x00000000 0x00000000 0x00000000 0x00000000
(gdb)
Почему????
Итак, я догадался, что первый выделенный блок может быть особенным.
Я продолжил проверять следующий выделенный блок.
Выполните команду n
Код: Выделить всё
(gdb) n
11 free(buf2);
(gdb)
Код: Выделить всё
(gdb) x/32wx buf-32+0x00000411-1
0x555555559690: 0x00000000 0x00000000 0x00000000 0x00000000
0x5555555596a0: 0x00000000 0x00000000 0x00000811 0x00000000
0x5555555596b0: 0x00000000 0x00000000 0x00000000 0x00000000
0x5555555596c0: 0x00000000 0x00000000 0x00000000 0x00000000
0x5555555596d0: 0x00000000 0x00000000 0x00000000 0x00000000
0x5555555596e0: 0x00000000 0x00000000 0x00000000 0x00000000
0x5555555596f0: 0x00000000 0x00000000 0x00000000 0x00000000
0x555555559700: 0x00000000 0x00000000 0x00000000 0x00000000
(gdb) x/32wx buf2-32
0x555555559690: 0x00000000 0x00000000 0x00000000 0x00000000
0x5555555596a0: 0x00000000 0x00000000 0x00000811 0x00000000
0x5555555596b0: 0x00000000 0x00000000 0x00000000 0x00000000
0x5555555596c0: 0x00000000 0x00000000 0x00000000 0x00000000
0x5555555596d0: 0x00000000 0x00000000 0x00000000 0x00000000
0x5555555596e0: 0x00000000 0x00000000 0x00000000 0x00000000
0x5555555596f0: 0x00000000 0x00000000 0x00000000 0x00000000
0x555555559700: 0x00000000 0x00000000 0x00000000 0x00000000
(gdb)
Почему????
Итак, я сделал еще одно предположение и выполнил бесплатно (buf2). Надеюсь, это даст мне некоторые подсказки.
Код: Выделить всё
(gdb) n
12 strcpy(buf,argv[1]);
(gdb)
Код: Выделить всё
(gdb) x/32wx buf2-32
0x555555559690: 0x00000000 0x00000000 0x00000000 0x00000000
0x5555555596a0: 0x00000000 0x00000000 0x00020961 0x00000000
0x5555555596b0: 0x00000000 0x00000000 0x00000000 0x00000000
0x5555555596c0: 0x00000000 0x00000000 0x00000000 0x00000000
0x5555555596d0: 0x00000000 0x00000000 0x00000000 0x00000000
0x5555555596e0: 0x00000000 0x00000000 0x00000000 0x00000000
0x5555555596f0: 0x00000000 0x00000000 0x00000000 0x00000000
0x555555559700: 0x00000000 0x00000000 0x00000000 0x00000000
(gdb)
Код: Выделить всё
(gdb) x/32wx buf2-32+0x00000811-1
0x555555559ea0: 0x00000000 0x00000000 0x00000000 0x00000000
0x555555559eb0: 0x00000000 0x00000000 0x00020151 0x00000000
0x555555559ec0: 0x00000000 0x00000000 0x00000000 0x00000000
0x555555559ed0: 0x00000000 0x00000000 0x00000000 0x00000000
0x555555559ee0: 0x00000000 0x00000000 0x00000000 0x00000000
0x555555559ef0: 0x00000000 0x00000000 0x00000000 0x00000000
0x555555559f00: 0x00000000 0x00000000 0x00000000 0x00000000
0x555555559f10: 0x00000000 0x00000000 0x00000000 0x00000000
(gdb)
Это потому, что у GDB есть какие-то ограничения?
Или есть другая причина?
Понятия не имею....
Это потому, что у GDB есть какие-то ограничения?
Или есть другая причина?
Понятия не имею....
Это потому, что у GDB есть какие-то ограничения? p>
Конечно,
самое главное — как реализуются атаки на переполнение кучи?
Как мне воспроизвести эту атаку?
Подробнее здесь: https://stackoverflow.com/questions/793 ... mplemented
Мобильная версия