Format Strings
Taarifa Msingi
Katika C printf
ni kazi inayoweza kutumika kwa kusambaza baadhi ya string. Parameter ya kwanza inayotarajiwa na kazi hii ni maandishi ghafi yenye formatters. Parameta zinazofuata zinatarajiwa kuwa thamani za kubadilisha formatters kutoka kwenye maandishi ghafi.
Kazi zingine zenye udhaifu ni sprintf()
na fprintf()
.
Udhaifu unaonekana wakati maandishi ya muasisi yanapotumiwa kama hoja ya kwanza kwa kazi hii. Mshambuliaji ataweza kutengeneza kuingiza maalum kwa kutumia uwezo wa muundo wa string ya printf kusoma na kuandika data yoyote kwenye anwani yoyote (inayoweza kusomwa/kuandikwa). Hivyo kuweza kutekeleza nambari za aina yoyote.
Formatters:
Mifano:
Mfano wa hatari:
Matumizi ya Kawaida:
Kwa Vipengele Vilivyopotea:
fprintf inayoweza kudhurika:
Kupata Pointers
Muundo wa %<n>$x
, ambapo n
ni nambari, inaruhusu kuelekeza printf kuchagua parameter ya n (kutoka kwenye stack). Kwa hivyo, ikiwa unataka kusoma param ya 4 kutoka kwenye stack ukitumia printf unaweza kufanya hivi:
Na ungesoma kutoka kwa paramu ya kwanza hadi ya nne.
Au unaweza kufanya:
na soma moja kwa moja ya nne.
Gundua kwamba muhalifu anadhibiti parameter ya pr
intf
, ambayo kimsingi inamaanisha kwamba mchango wake utakuwa kwenye stack wakati printf
inaitwa, ambayo inamaanisha kwamba anaweza kuandika anwani maalum za kumbukumbu kwenye stack.
Muhalifu anayeidhibiti mchango huu, ataweza kuongeza anwani za kiholela kwenye stack na kufanya printf
kuzifikia. Katika sehemu inayofuata itaelezwa jinsi ya kutumia tabia hii.
Kusoma Kiholela
Inawezekana kutumia mfumo wa %n$s
ili kufanya printf
ipate anwani iliyoko katika nafasi ya n, ikifuatiwa na kuichapisha kana kwamba ni string (kuichapisha hadi 0x00 inapatikana). Kwa hivyo, ikiwa anwani ya msingi ya binary ni 0x8048000
, na tunajua kwamba mchango wa mtumiaji unaanza katika nafasi ya 4 kwenye stack, inawezekana kuchapisha mwanzo wa binary na:
Tafadhali kumbuka huwezi kuweka anwani 0x8048000 mwanzoni mwa matokeo kwa sababu string itaishia kwa 0x00 mwishoni mwa anwani hiyo.
Pata offset
Ili kupata offset ya matokeo yako unaweza kutuma herufi 4 au 8 (0x41414141
) ikifuatiwa na %1$x
na ongeza thamani mpaka upate A's
.
Last updated