Format Strings
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
If you are interested in hacking career and hack the unhackable - we are hiring! (tečno poznavanje poljskog jezika u pisanju i govoru je obavezno).
U C printf
je funkcija koja se može koristiti za štampanje nekog stringa. Prvi parametar koji ova funkcija očekuje je sirovi tekst sa formatima. Sledeći parametri koji se očekuju su vrednosti za zamenu formatera iz sirovog teksta.
Druge ranjive funkcije su sprintf()
i fprintf()
.
Ranjivost se pojavljuje kada se napadački tekst koristi kao prvi argument ovoj funkciji. Napadač će moći da kreira poseban unos koji zloupotrebljava printf format string mogućnosti da pročita i zapiše bilo koje podatke na bilo kojoj adresi (čitljivo/zapisivo). Na ovaj način će moći da izvrši proizvoljan kod.
Primeri:
Ranjivi primer:
Normalna upotreba:
Sa nedostajućim argumentima:
fprintf ranjiv:
Format %<n>$x
, gde je n
broj, omogućava da se printf-u naznači da izabere n-ti parametar (sa steka). Dakle, ako želite da pročitate 4. parametar sa steka koristeći printf, mogli biste to uraditi:
и могли бисте читати од првог до четвртог параметра.
Или бисте могли да урадите:
и директно прочитати четврту.
Обратите пажњу да нападач контролише printf
параметар, што у основи значи да ће његов унос бити у стеку када се позове printf
, што значи да би могао да запише специфичне адресе у меморији у стеку.
Нападач који контролише овај унос, моћи ће да дода произвољну адресу у стек и натера printf
да им приступи. У следећем одељку биће објашњено како користити ово понашање.
Могуће је користити форматор %n$s
да натера printf
да добије адресу смештену у n позицији, следећи је и одштампа као да је то стринг (одштампа до 0x00). Дакле, ако је базна адреса бинарног фајла 0x8048000
, и знамо да кориснички унос почиње у 4. позицији у стеку, могуће је одштампати почетак бинарног фајла са:
Napomena: ne možete staviti adresu 0x8048000 na početak ulaza jer će string biti prekinut na 0x00 na kraju te adrese.
Da biste pronašli offset do vašeg ulaza, možete poslati 4 ili 8 bajtova (0x41414141
) praćenih %1$x
i povećavati vrednost dok ne dobijete A's
.
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)