mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
112 lines
14 KiB
Markdown
112 lines
14 KiB
Markdown
# Основна методологія експлуатації бінарних файлів
|
||
|
||
{{#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}}
|