четвъртък, 28 февруари 2008 г.

Buffer Overflow tutorial
(by Razor)
Buffer Overflow (prepylwane na bufera)

Moje bi goliama chast ot was sa sreshtali towa poniatie iz Internet
i sa se chudili kakwo tochno oznachawa. W tozi dokument sa opisani
osnowite na tozi tip ataki kakto i niakolko nagledni primera.
Za tazi dokumentacia shte wi e neobhodimo beglo poznanie na C.

Prepylwaniata na bufera (ili oshte buffer overflow) sa edna ot naj-
chesto izpolzuwanite ataki w segashno wreme. Tozi metod moje da se
izpolzuwa na mnogo mesta, no predimno s nego se exploit-wat ne do-
bre postroeni Unix programi.

Eto naj-prostia primer za Buffer Overflow ataka

Kakto znaete pametta na kompiutyra e sywkupnost ot mnogo kletki, w
koito moje da se zapiswa razlichna informacia. Da wzemem slednata
programa na C

main() {
char buffer[1024];
strcpy(buffer,"Hi there\n");
printf("%s",buffer);
}

W programa se zadeliat 1024 bajta kydeto shte se zapishe sydyrjanieto
na promenliwata `buffer'. W sluchaia tezi 1024 bajta sa napylno dos-
tatychni za neobhodimia string "Hi there\n".
No sega neka probwame sys slednia primer:

main() {
char buffer[1024];
int i;
for (i=0; i<2000; i++) buffer[i]='Z';
}

Sled startirane poluchawame slednoto syobshtenie:
Segmentation fault (core dumped)

Iawno programata se e opitala da preskochi na adres, kojto ne e w nej-
noto adresno prostranstwo i wednaga be prekratena ot OS.

Towa e osnownia princip na prepylwaneto na bufera. Moje bi se pitate
kakwo tolkowa mojete da postignete ot edno takowa neshto? E kakto wi
kazah goliama chast ot exploit-ite izpolzuwat imenno prepylwaniata na
bufera za pridobiwane na root access w otdalecheni sistemi. Eto kak
stawa towa:
Da wzemem za primer funkciata scanf(). Znaem che tia zapiswa zada-
den string ot STDIN w dadena promenliwa. Pri izwikwane na scanf()
steka na programata e neshto takowa:


- buffer - sfp - ret -


buffer e otdelenoto miasto sa syhraniawane na wywedenia tekst, sfp
za sluchaia niama da go razglejdame, a ret e wryshtania adres kyde-
to scanf() shte preprati izpylnenieto na programata kogato potrebi-
telia natisne Enter.
Zashto poluchihme Segmentation fault w pyrwia primer?
Kogato zapisahme poweche informacia w nashia primer nie prezapisa-
hme stojnostta na wryshtania adres s "ZZZZ" (0x909090). Kogato pro-
gramata se e opitala da izpylni instrukciata na tozi adres, tia e
poluchila SIGSEGV ot Kernel-a i e bila prekratena(niama rabota w
chujdo adresno prostranstwo). Ideata na exploitite e da zadadat na
RET stojnono, koiato da prenasochi izpylnenieto na programata kym
`buffer', kato razbira se tam sme slojili instrukciite, koito iska-
me da bydat izpylneni.

W tozi doc niama da obryshtam wnimanie na samoto pisane na exploti,
poneje kakto kazah toj e samo za zapoznawane s prepylwaniata



--------------------------------------------------------------------------------

Buffer Overflow razbira se izobshto ne e now metod. Izpolzuwan e
bil oshte prez 1960g. i zatowa powecheto programi w dneshno wreme
sa napylno podsigureni na mestata kydeto moje da se izpolzuwa pre-
pylwane.

Eto niakolko primera za razlichen wid BufferOverflow:

Pri potrebitelski whod w programata:

main() {
char buffer[10];
int i;
puts("Wywedete washeto ime?");
scanf("%s",buffer);
printf("%s\n",buffer);
}

Pri podawane na parametyr kym komandnata linia:

#include
#include
int main(int argc,int **argv)
{
char buffer[10];
int i;
if(argc>1)
{
strcpy(buffer,argv[1]);
}
}





Kakto spomenah po-goliamata chast ot programite w dneshno wreme
sa dobre podsigureni i e mnogo trudno da se postigne jelania
efekt. Naj-prostoto podsiguriawane bi moglo da se izwyrshi taka:

main() {
char buffer[10];
int i;
puts("Wywedete washeto ime?");
fscanf(stdin,buffer,10);
printf("%s\n",buffer);
}

Towa e kopie na gornata programa s izkliuchenie na towa che
se proweriawa dyljinata na wywedenia string... ako tia e po-
goliama ot 10 simwola programata se prekratiawa



END

Няма коментари: