Tema : ABO2.c <- problem oko rusenja ??! -----[ Buffer overflows ]----- abo2.c Ovako, mnogi su pitali zasto ovaj code se ne srusi ako prenapunimo buffer : int main(int argv,char **argc) { char buf[256]; strcpy(buf,argc[1]); exit(1); } ----- main je funkcija. Kada se zove funkcija (Call), na stack se PUSH-ne EIP i na kraju funkcije, kada dodje do izvrsenja ret instrukcije, POP-ne se EIP i nastavlja se code nakon Call-a (ako ga ima). znaci, recimo da lakse shvate neki : Call = PUSH EIP ret = POP EIP sto je problem sa gore napisanim code-om ? ako ga kompajlirate i disassemblirate ... necete vidjet ret instrukciju...znaci, nece se POP-at EIP sa STACK-a... Naravno, ako buffer prenapunite, overflow ce bit ...tj. EIP ce bit prepisan na STACK-u, ali to nije direktnu u registru EIP-a, da dode tamo, mora se izvrsit RET instrukcija, a exit() prekida program ...bez return naredbe... zato se program nece srusit... Ako su neki zakljucili, ako kopiramo previse nego sto buffer moze primit, znaci, odmah nakon recimo strcpy naredbe,da je EIP prepisan tj. da se pokrece recimo shellcode ...nije istina. TIP je prepisan, ali na STACK-u, da dode do registra...prog ide do kraja funkcije tj. izvrsava ret EIP (sa stack-a vrijednost) dolazi u registar EIP i to je to. Dokaz ? napisite sitan program i debugirajte ga... ---------- Fr1c Security Research Lab - 2001 - PhreakCore fr1c@phreakcore.org