112 lines
14 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Основна методологія експлуатації бінарних файлів
{{#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}}