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! (fluent polish written and spoken required).
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 formata iz sirovog teksta.
Druge ranjive funkcije su sprintf()
i fprintf()
.
Ranjivost se pojavljuje kada se tekst napadača 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 da ne možete staviti adresu 0x8048000 na početak ulaza jer će se string završiti sa 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)