
buffer overflow
Cisto zo zvedavosti som si chcel vyskusat "naprogramovat" buffer overflow a nasledne ziskat rootvske prava (na mojom pc pochopitelne). Postupoval som podla nejakych prikladov kde sa vytvorili 2 programy. Prvy vyzeral v skratke takto:
char buffer[500];
strcmp(buffer, argv[1]);
Druhy program mal vytvoril len "specialny" retazec dlhsi ako 500 bytov a nasledne spustit prvy program s argumentom=retazcom. Tento retaz bol dlhy 600 bytov a hned som si myslel ze to musi spravit segmentation fault - tak sa aj stalo.
Lenze ku podivu mi uvedeny prvy program sposobi segmentation fault uz pri argumente dlhom 501 bytov.
Otazka: Zalezi to od architektury alebo od operacneho systemu alebo od verzie gcc (tym som to kompiloval) alebo od coho? Myslim ze o par bytov viac by este nemalo "nic spravit". Dufam ze niekto vie o com pisem.....
Definiciu pola mas dufam vo funkcii. Urcite tam mas strcmp a nie strcpy?
Ono je aj otazka cim si to prekladal, a ako.
P.S. ak nieco nie je jasne tak debugger, a pozriet si kde je zasobnik a co je v nom atd.
P.S. a s retazcom 490bytov to ide? Ci nahodou nemas problem niekde inde...
s tym strcpy mas samozrejme pravdu (to bol len preklep)
tie 2 riadky kodu su vo funkcii - main
prekladal som to s gcc... verziu neviem ale myslis ze cca najnovsia
P.S. inde chyva nebude lebo ked to dostane retazec dlhsi ako 500 tak spravi segmentation fault (500 a menej funguje), vlastne tu ani o tej druhy program nejde... ide mi o tom preco to spravi segmentation fault hned pri retazci dlhsom co i len o 1 byte.
To zavisi ako je robeny zasobnik vo fcii main, ona main je specialna a zavisi asi aj od prekladaca, teoreticky nemusi mat v zasobniku nic viac (ani navratovu adresu). Preto som pisal pozri si to debuggerom.
Mozes skusit ten kod dat to do nejakej podfunkcie ktoru volas z main a napis ci sa to zmeni. Ako parameter (char*) predas funkcii ten argv[1].
P.S. dalsia vec ktora zavisi od prekladaca je ze ci to pole 500 bytove urobi v zasobniku, alebo ci to rezervuje z RAM (ak by char bola ako C++ trieda tak to konstruktor moze rezervovat z heap). Tiez sa to da pozriet debuggerom. Ale gcc by snad nemal take robit.
Teraz som nemal vela casu a budem sa musiet pozriet na to tym debuggerom....
Hlavne to najprv skus dat do nejakej podfunkcie ktoru budes volat z main().
Tak zoberte si príklad
z reálneho sveta...