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