Basic Stack Binary Exploitation Methodology
Last updated
Last updated
Вивчайте та практикуйте Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE) Вивчайте та практикуйте Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Перед початком експлуатації чогось цікаво зрозуміти частину структури ELF бінарника:
З такою кількістю технік добре мати схему, коли кожна техніка буде корисною. Зверніть увагу, що ті ж самі захисти вплинуть на різні техніки. Ви можете знайти способи обійти захисти в кожному розділі захисту, але не в цій методології.
Є різні способи, якими ви можете контролювати потік програми:
Переповнення Стеку переписуючи вказівник повернення зі стека або EBP -> ESP -> EIP.
Можливо, потрібно зловживати Цілочисельними Переповненнями, щоб викликати переповнення.
Або через Довільні Записи + Записати Що Де до Виконання.
Форматні рядки: Зловживати printf
, щоб записати довільний вміст у довільні адреси.
Індексація Масивів: Зловживати погано спроектованою індексацією, щоб мати можливість контролювати деякі масиви та отримати довільний запис.
Можливо, потрібно зловживати Цілочисельними Переповненнями, щоб викликати переповнення.
bof до WWW через ROP: Зловживати переповненням буфера, щоб побудувати ROP і мати можливість отримати WWW.
Ви можете знайти техніки Записати Що Де до Виконання в:
Щось, що слід врахувати, це те, що зазвичай лише одна експлуатація вразливості може бути недостатньою для виконання успішної експлуатації, особливо деякі захисти потрібно обійти. Тому цікаво обговорити деякі варіанти, щоб зробити одну вразливість експлуатованою кілька разів в одному виконанні бінарника:
Записати в ROP ланцюг адресу main
функції або адресу, де відбувається вразливість.
Контролюючи правильний ROP ланцюг, ви можете виконати всі дії в цьому ланцюгу.
Записати в exit
адресу в GOT (або будь-яку іншу функцію, що використовується бінарником перед завершенням) адресу, щоб повернутися до вразливості.
Як пояснено в .fini_array, зберігайте тут 2 функції, одну для повторного виклику вразливості та іншу для виклику __libc_csu_fini
, яка знову викликатиме функцію з .fini_array
.
ret2win: Є функція в коді, яку потрібно викликати (можливо, з деякими специфічними параметрами), щоб отримати прапор.
У bof з PIE, вам потрібно буде обійти його.
У bof з canary, вам потрібно буде обійти його.
Якщо вам потрібно встановити кілька параметрів для правильного виклику функції ret2win, ви можете використовувати:
ROP ланцюг, якщо є достатньо гаджетів для підготовки всіх параметрів.
SROP (якщо ви можете викликати цей системний виклик) для контролю багатьох регістрів.
Через Write What Where ви могли б зловживати іншими вразливостями (не 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, щоб продовжити.
Поворот Стеку / EBP2Ret / EBP Ланцюгування: Контролюйте ESP, щоб контролювати RET через збережений EBP у стеці.
Корисно для off-by-one переповнень стека.
Корисно як альтернативний спосіб контролювати EIP, зловживаючи EIP для побудови корисного навантаження в пам'яті, а потім переходячи до нього через EBP.
Перенаправлення Вказівників: У разі, якщо стек містить вказівники на функцію, яка буде викликана, або на рядок, який буде використаний цікавою функцією (system або printf), можливо, переписати цю адресу.
Невизначені змінні: Ви ніколи не знаєте.
Вивчайте та практикуйте Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE) Вивчайте та практикуйте Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)