################### # Private Release # ################### -========================================- -= Advanced Buffer Overflow #4 (abo4.c) =- -============= Objasnjenje ==============- -========================================- by BoyScout Originalni linkovi: ~~~~~~~~~~~~~~~~~~ SITE: http://community.core-sdi.com/~gera/InsecureProgramming HTML: http://community.core-sdi.com/~gera/InsecureProgramming/abo4.html TEXT: http://community.core-sdi.com/~gera/InsecureProgramming/abo4.c -- START -- /* abo4.c * * specially crafted to feed your brain by gera@core-sdi.com */ /* After this one, the next is just an Eureka! away */ extern system,puts; void (*fn)(char*)=(void(*)(char*))&system; int main(int argv,char **argc) { char *pbuf=malloc(strlen(argc[2])+1); char buf[256]; fn=(void(*)(char*))&puts; strcpy(buf,argc[1]); strcpy(pbuf,argc[2]); fn(argc[3]); while(1); } -- END -- 0x01 - tok programa ~~~~~~~~~~~~~~~~~~~ Prije main()-a je deklariran pointer fn na funkciju. Pointer se nalazi na heapu. Program se pokrece. Deklarira se char varijabla pbuf koja ce se nalaziti na heapu (dinamicki alociran dio memorije), a za nju ce biti rezervirano onoliko mjesta koliko je velik drugi argument dobiven od strane korisnika plus jedan. Nakon toga, deklarira se char varijabla buf sa ogranicenjem od 256 bajta. Ona se nalazi na stacku. Prvi strcpy() (bez usporedjivanja velicine) kopira prvi argument u buf varijablu. Drugi strcpy() kopira drugi argument u pbuf varijablu. Izvrsava se funkcija fn na trecem korisnikovom argumentu. I na kraju imamo while(1); koji nam onemogucava da na jednostavniji nacin exploitamo program prepisujuci eip registar na stacku return adresom jer program u normalnim uvjetima staje na njemu pa se return adresa ne izvrsi. 0x02 - Just a sec! now I get it! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Dakle, da neke stvari pojasnimo. Varijabla pbuf se nalazi na heapu, ali ima svoj pointer koji se nalazi na stacku tocno iza varijable buf jer je deklariran prije nje (stack raste prema nizim memorijskim adresama). Ako promijenimo pointer pbufa tako da pokazuje na nas pointer fn koji se nalazi na nizoj memorijskoj adresi na heapu od varijable pbuf (da je obrnuto lakse bismo mogli rijesiti problem, mozemo pisati po pointeru fn koji pokazuje na funkciju fn() koja se izvrsava pred kraj programa. Sada shvacamo onaj dio koji je autor na html stranici komentirao "...what about pointers to pointers?" STACK <-- VRH DNO --> ======= ================== = BUF = = PBUF (pointer) = ======= ================== HEAP <-- DNO VRH --> =================== ======== = FN () (pointer) = ... = PBUF = =================== ======== 0x03 - kraj ~~~~~~~~~~~ Exploit pokusajte napisati sami, nadam se da ste shvatili o cemu se ovdje radi. Ma naravno da jeste ovo uopce nije komplicirano za shvatiti. Mislim da sam napisao ovo za one kojima se neda razbijati glava, da mozda nesto novo spoznaju/nauce. I toplo se nadam da nisam nigdje pogrijesio, jer ako jesam... *gulp* Greetsi idu ljudima kojima sam osobno poslao txt, oni znaju koji su :) Cya --BoyScout