Leaking libc address with ROP
Brzi rezime
Pronađite offset prelivanja
Pronađite
POP_RDI
gadget,PUTS_PLT
iMAIN
gadgeteKoristite prethodne gadgete da curite adresu u memoriji funkcije puts ili druge libc funkcije i pronađite verziju libc (preuzmite je)
Sa bibliotekom, izračunajte ROP i iskoristite ga
Ostali tutorijali i binarni fajlovi za vežbanje
Ovaj tutorijal će iskoristiti kod/binarni fajl predložen u ovom tutorijalu: https://tasteofsecurity.com/security/ret2libc-unknown-libc/ Još korisnih tutorijala: https://made0x78.com/bseries-ret2libc/, https://guyinatuxedo.github.io/08-bof_dynamic/csaw19_babyboi/index.html
Kod
Ime fajla: vuln.c
ROP - Leaking LIBC шаблон
Преузмите експлоит и ставите га у исту директорију као и рањиви бинарни фајл и дајте потребне податке скрипти:
Leaking libc - template1- Налажење офсета
Шаблону је потребан офсет пре него што настави са експлоитом. Ако је било који пружен, извршиће потребан код да га пронађе (по подразумеваној вредности OFFSET = ""
):
Izvršite python template.py
GDB konzola će se otvoriti sa programom koji se srušio. Unutar te GDB konzole izvršite x/wx $rsp
da dobijete bajtove koji su trebali da prepišu RIP. Na kraju dobijte offset koristeći python konzolu:
Nakon pronalaženja ofseta (u ovom slučaju 40) promenite OFFSET promenljivu unutar šablona koristeći tu vrednost.
OFFSET = "A" * 40
Drugi način bi bio da se koristi: pattern create 1000
-- izvršiti do ret -- pattern seach $rsp
iz GEF-a.
2- Pronalaženje Gadžeta
Sada treba da pronađemo ROP gadžete unutar binarnog fajla. Ovi ROP gadžeti će biti korisni za pozivanje puts
kako bismo pronašli libc koja se koristi, a kasnije za pokretanje konačnog eksploita.
PUTS_PLT
je potreban za pozivanje funkcije puts.
MAIN_PLT
je potreban za ponovo pozivanje main funkcije nakon jedne interakcije da bi se iskoristio overflow ponovo (beskonačni krugovi eksploatacije). Koristi se na kraju svakog ROP-a da ponovo pozove program.
POP_RDI je potreban da se proslijedi parametar pozvanoj funkciji.
U ovom koraku ne morate izvršavati ništa jer će sve biti pronađeno od strane pwntools tokom izvršenja.
3- Pronalaženje libc biblioteke
Sada je vreme da pronađemo koja verzija libc biblioteke se koristi. Da bismo to uradili, iskoristićemo leak adresu u memoriji funkcije puts
i zatim ćemo pretražiti u kojoj verziji biblioteke se nalazi verzija puts na toj adresi.
Da bi to uradili, najvažnija linija izvršenog koda je:
Ovo će poslati neke bajtove dok prepisivanje RIP nije moguće: OFFSET
.
Zatim, postaviće se adresa gadgeta POP_RDI
tako da će sledeća adresa (FUNC_GOT
) biti sačuvana u registru RDI. To je zato što želimo da pozovemo puts prosljeđujući mu adresu PUTS_GOT
jer je adresa u memoriji funkcije puts sačuvana u adresi na koju pokazuje PUTS_GOT
.
Nakon toga, biće pozvan PUTS_PLT
(sa PUTS_GOT
unutar RDI) tako da će puts pročitati sadržaj unutar PUTS_GOT
(adresa funkcije puts u memoriji) i odštampati ga.
Na kraju, glavna funkcija se ponovo poziva kako bismo mogli ponovo iskoristiti prelivanje.
Na ovaj način smo prevarili funkciju puts da odštampa adresu u memoriji funkcije puts (koja se nalazi u libc biblioteci). Sada kada imamo tu adresu možemo potražiti koja verzija libc se koristi.
Pošto iskorišćavamo neki lokalni binarni fajl, nije potrebno da otkrijemo koja verzija libc se koristi (samo pronađite biblioteku u /lib/x86_64-linux-gnu/libc.so.6
).
Ali, u slučaju udaljenog eksploata, objasniću ovde kako možete to pronaći:
3.1- Pretraživanje verzije libc (1)
Možete pretražiti koja biblioteka se koristi na veb stranici: https://libc.blukat.me/ Takođe će vam omogućiti da preuzmete otkrivenu verziju libc
3.2- Pretraživanje verzije libc (2)
Takođe možete uraditi:
$ git clone https://github.com/niklasb/libc-database.git
$ cd libc-database
$ ./get
Ovo će potrajati, budite strpljivi. Za ovo da bi radilo potrebni su nam:
Ime libc simbola:
puts
Otkazana libc adresa:
0x7ff629878690
Možemo otkriti koja libc se najverovatnije koristi.
Dobijamo 2 podudaranja (trebalo bi da probate drugo ako prvo ne radi). Preuzmite prvo:
Kopirajte libc iz libs/libc6_2.23-0ubuntu10_amd64/libc-2.23.so
u naš radni direktorijum.
3.3- Druge funkcije za leak
4- Pronalaženje bazne libc adrese i eksploatacija
U ovom trenutku trebali bismo znati koja se libc biblioteka koristi. Pošto eksploatišemo lokalni binarni fajl, koristiću samo: /lib/x86_64-linux-gnu/libc.so.6
Dakle, na početku template.py
promenite libc promenljivu na: libc = ELF("/lib/x86_64-linux-gnu/libc.so.6") #Postavite putanju do biblioteke kada je znate
Davanjem putanje do libc biblioteke, ostatak eksploata će biti automatski izračunat.
Unutar get_addr
funkcije, bazna adresa libc će biti izračunata:
Napomena da konačna libc osnovna adresa mora završavati sa 00. Ako to nije vaš slučaj, možda ste iscurili pogrešnu biblioteku.
Zatim, adresa funkcije system
i adresa do stringa "/bin/sh" će biti izračunate iz osnovne adrese libc i date libc biblioteci.
Na kraju, eksploit za izvršenje /bin/sh će biti pripremljen i poslat:
Hajde da objasnimo ovaj konačni ROP.
Poslednji ROP (rop1
) je ponovo pozvao glavnu funkciju, tako da možemo ponovo iskoristiti overflow (zato je OFFSET
ovde ponovo). Zatim, želimo da pozovemo POP_RDI
koji pokazuje na adresu "/bin/sh" (BINSH
) i pozovemo system funkciju (SYSTEM
) jer će adresa "/bin/sh" biti prosleđena kao parametar.
Na kraju, adresa funkcije exit je pozvana tako da proces izlazi lepo i ne generiše se nikakvo upozorenje.
Na ovaj način će exploit izvršiti _/bin/sh_** shell.**
4(2)- Korišćenje ONE_GADGET
Takođe možete koristiti ONE_GADGET da dobijete shell umesto korišćenja system i "/bin/sh". ONE_GADGET će pronaći unutar libc biblioteke neki način da dobije shell koristeći samo jednu ROP adresu.
Međutim, obično postoje neka ograničenja, najčešća i lako izbegnuta su kao [rsp+0x30] == NULL
Pošto kontrolišete vrednosti unutar RSP, samo treba da pošaljete još nekoliko NULL vrednosti kako bi se ograničenje izbeglo.
EXPLOIT FILE
Možete pronaći šablon za iskorišćavanje ove ranjivosti ovde:
Leaking libc - templateUobičajeni problemi
MAIN_PLT = elf.symbols['main'] nije pronađen
Ako simbol "main" ne postoji. Tada možete pronaći gde je glavni kod:
и ручно поставите адресу:
Puts nije pronađen
Ako binarni fajl ne koristi Puts, trebali biste proveriti da li koristi
sh: 1: %s%s%s%s%s%s%s%s: nije pronađen
sh: 1: %s%s%s%s%s%s%s%s: nije pronađen
Ako pronađete ovu grešku nakon što ste kreirali sve eksploite: sh: 1: %s%s%s%s%s%s%s%s: nije pronađen
Pokušajte da oduzmete 64 bajta od adrese "/bin/sh":
Last updated