Как реализуется атака на переполнение кучи?Linux

Ответить
Anonymous
 Как реализуется атака на переполнение кучи?

Сообщение Anonymous »

Я изучаю атаки на переполнение кучи, но столкнулся с проблемой.
Основываясь на знаниях, которые я нашел в Интернете, и моих собственных предположениях, я считаю, что атака на переполнение кучи включает в себя перезапись метаданных в куче, например: указатель на функцию для выполнения кода, который хочет запустить злоумышленник.
Однако, когда я использую 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Linux»