Format Strings
Basic Information
Katika C printf
ni kazi ambayo inaweza kutumika kuchapisha maandiko fulani. Parameta ya kwanza ambayo kazi hii inatarajia ni maandishi halisi yenye waandishi wa fomati. Parameta zinazofuata zinazotarajiwa ni thamani za kuchukua nafasi ya waandishi wa fomati kutoka kwa maandiko halisi.
Wakazi wengine walio hatarini ni sprintf()
na fprintf()
.
Ukatili unatokea wakati maandishi ya mshambuliaji yanapotumika kama hoja ya kwanza kwa kazi hii. Mshambuliaji ataweza kuunda ingizo maalum linalotumia uwezo wa printf format kusoma na kuandika data yoyote katika anwani yoyote (inasomeka/inaandikwa). Kuwa na uwezo huu wa kutekeleza msimbo wowote.
Formatters:
Mifano:
Mfano unaoweza kuathiriwa:
Matumizi ya Kawaida:
Na Hoja za Kutokuwepo:
fprintf inayoweza kutumika:
Kupata Viashiria
Muundo %<n>$x
, ambapo n
ni nambari, unaruhusu kuonyesha kwa printf kuchagua parameter ya n (kutoka kwenye stack). Hivyo ikiwa unataka kusoma parameter ya 4 kutoka kwenye stack ukitumia printf unaweza kufanya:
na ungeweza kusoma kutoka kwa param ya kwanza hadi ya nne.
Au unaweza kufanya:
na kusoma moja kwa moja ya nne.
Kumbuka kwamba mshambuliaji anadhibiti pr
intf
parameter, ambayo kimsingi inamaanisha kwamba ingizo lake litakuwa kwenye stack wakati printf
inaitwa, ambayo inamaanisha kwamba anaweza kuandika anwani maalum za kumbukumbu kwenye stack.
Mshambuliaji anayekontrol ingizo hili, ataweza kuongeza anwani yoyote kwenye stack na kufanya printf
iwasiliane nazo. Katika sehemu inayofuata itafafanuliwa jinsi ya kutumia tabia hii.
Kusoma Bila Mpangilio
Inawezekana kutumia formatter %n$s
kufanya printf
ipate anwani iliyoko katika n nafasi, ikifuatia na kuichapisha kana kwamba ni string (chapisha hadi 0x00 ipatikane). Hivyo kama anwani ya msingi ya binary ni 0x8048000
, na tunajua kwamba ingizo la mtumiaji linaanza katika nafasi ya 4 kwenye stack, inawezekana kuchapisha mwanzo wa binary kwa:
Kumbuka kwamba huwezi kuweka anwani 0x8048000 mwanzoni mwa ingizo kwa sababu mfuatano utawekwa katika 0x00 mwishoni mwa anwani hiyo.
Pata offset
Ili kupata offset kwa ingizo lako unaweza kutuma bytes 4 au 8 (0x41414141
) ikifuatiwa na %1$x
na kuongeza thamani hadi upate A's
.
Last updated