Basic Stack Binary Exploitation Methodology

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

Основна інформація про 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 та canary, вам просто потрібно записати адресу у вказівник повернення, збережений у стеку.

  • У bof з PIE, вам потрібно обійти його

  • У bof з canary, вам потрібно обійти його

  • Якщо вам потрібно встановити кілька параметрів для правильного виклику функції ret2win, ви можете використовувати:

  • Ланцюжок ROP якщо є достатньо гаджетів для підготовки всіх параметрів

  • SROP (у випадку, якщо ви можете викликати цей системний виклик) для керування багатьма регістрами

  • Гаджети з ret2csu та ret2vdso для керування декількома регістрами

  • Через Записати що де до виконання ви можете зловживати іншими вразливостями (не bof), щоб викликати функцію win.

  • Перенаправлення вказівників: У випадку, коли стек містить вказівники на функцію, яка буде викликана або на рядок, який буде використаний цікавою функцією (system або printf), можливо перезаписати цю адресу.

  • ASLR або PIE можуть вплинути на адреси.

  • Неініціалізовані змінні: Ніколи не знаєш.

Мета: RCE

Через shellcode, якщо вимкнено nx або змішування shellcode з ROP:

  • (Stack) Shellcode: Це корисно для зберігання shellcode у стеку перед або після перезапису вказівника повернення, а потім перейти до нього, щоб виконати його:

  • У будь-якому випадку, якщо є canary, у звичайному bof вам потрібно обійти (витік) його

  • Без ASLR та nx можна перейти до адреси стеку, оскільки вона ніколи не змінюється

  • З ASLR вам потрібно використовувати техніки, такі як ret2esp/ret2reg, щоб перейти до нього

  • З nx, вам потрібно використовувати деякі ROP для виклику memprotect та зробити деяку сторінку rwx, щоб потім зберегти shellcode там (наприклад, викликати read) і потім перейти туди.

  • Це поєднає shellcode з ланцюжком ROP.

Через системні виклики

  • Ret2syscall: Корисно для виклику execve для запуску довільних команд. Вам потрібно знайти гаджети для виклику конкретного системного виклику з параметрами.

  • Якщо ввімкнено ASLR або PIE, вам потрібно перемогти їх, щоб використовувати ROP гаджети з бінарного файлу або бібліотек.

  • SROP може бути корисним для підготовки ret2execve

  • Гаджети з ret2csu та ret2vdso для керування кількома регістрами

Через libc

  • Ret2lib: Корисно для виклику функції з бібліотеки (зазвичай з libc) як system з підготовленими аргументами (наприклад, '/bin/sh'). Вам потрібно, щоб бінарний файл завантажив бібліотеку з функцією, яку ви хочете викликати (зазвичай libc).

  • Якщо статично скомпільовано і немає PIE, адреса system та /bin/sh не зміниться, тому можна використовувати їх статично.

  • Без ASLR і знання версії libc, адреса system та /bin/sh не зміниться, тому можна використовувати їх статично.

  • З ASLR але без PIE, знанням libc та з бінарним файлом, який використовує функцію system, можливо ret на адресу системи в GOT з адресою '/bin/sh' в параметрі (вам потрібно це з'ясувати).

  • З ASLR але без PIE, знанням libc та без використання бінарного файлу функцією system:

  • Використовуйте ret2dlresolve для вирішення адреси system та виклику її

  • Обійдіть ASLR та розрахуйте адресу system та '/bin/sh' в пам'яті.

  • З ASLR та PIE і без знання версії libc: Вам потрібно:

  • Обійти PIE

  • Знайти використану версію libc (витік кількох адрес функцій)

  • Перевірте попередні сценарії з ASLR, щоб продовжити.

Через EBP/RBP

  • Stack Pivoting / EBP2Ret / EBP Chaining: Керування ESP для керування RET через збережений EBP в стеку.

  • Корисно для off-by-one переповнень стеку

  • Корисно як альтернативний спосіб закінчення керування EIP, використовуючи EIP для побудови навантаження в пам'яті, а потім переходу до нього через EBP

Різне

Last updated