Basic Stack Binary Exploitation Methodology
Основна інформація про ELF
Перш ніж почати експлуатувати що-небудь, корисно розуміти частину структури 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 (у випадку, якщо ви можете викликати цей системний виклик) для керування багатьма регістрами
Через Записати що де до виконання ви можете зловживати іншими вразливостями (не bof), щоб викликати функцію
win
.Перенаправлення вказівників: У випадку, коли стек містить вказівники на функцію, яка буде викликана або на рядок, який буде використаний цікавою функцією (system або printf), можливо перезаписати цю адресу.
Неініціалізовані змінні: Ніколи не знаєш.
Мета: RCE
Через shellcode, якщо вимкнено nx або змішування shellcode з ROP:
(Stack) Shellcode: Це корисно для зберігання shellcode у стеку перед або після перезапису вказівника повернення, а потім перейти до нього, щоб виконати його:
У будь-якому випадку, якщо є canary, у звичайному bof вам потрібно обійти (витік) його
З ASLR вам потрібно використовувати техніки, такі як ret2esp/ret2reg, щоб перейти до нього
Це поєднає shellcode з ланцюжком ROP.
Через системні виклики
Ret2syscall: Корисно для виклику
execve
для запуску довільних команд. Вам потрібно знайти гаджети для виклику конкретного системного виклику з параметрами.SROP може бути корисним для підготовки ret2execve
Через libc
Ret2lib: Корисно для виклику функції з бібліотеки (зазвичай з
libc
) якsystem
з підготовленими аргументами (наприклад,'/bin/sh'
). Вам потрібно, щоб бінарний файл завантажив бібліотеку з функцією, яку ви хочете викликати (зазвичай libc).Якщо статично скомпільовано і немає PIE, адреса
system
та/bin/sh
не зміниться, тому можна використовувати їх статично.Без ASLR і знання версії libc, адреса
system
та/bin/sh
не зміниться, тому можна використовувати їх статично.Використовуйте
ret2dlresolve
для вирішення адресиsystem
та виклику їїОбійдіть ASLR та розрахуйте адресу
system
та'/bin/sh'
в пам'яті.Обійти PIE
Знайти використану версію libc (витік кількох адрес функцій)
Перевірте попередні сценарії з ASLR, щоб продовжити.
Через EBP/RBP
Stack Pivoting / EBP2Ret / EBP Chaining: Керування ESP для керування RET через збережений EBP в стеку.
Корисно для off-by-one переповнень стеку
Корисно як альтернативний спосіб закінчення керування EIP, використовуючи EIP для побудови навантаження в пам'яті, а потім переходу до нього через EBP
Різне
Перенаправлення вказівників: У випадку, коли стек містить вказівники на функцію, яка буде викликана або на рядок, який буде використаний цікавою функцією (system або printf), можливо перезаписати цю адресу.
Незініціалізовані змінні: Ніколи не знаєте
Last updated