WWW2Exec - __malloc_hook & __free_hook
Reading time: 4 minutes
tip
Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Підтримайте HackTricks
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на github.
Malloc Hook
Як ви можете побачити на Офіційному сайті GNU, змінна __malloc_hook
є вказівником, що вказує на адресу функції, яка буде викликана щоразу, коли викликається malloc()
, збережену в секції даних бібліотеки libc. Тому, якщо ця адреса буде перезаписана, наприклад, One Gadget, і буде викликано malloc
, то буде викликано One Gadget.
Щоб викликати malloc, можна дочекатися, поки програма викличе його, або **викликавши printf("%10000$c")**, що виділяє занадто багато байтів, змушуючи
libc` викликати malloc для їх виділення в купі.
Більше інформації про One Gadget в:
warning
Зверніть увагу, що хуки вимкнені для GLIBC >= 2.34. Є інші техніки, які можна використовувати в сучасних версіях GLIBC. Дивіться: https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md.
Free Hook
Це було зловжито в одному з прикладів на сторінці, зловживаючи атакою швидкого біну після зловживання атакою неупорядкованого біну:
Можна знайти адресу __free_hook
, якщо бінарний файл має символи, використовуючи наступну команду:
gef➤ p &__free_hook
У пості ви знайдете покрокову інструкцію про те, як знайти адресу free hook без символів. У підсумку, у функції free:
gef➤ x/20i free
0xf75dedc0 : push ebx
0xf75dedc1 : call 0xf768f625
0xf75dedc6 : add ebx,0x14323a
0xf75dedcc : sub esp,0x8
0xf75dedcf : mov eax,DWORD PTR [ebx-0x98]
0xf75dedd5 : mov ecx,DWORD PTR [esp+0x10]
0xf75dedd9 : mov eax,DWORD PTR [eax]--- BREAK HERE
0xf75deddb : test eax,eax ;<
0xf75deddd : jne 0xf75dee50
У зазначеній точці зупинки в попередньому коді в $eax
буде знаходитися адреса free hook.
Тепер виконується fast bin attack:
- По-перше, виявлено, що можливо працювати з швидкими chunks розміром 200 у місці
__free_hook
: gef➤ p &__free_hook
$1 = (void (**)(void *, const void *)) 0x7ff1e9e607a8 <__free_hook> gef➤ x/60gx 0x7ff1e9e607a8 - 0x59 0x7ff1e9e6074f: 0x0000000000000000 0x0000000000000200 0x7ff1e9e6075f: 0x0000000000000000 0x0000000000000000 0x7ff1e9e6076f <list_all_lock+15>: 0x0000000000000000 0x0000000000000000 0x7ff1e9e6077f <_IO_stdfile_2_lock+15>: 0x0000000000000000 0x0000000000000000
- Якщо нам вдасться отримати швидкий chunk розміром 0x200 у цьому місці, буде можливим перезаписати вказівник функції, яка буде виконана
- Для цього створюється новий chunk розміром
0xfc
і злиту функцію викликають з цим вказівником двічі, таким чином ми отримуємо вказівник на звільнений chunk розміром0xfc*2 = 0x1f8
у швидкому біні. - Потім викликається функція редагування в цьому chunk, щоб змінити адресу
fd
цього швидкого біна, щоб вказувати на попередню функцію__free_hook
. - Потім створюється chunk розміром
0x1f8
, щоб отримати з швидкого біна попередній непотрібний chunk, тому створюється ще один chunk розміром0x1f8
, щоб отримати швидкий chunk у__free_hook
, який перезаписується адресою функціїsystem
. - І нарешті, звільняється chunk, що містить рядок
/bin/sh\x00
, викликаючи функцію видалення, що викликає функцію__free_hook
, яка вказує на system з/bin/sh\x00
як параметром.
References
- https://ir0nstone.gitbook.io/notes/types/stack/one-gadgets-and-malloc-hook
- https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md.
tip
Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Підтримайте HackTricks
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на github.