Basic Stack Binary Exploitation Methodology
Last updated
Last updated
Вивчайте та практикуйте хакінг AWS: Навчання AWS Red Team Expert (ARTE) від HackTricks Вивчайте та практикуйте хакінг GCP: Навчання GCP Red Team Expert (GRTE) від HackTricks
Перш ніж почати експлуатувати що-небудь, корисно розуміти частину структури ELF-бінарного файлу:
https://github.com/HackTricks-wiki/hacktricks/blob/ua/binary-exploitation/basic-stack-binary-exploitation-methodology/elf-tricks.mdЗ такою кількістю технік корисно мати схему, коли кожна техніка буде корисною. Зверніть увагу, що одні й ті ж захисти впливатимуть на різні техніки. Ви можете знайти способи обійти захисти в кожному розділі захисту, але не в цій методології.
Існують різні способи керування потоком програми:
Переповнення стека перезаписуючи вказівник повернення зі стеку або EBP -> ESP -> EIP.
Можливо, потрібно використовувати Переповнення цілочисельних значень, щоб викликати переповнення.
Або через Довільні записи + Записати що де до виконання
Рядки формату: Зловживання printf
для запису довільного вмісту за довільними адресами.
Індексування масивів: Зловживання погано спроектованим індексуванням для можливості керування деякими масивами та отримання довільного запису.
Можливо, потрібно використовувати Переповнення цілочисельних значень, щоб викликати переповнення
bof до WWW через ROP: Зловживання переповненням буфера для побудови ROP та можливості отримати WWW.
Техніки Записати що де до виконання можна знайти в:
https://github.com/HackTricks-wiki/hacktricks/blob/ua/binary-exploitation/arbitrary-write-2-exec/README.mdЩось, на що варто звернути увагу, це те, що зазвичай лише одна експлуатація вразливості може бути недостатньою, щоб виконати успішну експлойтацію, особливо якщо деякі захисти потрібно обійти. Тому цікаво обговорити деякі варіанти зробити одну вразливість експлойтованою кілька разів в одному виконанні бінарного файлу:
Записати в ланцюжок ROP адресу функції main
або адресу, де відбувається вразливість.
Керуючи правильним ланцюжком ROP, ви можете виконати всі дії в цьому ланцюжку
Записати адресу exit
в GOT (або будь-яку іншу функцію, яку використовує бінарний файл перед завершенням) адресу, щоб повернутися назад до вразливості
Як пояснено в .fini_array, зберігайте тут 2 функції, одну для виклику вразливості знову та іншу для виклику __libc_csu_fini
, яка знову викличе функцію з .fini_array
.
ret2win: Є функція в коді, яку потрібно викликати (можливо з певними параметрами) для отримання прапорця.
У bof з PIE, вам потрібно обійти його
У bof з canary, вам потрібно обійти його
Якщо вам потрібно встановити кілька параметрів для правильного виклику функції ret2win, ви можете використовувати:
Ланцюжок ROP якщо є достатньо гаджетів для підготовки всіх параметрів
SROP (у випадку, якщо ви можете викликати цей системний виклик) для керування багатьма регістрами
Через Записати що де до виконання ви можете зловживати іншими вразливостями (не bof), щоб викликати функцію win
.
Перенаправлення вказівників: У випадку, коли стек містить вказівники на функцію, яка буде викликана або на рядок, який буде використаний цікавою функцією (system або printf), можливо перезаписати цю адресу.
Неініціалізовані змінні: Ніколи не знаєш.
(Stack) Shellcode: Це корисно для зберігання shellcode у стеку перед або після перезапису вказівника повернення, а потім перейти до нього, щоб виконати його:
У будь-якому випадку, якщо є canary, у звичайному bof вам потрібно обійти (витік) його
З ASLR вам потрібно використовувати техніки, такі як ret2esp/ret2reg, щоб перейти до нього
Це поєднає shellcode з ланцюжком ROP.
Ret2syscall: Корисно для виклику execve
для запуску довільних команд. Вам потрібно знайти гаджети для виклику конкретного системного виклику з параметрами.
SROP може бути корисним для підготовки ret2execve
Ret2lib: Корисно для виклику функції з бібліотеки (зазвичай з libc
) як system
з підготовленими аргументами (наприклад, '/bin/sh'
). Вам потрібно, щоб бінарний файл завантажив бібліотеку з функцією, яку ви хочете викликати (зазвичай libc).
Якщо статично скомпільовано і немає PIE, адреса system
та /bin/sh
не зміниться, тому можна використовувати їх статично.
Без ASLR і знання версії libc, адреса system
та /bin/sh
не зміниться, тому можна використовувати їх статично.
Використовуйте ret2dlresolve
для вирішення адреси system
та виклику її
Обійдіть ASLR та розрахуйте адресу system
та '/bin/sh'
в пам'яті.
Обійти PIE
Знайти використану версію libc (витік кількох адрес функцій)
Перевірте попередні сценарії з ASLR, щоб продовжити.
Stack Pivoting / EBP2Ret / EBP Chaining: Керування ESP для керування RET через збережений EBP в стеку.
Корисно для off-by-one переповнень стеку
Корисно як альтернативний спосіб закінчення керування EIP, використовуючи EIP для побудови навантаження в пам'яті, а потім переходу до нього через EBP
Перенаправлення вказівників: У випадку, коли стек містить вказівники на функцію, яка буде викликана або на рядок, який буде використаний цікавою функцією (system або printf), можливо перезаписати цю адресу.
Незініціалізовані змінні: Ніколи не знаєте