BF Addresses in the Stack
Last updated
Last updated
Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Ako se suočavate sa binarnim kodom zaštićenim kanarijem i PIE (Pozicija Nezavisni Izvršni), verovatno treba da pronađete način da ih zaobiđete.
Imajte na umu da checksec
možda neće otkriti da je binarni kod zaštićen kanarijem ako je statički kompajliran i nije sposoban da identifikuje funkciju.
Međutim, možete to ručno primetiti ako otkrijete da je vrednost sačuvana u steku na početku poziva funkcije i da se ova vrednost proverava pre izlaska.
Da biste zaobišli PIE, potrebno je da procurite neku adresu. A ako binarni kod ne propušta nikakve adrese, najbolje je da brute-forcujete RBP i RIP sačuvane u steku u ranjivoj funkciji. Na primer, ako je binarni kod zaštićen koristeći i kanarija i PIE, možete početi sa brute-forcovanjem kanarije, zatim će sledećih 8 bajtova (x64) biti sačuvani RBP, a sledećih 8 bajtova će biti sačuvani RIP.
Pretpostavlja se da adresa povratka unutar steka pripada glavnom binarnom kodu, što će obično biti slučaj ako je ranjivost locirana u binarnom kodu.
Da biste brute-forcovali RBP i RIP iz binarnog koda, možete shvatiti da je validan pogodak bajta tačan ako program nešto ispiše ili jednostavno ne sruši. Ista funkcija koja je data za brute-forcovanje kanarije može se koristiti za brute-forcovanje RBP i RIP:
Poslednja stvar koju treba da uradite da pobedite PIE je da izračunate korisne adrese iz otkrivenih adresa: RBP i RIP.
Iz RBP možete izračunati gde pišete svoj shell u steku. Ovo može biti veoma korisno da znate gde ćete napisati string "/bin/sh\x00" unutar steka. Da biste izračunali razdaljinu između otkrivenog RBP-a i vašeg shellcode-a, jednostavno stavite prekidač nakon otkrivanja RBP-a i proverite gde se nalazi vaš shellcode, zatim možete izračunati razdaljinu između shellcode-a i RBP-a:
From the RIP you can calculate the base address of the PIE binary which is what you are going to need to create a valid ROP chain.
Da biste izračunali osnovnu adresu, jednostavno uradite objdump -d vunbinary
i proverite poslednje adrese disasemblerovanja:
U tom primeru možete videti da je potrebno samo 1 Byte i po da locirate sav kod, tako da će osnovna adresa u ovoj situaciji biti procureni RIP ali završava na "000". Na primer, ako ste procurili 0x562002970ecf
, osnovna adresa je 0x562002970000
Prema nekim zapažanjima iz ovog posta, moguće je da kada se curi RBP i RIP vrednosti, server neće pasti sa nekim vrednostima koje nisu tačne i BF skripta će misliti da je dobila dobre. To je zato što je moguće da neke adrese jednostavno neće izazvati grešku čak i ako nisu tačne.
Prema tom blog postu, preporučuje se da se doda kratka kašnjenja između zahteva serveru.
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)