Bufferoverflow

Sta je ustvari buffer overflow napad i kakvu ulogu u njemu imaju Null karakteri.Kako izvest buffer overflow napad naprimjer na sendmail?

Ovako stari, ja ti mogu samo nesto objasnit od toga, ne sve jer se ne bakcem ternutno sa tim, al o ovom se radi:
Ovako vidis ovaj dole primjer sto sam naveo (mozda html parser nesto izbaci ili promjeni od koda, al nadam se da ces shvatit), eh sam vidis da sa konzole nesto kupi, neke podatke, sad kad ti iskompajliras taj dole program npr. pod imenom “bugg” i odradis slijedece:

./bugg

xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx <- ovo ti napises
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx <- ovo on otprinta

tu ima 30 “x”-ova, eh program ce to lijepo isprintat na konzolu tih 30 x-ova i izac iz programa. ok to je dure, al kad mu das ko input
35 znakova “x” onda ce ti javit ovo:

./bugg

xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Segmentation fault (core dumped)

eh sta se desilo ovdje, uspio si upisat 35 karaktera u ovo “char small[30];”. eh tu kako je navedeno ide samo 30 karaktera.
uh pa kako ti uspi upisat 35, hehehe tu je caka on prelije taj buffer od 30 karaktera (isto ko da imas 2 case jedna veca, a druga manja i ova veca je puna vode, ti lijepo uzmes tu veliku casu i prespes SVU vodu u onu malu, naravno nece sva voda ostat u maloj casi vec ce se nesto i prelit).
eh tako ti je to i kod bufferoverflow-a, znaci ti uspijes prelit taj buffer od 30 karaktera i u memoriji se onih ostalih 5 upise negdje. eh sad fino nadjes tu memorijsku adresu gdje se to lijepo sve prelilo.
eh sad napravis shellcode (to ti je funkcija koja pokrece /bin/bash, al napisana u hex-a decimalnom formatu).
i sad u tu memorijsku adresu punih tih 35karaktera + shellcode.
eh sad null karaktere koristis da bi mogo popunit prazninu u memoriji koja ti ostane jer null karaktere program ne izvrsava samo prelazi preko njih.
eh sad tu ima i finta da pomocu null karaktera mozes “pointat” na neku adresu na kojoj ti se nalazi shell code, to je korisno samo zato da bi mogo utrpat shellcode negdje u memoriji i pointat na njegovu adresu.
sad kad se program pokrene i pocne bufferoverflow, on predje preko null karaktera i dodje do point tacke odakle skace na shellcode i pokrece ono “/bin/bash” sa root privilegijama sto ti daje kao rezultat root shell.

znam da nisam bio najjasniji al sta cu, nemogu ti sad u ovom trenutku drugacije objasnit.
evo primjera bufferoverflow-a

— bugg.c —
#include <stdio.h>

void bugg(void) {
char small[30];
gets (small);
printf("%sn", small);
}

main(){
bugg();
return 0;
}

— bugg.c —

Nisu to null karakteri … NULL karakter se ne smije pojaviti u shell kodu … jer on oznacava kraj stringa. Dakle ako bi bio null karakter u pola shell koda onda bi se samo izvrsila polovica i ne bi bilo efekta. Onda se pojedine instrukcije koje imaju u sebi null zamjenjuju ekvivalentnim (koje nemaju). Ono o cemu si ti pricao je NOP instrukcija. Ali zasto objasnjavati nekome “kako se moze izvesti buffer overflow napad” ?? To vrlo l;ako moze biti 31337 h4x0r koji ce, kad mu objasnis, otici i to isprobati na 100 kompjutera i uspjeti na 2 i uraditi deface stranice … i li jos gore … osnovati hakersku grupu koja ce to raditi.

Zato ako neko hoce informaciju kako praviti programe koji su otporni na buffer overflow - onda nek ne koristi gets() :slight_smile: i nek provjerava velicinu stringova kad god upisuje, kopira i sastavlja jedan s drugim :slight_smile:

Maher,hvala.Sto se tice hackerisanja i defacmenta,pocetnik sam i ucim o programiranju u linuxu,surfajuci citao sam o buffer overflow-u pa sam htio da si malo pojasnim.Informaciju sigurno ne bi koristio protiv nekoga i nemam namjeru osnivati nikakvu hakersku grupu.
P.S Ima li neki web o bufferima i o memoriji?

2 testni_hamo2: da tako je, ja se izvinavam na gresci ljudski je da grijesim :))))))

2 RTFM: eh sad o memoriji ces najbolje doznat ako pocnes citat i nadam se procitas knjigu “Art Of Assembly”, imas je negdje na netu vidi sa googl-om :))))
Takodje ako te ta tema bas interesuje nadji negdje dobro objasnjenje kako FIFO i LIFO memorija radi te kako hardwerski sve to radi ja mislim da ces dosta stvari skontat.
zatim moras znat malo i assemblera te kako radi sva ta intel struktura (mada linux koristi AT&T sintaksu assemblera al nije velika razlika)

i da: PROGRAMERI OBAVEZNO KONTROLISITE VELICINU STRINGA :slight_smile:

http://www.safemode.org/files/zillion/shellcode/doc/Writing_shellcode.html
U tom dokumentu imas dio “Using the registers” gdje fino objasnjava sta je to NULL karakter i kako se izbjegava. Text je stvarno fin, ali bi trebao malo poznavati asm i c

PS: yooo maheru djuturume stari :stuck_out_tongue: jesil naucio “ich liebe dich” ?? :stuck_out_tongue: :stuck_out_tongue: :stuck_out_tongue: :smiley:

trip0d

Ma nema potrebe za izvinjavanjem … nisam ja ljut :))))

spiking of hackerske grupice, [quote]root@bih.net.ba: ~# shutdown -h now[/quote] …ko ovdje koga navodi na destruktivne ideje? :wink:

:))))
To nije destruktivna ideja … to je moj stav! :slight_smile:

MIZ zakon… :lol: 8)

Slučajno naiđoh za vrlo jednostavan primjer za buffer overflow:

#include <stdio.h>
#include <string.h>

int main()
{
   char *str = "0123456789012";       /* string sa 0-om na kraju ima 14 karaktera*/
   char buf[10];     /*u baf je mjesto samo za 10*/

   strcpy(buf, str);  /*funkcija strcpy kopira str na mjesto od buf i izaziva buffer overflow */
   printf("%s",buf);
   return 0;
}

Ako ovi suvišni karakteri prepišu neke varijable onda program krešira.
Ako se isti ipak javi sa greškom u memoriji onda je skočio na neko drugo mjesto u memoriji. Ako si to drugo mjesto ti odredio i sadrži neki dalji kod onda si izazvao tkz. exploit.

8-[

ja mislim da su trenutno programi svi tako programirani da provjeravaju duzinu stringova prije ikakvog kopiranja… ili se varam… znam da su buffer overflow problemi se desavali kod sendmaila i slicnih aplikacija starijih verzija… correct?

Pozdrav

ICE

To zavisi samo od programera.
Ja licno koristim samo “sigurne” funkcije koje provjeravaju duzinu stringova.
Ali u mojim programcicima nije bitna brzina tako da ih mogu koristiti. Ove druge funkcije koje ne provjeravaju duzine su brze i zato se cesto koriste u velikim projektima.

PRIMJER:

Brze funkcije:
gets(buf);
scanf("%s",str);
strcpy(buf1, buf2);
strcat(buf1 , buf2);

Sporije ali sigurnije:
fgets(buf, MAX_BUF, stdin);
scanf("%10s",str);
strncpy(buf1, buf2, SIZE);
strncat(buf1, buf2, SIZE);

Najopasnije je , koliko ja znam , kad hacker promijeni kod i vrati program na server.

Ja ti sigurno mogu reci da SVI programi ne provjeravaju duzinu stringa prije kopiranja :slight_smile: Cinjenica je da se sad tome pridaje puno vise paznje, ali opet negdje “proleti” nesto … :slight_smile:

Baby, zaboravio si još jednu važnu funkciju, po meni poprilično opasnu:

strlen(1);

Problem je u tome što ako je prepisan ‘’ znak na kraju stringa “bad things can happen”.
Naravno, postoji i funkcija strnlen(2). Ona (na žalost) nije po ISO C99 standardu, ali svi važniji kompajleri / C biblioteke je podržavaju.
Ne može se apsolutno vjerovati strlen() funkciji (napadač vam proslijedi string koji nije null terminiran i BUM. Još “samo” treba uštimati koliko prelijevanje treba, dok ste ga sa strnlen() ograničili, pa je mnogo manja vjerovatnoća uspješnog buffer overflow napada).

Ko koristi Pascal (FreePascal || Dephi) nema nikakvih problema sa stringovima. (Ja sam freak koji uz C voli i Object Pascal :lol:)

Što se tiče C-a, meni se najviše svidjela implementacija kod glib-a (op. osnovna bibilioteka za GTK+). tu imate nešto kao:

struct GString {
    char* str;
    int len;
    /* ... */
};

Imate čitavu gamu funkcija za rukovanje ovakvim stringovima, čak ne moraju biti null terminirani, a zadržana je sva fleksibilnost jer svim funkcijama koje očekuju ‘char*’ samo proslijedite varijablu tipa GString. tako da rade i nebuloze tipa:

    GString *str;

    str = g_string_new("Hello world");

    printf("%s", *str);

A kako ce napadac proslijediti string koji nema ?
Npr. kad koristis fgets(…), ona dodaje “” na kraj …
Postoje neke f. koje to ne rade ali vracaju broj procitanih/kopiranih/upisanih karaktera tako da jednostavno str[broj] = ‘’; rjesava stvari.

a tek QString.... +austinou+ ;)

ah da, ja sam zapravo htio reci bi SVI NOVIJI programi ( koji su napisani na siguran nacin, koristeci funkcije koje je vec neko gore naveo :wink: ) zapravo trebali biti sigurni i nebi trebali imati ovih problema…

Hm, jos jedno pitanje - neko je spomenuo “kad hacker vrati program na server”… sta je autor htio reci ?? :wink:

Pozdrav

ICE

[quote]Baby, zaboravio si još jednu važnu funkciju, po meni poprilično opasnu:

strlen(1);

[/quote]

Ma ima tih funkcija kamara, zavisno od kompajlera i sistema npr.:

system(), getenv(), printf("%s", argv[1]); iid itd…
Ali ne moramo bas sve prosvijetliti do atoma :smiley:

[quote]
system();
[…]
Ali ne moramo bas sve prosvijetliti do atoma :D[/quote]

Sta fali ? :slight_smile:

Btw. zasto je system() opasna ?