Format Strings
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking:
HackTricks Training GCP Red Team Expert (GRTE)
Basic Information
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 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 čita i piše bilo koje podatke na bilo kojoj adresi (čitljivo/pisivo). Na ovaj način će moći da izvrši proizvoljan kod.
Formatters:
Primeri:
Ranjivi primer:
Normalna upotreba:
Sa nedostajućim argumentima:
fprintf ranjiv:
Pristupanje Pokazivačima
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:
и могли бисте читати од првог до четвртог параметра.
Или бисте могли да урадите:
и читајте директно четврту.
Обратите пажњу да нападач контролише параметар pr
intf
, што у основи значи да ће његов унос бити у стеку када се позове printf
, што значи да би могао да упише специфичне адресе у меморији у стек.
Нападач који контролише овај унос, моћи ће да дода произвољну адресу у стек и натера printf
да им приступи. У следећем одељку биће објашњено како користити ово понашање.
Произвољно читање
Могуће је користити форматор %n$s
да натера printf
да добије адресу која се налази на n позицији, следећи је и одштампа као да је то стринг (одштампа до 0x00). Дакле, ако је базна адреса бинарног фајла 0x8048000
, и знамо да кориснички унос почиње на 4. позицији у стеку, могуће је одштампати почетак бинарног фајла са:
Napomena da ne možete staviti adresu 0x8048000 na početak ulaza jer će string biti prekinut u 0x00 na kraju te adrese.
Pronađi offset
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
.
Last updated