Format Strings
Basiese Inligting
In C is printf
'n funksie wat gebruik kan word om 'n string af te druk. Die eerste parameter wat hierdie funksie verwag, is die rou teks met die formateerders. Die volgende parameters wat verwag word, is die waardes om die formateerders van die rou teks te vervang.
Ander kwesbare funksies is sprintf()
en fprintf()
.
Die kwesbaarheid verskyn wanneer 'n aanvallersteks as die eerste argument vir hierdie funksie gebruik word. Die aanvaller sal in staat wees om 'n **spesiale inset te skep deur misbruik te maak van die printf-formaatreeksvermoëns om enige data in enige adres te lees en skryf (leesbaar/skryfbaar). Deur op hierdie manier willekeurige kode uit te voer.
Formateerders:
Voorbeelde:
Kwesbare voorbeeld:
Normale Gebruik:
Met Ontbrekende Argumente:
fprintf kwesbaar:
Toegang tot Aanwysers
Die formaat %<n>$x
, waar n
'n nommer is, maak dit moontlik om aan printf aan te dui om die n-de parameter (vanaf die stapel) te kies. Dus, as jy die 4de parameter vanaf die stapel wil lees deur printf te gebruik, kan jy dit doen:
en jy sou van die eerste tot die vierde parameter lees.
Of jy kan doen:
en lees direk die vierde.
Let daarop dat die aanvaller die pr
intf
parameter beheer, wat basies beteken dat sy inset in die stapel gaan wees wanneer printf
geroep word, wat beteken dat hy spesifieke geheue-adresse in die stapel kan skryf.
'n Aanvaller wat hierdie inset beheer, sal in staat wees om willekeurige adresse in die stapel by te voeg en printf
hulle te laat toegang. In die volgende afdeling sal verduidelik word hoe om van hierdie gedrag gebruik te maak.
Willekeurige Lees
Dit is moontlik om die formateerder %n$s
te gebruik om printf
die adres wat in die n-posisie geleë is, te laat kry, dit te volg en dit te druk asof dit 'n string was (druk totdat 'n 0x00 gevind word). So as die basisadres van die binêre lêer 0x8048000
is, en ons weet dat die gebruikerinset begin in die 4de posisie in die stapel, is dit moontlik om die begin van die binêre lêer te druk met:
Let daarop dat jy nie die adres 0x8048000 aan die begin van die inset kan plaas nie, omdat die string in 0x00 aan die einde van daardie adres sal word gekat.
Vind offset
Om die offset na jou inset te vind, kan jy 4 of 8 bytes (0x41414141
) stuur gevolg deur %1$x
en verhoog die waarde totdat jy die A's
terugkry.
Last updated