# Основна методологія експлуатації бінарних файлів {{#include ../../banners/hacktricks-training.md}} ## Основна інформація про ELF Перед початком експлуатації чогось цікаво зрозуміти частину структури **ELF бінарного файлу**: {{#ref}} elf-tricks.md {{#endref}} ## Інструменти для експлуатації {{#ref}} tools/ {{#endref}} ## Методологія переповнення стеку З такою кількістю технік добре мати схему, коли кожна техніка буде корисною. Зверніть увагу, що ті ж самі захисти вплинуть на різні техніки. Ви можете знайти способи обійти захисти в кожному розділі захисту, але не в цій методології. ## Контроль потоку Існує кілька способів, як ви можете контролювати потік програми: - [**Переповнення стеку**](../stack-overflow/index.html), переписуючи вказівник повернення зі стеку або EBP -> ESP -> EIP. - Можливо, потрібно зловживати [**переповненням цілого числа**](../integer-overflow.md), щоб викликати переповнення. - Або через **Довільні записи + Записати що де виконання**. - [**Форматні рядки**](../format-strings/index.html)**:** Зловживати `printf`, щоб записати довільний вміст у довільні адреси. - [**Індексація масивів**](../array-indexing.md): Зловживати погано спроектованою індексацією, щоб мати можливість контролювати деякі масиви та отримати довільний запис. - Можливо, потрібно зловживати [**переповненням цілого числа**](../integer-overflow.md), щоб викликати переповнення. - **bof до WWW через ROP**: Зловживати переповненням буфера, щоб побудувати ROP і мати можливість отримати WWW. Ви можете знайти техніки **Записати що де виконання** в: {{#ref}} ../arbitrary-write-2-exec/ {{#endref}} ## Вічні цикли Що слід врахувати, так це те, що зазвичай **лише одне використання вразливості може бути недостатнім** для виконання успішної експлуатації, особливо деякі захисти потрібно обійти. Тому цікаво обговорити деякі варіанти, щоб **зробити одну вразливість експлуатованою кілька разів** в одному виконанні бінарного файлу: - Записати в **ROP** ланцюг адресу **`main` функції** або адресу, де відбувається **вразливість**. - Контролюючи правильний ROP ланцюг, ви можете виконати всі дії в цьому ланцюгу. - Записати в **адресу виходу в GOT** (або будь-яку іншу функцію, що використовується бінарним файлом перед завершенням) адресу, щоб повернутися **до вразливості**. - Як пояснено в [**.fini_array**](../arbitrary-write-2-exec/www2exec-.dtors-and-.fini_array.md#eternal-loop)**,** зберігайте тут 2 функції, одну для повторного виклику вразливості та іншу для виклику **`__libc_csu_fini`**, яка знову викликатиме функцію з `.fini_array`. ## Цілі експлуатації ### Мета: Виклик існуючої функції - [**ret2win**](#ret2win): Існує функція в коді, яку потрібно викликати (можливо, з деякими специфічними параметрами), щоб отримати прапор. - У **звичайному bof без** [**PIE**](../common-binary-protections-and-bypasses/pie/index.html) **та** [**канарки**](../common-binary-protections-and-bypasses/stack-canaries/index.html) вам просто потрібно записати адресу у вказівник повернення, збережений у стеку. - У bof з [**PIE**](../common-binary-protections-and-bypasses/pie/index.html) вам потрібно буде обійти його. - У bof з [**канаркою**](../common-binary-protections-and-bypasses/stack-canaries/index.html) вам потрібно буде обійти її. - Якщо вам потрібно встановити кілька параметрів для правильного виклику функції **ret2win**, ви можете використовувати: - Ланцюг [**ROP**](#rop-and-ret2...-techniques), якщо є достатньо гаджетів, щоб підготувати всі параметри. - [**SROP**](../rop-return-oriented-programing/srop-sigreturn-oriented-programming/index.html) (якщо ви можете викликати цей системний виклик), щоб контролювати багато регістрів. - Гаджети з [**ret2csu**](../rop-return-oriented-programing/ret2csu.md) та [**ret2vdso**](../rop-return-oriented-programing/ret2vdso.md) для контролю кількох регістрів. - Через [**Записати що де**](../arbitrary-write-2-exec/index.html) ви можете зловживати іншими вразливостями (не bof), щоб викликати функцію **`win`**. - [**Перенаправлення вказівників**](../stack-overflow/pointer-redirecting.md): У разі, якщо стек містить вказівники на функцію, яка буде викликана, або на рядок, який буде використаний цікавою функцією (system або printf), можливо, переписати цю адресу. - [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html) або [**PIE**](../common-binary-protections-and-bypasses/pie/index.html) можуть вплинути на адреси. - [**Невизначені змінні**](../stack-overflow/uninitialized-variables.md): Ви ніколи не знаєте. ### Мета: RCE #### Через shellcode, якщо nx вимкнено або змішуючи shellcode з ROP: - [**(Стек) Shellcode**](#stack-shellcode): Це корисно для зберігання shellcode у стеку до або після переписування вказівника повернення, а потім **перейти до нього**, щоб виконати його: - **У будь-якому випадку, якщо є** [**канарка**](../common-binary-protections-and-bypasses/stack-canaries/index.html)**,** у звичайному bof вам потрібно буде обійти (викрити) її. - **Без** [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html) **та** [**nx**](../common-binary-protections-and-bypasses/no-exec-nx.md) можливо перейти до адреси стеку, оскільки вона ніколи не зміниться. - **З** [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html) вам потрібно буде використовувати такі техніки, як [**ret2esp/ret2reg**](../rop-return-oriented-programing/ret2esp-ret2reg.md), щоб перейти до неї. - **З** [**nx**](../common-binary-protections-and-bypasses/no-exec-nx.md) вам потрібно буде використовувати деякі [**ROP**](../rop-return-oriented-programing/index.html) **для виклику `memprotect`** і зробити деяку сторінку `rwx`, щоб потім **зберегти shellcode там** (викликавши read, наприклад) і потім перейти туди. - Це змішає shellcode з ROP ланцюгом. #### Через системні виклики - [**Ret2syscall**](../rop-return-oriented-programing/rop-syscall-execv/index.html): Корисно для виклику `execve`, щоб виконати довільні команди. Вам потрібно буде знайти **гаджети для виклику конкретного системного виклику з параметрами**. - Якщо [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html) або [**PIE**](../common-binary-protections-and-bypasses/pie/index.html) увімкнені, вам потрібно буде їх обійти **для використання ROP гаджетів** з бінарного файлу або бібліотек. - [**SROP**](../rop-return-oriented-programing/srop-sigreturn-oriented-programming/index.html) може бути корисним для підготовки **ret2execve**. - Гаджети з [**ret2csu**](../rop-return-oriented-programing/ret2csu.md) та [**ret2vdso**](../rop-return-oriented-programing/ret2vdso.md) для контролю кількох регістрів. #### Через libc - [**Ret2lib**](../rop-return-oriented-programing/ret2lib/index.html): Корисно для виклику функції з бібліотеки (зазвичай з **`libc`**), такої як **`system`** з деякими підготовленими аргументами (наприклад, `'/bin/sh'`). Вам потрібно, щоб бінарний файл **завантажив бібліотеку** з функцією, яку ви хочете викликати (зазвичай libc). - Якщо **статично скомпільовано і без** [**PIE**](../common-binary-protections-and-bypasses/pie/index.html), **адреси** `system` і `/bin/sh` не зміняться, тому їх можна використовувати статично. - **Без** [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html) **і знаючи версію libc**, **адреси** `system` і `/bin/sh` не зміняться, тому їх можна використовувати статично. - З [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html) **але без** [**PIE**](../common-binary-protections-and-bypasses/pie/index.html), знаючи libc і з бінарним файлом, що використовує функцію `system`, можливо **`ret` до адреси system в GOT** з адресою `'/bin/sh'` в параметрі (вам потрібно буде це з'ясувати). - З [ASLR](../common-binary-protections-and-bypasses/aslr/index.html) але без [PIE](../common-binary-protections-and-bypasses/pie/index.html), знаючи libc і **без бінарного файлу, що використовує `system`**: - Використовуйте [**`ret2dlresolve`**](../rop-return-oriented-programing/ret2dlresolve.md), щоб вирішити адресу `system` і викликати її. - **Обійти** [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html) і обчислити адреси `system` і `'/bin/sh'` в пам'яті. - **З** [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html) **і** [**PIE**](../common-binary-protections-and-bypasses/pie/index.html) **і не знаючи libc**: Вам потрібно: - Обійти [**PIE**](../common-binary-protections-and-bypasses/pie/index.html). - Знайти **версію `libc`**, що використовується (викрити кілька адрес функцій). - Перевірити **попередні сценарії з ASLR**, щоб продовжити. #### Через EBP/RBP - [**Поворот стеку / EBP2Ret / Ланцюг EBP**](../stack-overflow/stack-pivoting-ebp2ret-ebp-chaining.md): Контролюйте ESP, щоб контролювати RET через збережений EBP у стеку. - Корисно для **off-by-one** переповнень стеку. - Корисно як альтернативний спосіб контролювати EIP, зловживаючи EIP для побудови корисного навантаження в пам'яті, а потім переходячи до нього через EBP. #### Різне - [**Перенаправлення вказівників**](../stack-overflow/pointer-redirecting.md): У разі, якщо стек містить вказівники на функцію, яка буде викликана, або на рядок, який буде використаний цікавою функцією (system або printf), можливо, переписати цю адресу. - [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html) або [**PIE**](../common-binary-protections-and-bypasses/pie/index.html) можуть вплинути на адреси. - [**Невизначені змінні**](../stack-overflow/uninitialized-variables.md): Ви ніколи не знаєте. {{#include ../../banners/hacktricks-training.md}}