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

Malloc Hook

Як ви можете побачити на Офіційному сайті GNU, змінна __malloc_hook є вказівником, що вказує на адресу функції, яка буде викликана щоразу, коли викликається malloc(), збережену в секції даних бібліотеки libc. Тому, якщо ця адреса буде перезаписана, наприклад, One Gadget, і буде викликано malloc, то буде викликано One Gadget.

Щоб викликати malloc, можна дочекатися, поки програма викличе його, або **викликавши printf("%10000$c")**, що виділяє занадто багато байтів, змушуючи libc` викликати malloc для їх виділення в купі.

Більше інформації про One Gadget в:

One Gadget

warning

Зверніть увагу, що хуки вимкнені для GLIBC >= 2.34. Є інші техніки, які можна використовувати в сучасних версіях GLIBC. Дивіться: https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md.

Free Hook

Це було зловжито в одному з прикладів на сторінці, зловживаючи атакою швидкого біну після зловживання атакою неупорядкованого біну:

Unsorted Bin Attack

Можна знайти адресу __free_hook, якщо бінарний файл має символи, використовуючи наступну команду:

bash
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

tip

Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Підтримайте HackTricks