WWW2Exec - __malloc_hook & __free_hook
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Як ви можете Офіційний сайт GNU, змінна __malloc_hook
є вказівником, що вказує на адресу функції, яка буде викликана щоразу, коли викликається malloc()
, збережену в секції даних бібліотеки libc. Тому, якщо ця адреса буде перезаписана, наприклад, One Gadget, і буде викликано malloc
, буде викликано One Gadget.
Щоб викликати malloc, можна дочекатися, поки програма викличе його, або **викликавши printf("%10000$c")**, що виділяє занадто багато байтів, змушуючи
libc` викликати malloc для їх виділення в купі.
Більше інформації про One Gadget в:
Зверніть увагу, що хуки вимкнені для GLIBC >= 2.34. Є інші техніки, які можна використовувати в сучасних версіях GLIBC. Дивіться: https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md.
Це було зловжито в одному з прикладів на сторінці, зловживаючи атакою швидкого біну після зловживання атакою незасортованого біну:
Можна знайти адресу __free_hook
, якщо бінарний файл має символи, за допомогою наступної команди:
У пості ви знайдете покрокову інструкцію про те, як знайти адресу free hook без символів. У підсумку, у функції free:
У вказаній точці зупинки в попередньому коді в $eax
буде знаходитися адреса free hook.
Тепер виконується атака на швидкі бінари:
По-перше, виявлено, що можливо працювати з швидкими частинами розміру 200 в місці __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
Якщо нам вдасться отримати швидку частину розміру 0x200 у цьому місці, буде можливим перезаписати вказівник функції, яка буде виконана
Для цього створюється нова частина розміру 0xfc
і об'єднана функція викликається з цим вказівником двічі, таким чином ми отримуємо вказівник на звільнену частину розміру 0xfc*2 = 0x1f8
у швидкому бінарі.
Потім викликається функція редагування в цій частині, щоб змінити адресу fd
цього швидкого бінару, щоб вказати на попередню функцію __free_hook
.
Потім створюється частина розміру 0x1f8
, щоб отримати з швидкого бінару попередню непотрібну частину, тому створюється ще одна частина розміру 0x1f8
, щоб отримати швидку частину в __free_hook
, яка перезаписується адресою функції system
.
І нарешті, частина, що містить рядок /bin/sh\x00
, звільняється, викликаючи функцію видалення, що викликає функцію __free_hook
, яка вказує на system з /bin/sh\x00
як параметром.
Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)