E bas zato sto sam se zainteresovao za bufferoverflow mi i treba :o)
Svaka funkcija koja se poziva posle svog izvrsenja se vraca na mesto
poziva.Kako? U odeljku Registri sam pricao o kombinaciji CS:IP gde se IP koristi da pokazuje na offset od sledece instrukcije!Na 386+ procesorima imamo EIP
register,na novijim OS kao sto su Win i Linux sam OS vodi racuna o segmentima
tako da nam je samo EIP dovoljan za dalje cackanje po programu,ovako izgleda
poziv nekoj funkciji
call _ime_funkcije * a sa ret u toku funkcije se izlazi *
Naime kada se izvrsi call na stack se PUSHne EIP!Zasto? Pa rekao sam da funkcja
kada se pozove se vraca na mesto poziva?!Jel tako! E pa kad mi uradimo RET to
se u EIP POPne predjasnje sacuvan EIP.A sto ja uopste guram EIP na STACK.Pa
kako zasto rekli smo da se sve instrukcije izvrsavaju tako sto EIP pokazuje na
njih,kad pozvoemo funkciju EIP dobija novi offset gde pocinje funkcija!Zato
moramo da PUSHnemo EIP pre poziva(call to sam obavi) a na kraju funkcije
moramo da imamo RET sto bi bilo ekvivalentno POP EIP ili vraca se na offset
koji je bio pre poziva funkcije!:)
Ne kapiram sledece ako je ovako kako pise ovde onda bi se posle zavrsetka funkcije tok programa vratio na instrukciju koja je se neposredno izvrsila pre nego sto se funkcija pozvala i opet bi tok programa naisao na poziv ove funkcije i tako u krug ???? Dal sam ja stvarno glup ili ovo ne radi bas ovako kako je predator opisao u njegovom tut.. Logicno bi bilo da se u stack baca EIP posle pozivanja te funkcije a ne pre ??? :o)))