Ĺadny brzuch
Witam
Tak sobie pomyślałem: argumenty dane programowi, napisanemu w C/C++ to typ char (char * argv[]). Zmienna tego typu może pomieścic chyba (jeżeli się mylę, to mnie poprawcie) do 64 KB tekstu. A gdyby tak dac więcej i spowodowac stack overflow? Co o tym myślicie?
Pozdrówka
Użytkownik MZet edytował ten post 30 czerwiec 2005, 10:16
Witam
Tak sobie pomyślałem: argumenty dane programowi, napisanemu w C/C++ to typ char (char * argv[]). Zmienna tego typu może pomieścic chyba (jeżeli się mylę, to mnie poprawcie) do 64 KB tekstu. A gdyby tak dac więcej i spowodowac stack overflow? Co o tym myślicie?
Pozdrówka
Ekhm... Chyba się nieprecyzyjnie wyraziłem (wybacz, skrót myślowy :)). Chodziło mi o przekazanie do programu ciągu znaków o zbyt dużej długości. Mówisz, że 64 kB nie ma racji bytu? Ależ ma - przecież łancuch znaków nie ma chyba ograniczonej długości...
// EDIT: co do systemu - może sprecyzuj? Winda np. ma takie ograniczenie?
Pozdro
Użytkownik MZet edytował ten post 30 czerwiec 2005, 11:19
Mówisz, że 64 kB nie ma racji bytu? Ależ ma
Na twoim miejscu bym nie podwazal moich wypowiedzi :old: :shades:
Dobrze, Święta Wyrocznio :)
Oki, nieważne... Nie drążmy tego tematu. Proponuję EOT.
ale jak ktos juz uzywa tych danych to pewnie kopijue je za pomoca strncpy albo czegos podobnego wiec i tak nic bys nie wskoral. poza tym - czy to mial byc *twoj* *pomysl* ?
Jeszcze nie slyszalem zeby wskaznik do char mial ograniczenie:D
A jezeli chodzi o stackoverflow to ty nawet czarami go w windowsie nie wywolasz ( a nawet jezeli to nie bedziesz wiedzial bo windows takich niesamowitych informacji nie raczy pokazywac userowi). Jakbys zaluwazyl to pamiec wirtualna procesu w windows zaczyna sie ok. 3 GiB. Wiec stos prawdopodobnie jest ponizej czyli górna granica stosu to 3GiB ( stos liczony jest od góry ). Wiec co najwyzej mozesz spowodowac Page Fault z cr2 usawionym na 3GiB - sizeof_stack_in_ring3 ( czy kto tam wie w jakim ringu dzialają aplikacje pod windą :). Wiec co najwyzej twoje mażenia o niesamowitcyh bledach systemu rozprysnęły się, bo tym co chciałeś zrobić to najwyzej sobie program zamkniesz poprzez uprzednie wywolanie Page Fault.
A jezeli chodzi o stackoverflow to ty nawet czarami go w windowsie nie wywolasz Zara moment :P. Sami experci na tym forum ... No to ja bede magiem :blink:
To ja otwieram cyrk ( mam magika ).
A tak z drugiej strony to moze fakt - spowodujesz page-fault, windows sobie nie poradzi (tak to z window$ami bywa:D) i zawiesisz windows ( ale zawieszenie tego shitu nie jest jakims szczgolnym osiagnieciem:P )
sorry ze co chwile sie dopisuje ale musze powiedziec, ze system chroni sie przed takimi *pomyslami* uzytkownika, w moim systemiku jest to zrobione w ten sposob ze argv i argc jest kladzione w 3 GiB pamieci virtualnej procesu, z tamtąd crt0 odczutyje je z tamtad i zrzuca na stos, poczym wywoluje main'a. Wiec po pierwzse jeszcze raz argv NIE ma ograniczen, a po drugie argc mozna nazwa jedynym ograniczeniem argv, rozmiar argc to w rmode 16, a w pmode 32 bity.
to co mowisz to juz jest belkot :) i nic on nie znaczy :> a stack overflow to nawet prosta rekurencja mozesz sobie wywolac :> i windows nawet cie o tym poinformuje :)
chlopcze nie mow oczyms, czego nawet nie rozumiesz.
macie tu jakas stara wersje obslugi wyjatkow dla mojego kernela.
zaznacze trzema gwaizkami to czego nie rozumiecie.
/* * /NetOSr0/kernel/exceptions.c * * about: Exception Handler * * author: Grzegorz Pelechaty * * language: Polish * * code-page: iso-8859-2 * * Copyright 2004 - 2005 ® * */ #include <netos/process.h> #include <netos/types.h> #include <netos/idt.h> #include <netos/gdt.h> #include <netos/system.h> #include <netos/segment.h> #include <netos/kernel.h> #include <netos/status.h> #include <netos/io.h> #include <netos/deamons/deamon.h> #include <netos/app/application.h> ; NORETURN valid_exception(UINT32 nr); NORETURN invalid_exception(UINT32 nr); kernel_process_t *exceptions[19]; kernel_process_t *valid_exception_deamon; kernel_process_t *invalid_exception_deamon; volatile uint32 dada; char *ex_name[19] = { "Divide error fault", "Debug trap/fault", "NMI received", "Breakpoint trap", "Overflow trap", *** twoje stack overflow "Bound range exceeded fault", "Invalid opcode fault", "Device not avalaible", "Double fault abort", "Coprocessor segment overrun abort", "Invalid TSS fault", "Segment not present fault", "Stack fault", *** a oto chodzi w poscie "General protection fault", "Memory fault", "Buggy CPU non-fault", "Floating point error fault", "Alignment check fault ", "Machine check abort" }; extern NORETURN exception_0(NOARG); extern NORETURN exception_1(NOARG); extern NORETURN exception_2(NOARG); extern NORETURN exception_3(NOARG); extern NORETURN exception_4(NOARG); extern NORETURN exception_5(NOARG); extern NORETURN exception_6(NOARG); extern NORETURN exception_7(NOARG); extern NORETURN exception_8(NOARG); extern NORETURN exception_9(NOARG); extern NORETURN exception_A(NOARG); extern NORETURN exception_B(NOARG); extern NORETURN exception_C(NOARG); extern NORETURN exception_D(NOARG); extern NORETURN exception_E(NOARG); extern NORETURN exception_F(NOARG); extern NORETURN exception_10(NOARG); extern NORETURN exception_11(NOARG); extern NORETURN exception_12(NOARG); extern NORETURN exception_unknown(NOARG); NORETURN new_exception_gate(UINT32 nr, UINT32 addr) { valid_exception_deamon = _create_kernel_Hdeamon(addr); _set_gate(nr, valid_exception_deamon -> gdt_entry, NULL, IDT_PRESENT | IDT_TASK | IDT_DPL3); exceptions[nr] = valid_exception_deamon; } volatile kernel_process_t *to_death; kernel_deamon_t *destroyer_deamon; NORETURN deleter(NOARG) { while(1) { if (dada == 1) { cli(); outb(0x20,0x20); outb(0x20,0xA0); kernel_application_t *app; app = to_death -> _root_addr; /*_destroy_kernel_process( to_death ); _delete_kernel_application( app ); _destroy_kernel_application( app ); _send_kernel_warrning("DELETER: DONE\n");*/ to_death = NULL; dada = 0; sti(); } } } NORETURN init_exceptions(NOARG) { UINT32 i; /*new_exception_gate(0x0, (uint32)&exception_0); new_exception_gate(0x1, (uint32)&exception_1); new_exception_gate(0x2, (uint32)&exception_2); new_exception_gate(0x3, (uint32)&exception_3); new_exception_gate(0x4, (uint32)&exception_4); new_exception_gate(0x5, (uint32)&exception_5); new_exception_gate(0x6, (uint32)&exception_6); new_exception_gate(0x7, (uint32)&exception_7); new_exception_gate(0x8, (uint32)&exception_8); new_exception_gate(0x9, (uint32)&exception_9); new_exception_gate(0xA, (uint32)&exception_A); new_exception_gate(0xB, (uint32)&exception_B); new_exception_gate(0xC, (uint32)&exception_C); new_exception_gate(0xD, (uint32)&exception_D); new_exception_gate(0xE, (uint32)&exception_E); new_exception_gate(0xF, (uint32)&exception_F); new_exception_gate(0x10, (uint32)&exception_10); new_exception_gate(0x11, (uint32)&exception_11); new_exception_gate(0x12, (uint32)&exception_12);*/ // valid_exception_deamon = _create_kernel_Hdeamon(&exception_unknown); //invalid_exception_deamon = _create_kernel_Hdeamon(&invalid_exception); // for(i = 0x13; i < 0x20; i++) // _set_gate(i, valid_exception_deamon -> gdt_entry, NULL, IDT_PRESENT | IDT_TASK | IDT_DPL0); // destroyer_deamon = _create_kernel_deamon(&deleter,"Destroyer",0); // _register_kernel_process(destroyer_deamon -> deamon_process); } extern kernel_process_t *current; extern kernel_process_t *last; extern kernel_process_t *idle_process; extern kernel_process_t *process_changer; typedef struct to_kill_s { UINT32 addres; UINT8 exception_nr; } to_kill_t; volatile to_kill_t to_kill; #define DEBUG extern UINT32 *PROCESSES_DATA_BASE; NORETURN valid_exception(UINT32 nr) { //outb(0x20, 0xA0); // Reset 8259A line... //outb(0x20,0x20); //_unregister_kernel_process(current); //to_kill.addres = (UINT32 *)current; //to_kill.exception_nr = nr; //printk("EXCEPTION NR: %i",nr); //halt(); disable_scheduler(); panic( current, nr ); enable_scheduler(); //_unregister_kernel_process(current); //exceptions[nr] -> tss.previous = idle_process -> gdt_entry; } NORETURN invalid_exception(UINT32 nr) { panic(0); to_death = current; /*panic(nr); printk("Exception 0x%x is not a core point...\n",nr); printk("Please reboot computer.\n"); halt();*/ } NORETURN panic(kernel_process_t *process, UINT32 nr) { INT32 status; if ((pid_t)process -> pid == (pid_t)NULL) // This is a NULL pid ?? { print_process( idle_process ); if ( nr <= 0x12 ) printk("PANIC: %s\n",ex_name[nr]); else printk("PANIC: Undefined exception in thread stack...\n"); printk("KERNEL PANIC: core crashed -> system crashed...\n\n"); printk("Please reboot computer.\n"); halt(); } if (_search_by_pid(process -> pid) != FAILURE) { printk("System Protection Fault at: "); print_date(); printk("\n\n"); print_process( process ); if ( nr <= 0x12 ) printk("PANIC: %s\n",ex_name[nr]); else printk("PANIC: Undefined exception in thread stack...\n"); /* * Check if this is a page fault */ if ( nr == 0xE ) { printk("\ndetails:\n"); printk("Access volation at address: %p\n",get_register_cr2()); } status = _unregister_kernel_process( process ); #ifdef _EXECPTIONS_DEBUG_ if (status == ESUCCESS ) printk("[ thread deleted from scheduler queue ]\n"); else printk("[ zombie thread is alive! ]\n"); #endif } else { printk("Double fault before destroy operation...\n"); _unregister_kernel_process( process ); } }
Użytkownik qwas edytował ten post 30 czerwiec 2005, 20:35
A Ty caly czas piszesz o jakims programowym bledzie przepelnienia bufora procesu. Ale ty nawet nie wiesz co to jest. Dzieki temu windows moze powiadomic o takich rzeczch nawet nim sie cos takiego wydarzy. I na drugi raz zastanówcie się co piszecie.
A jezeli chodzi o stackoverflow to ty nawet czarami go w windowsie nie wywolasz ( a nawet jezeli to nie bedziesz wiedzial bo windows takich niesamowitych informacji nie raczy pokazywac userowi). Jakbys zaluwazyl to pamiec wirtualna procesu w windows zaczyna sie ok. 3 GiB. Wiec stos prawdopodobnie jest ponizej czyli górna granica stosu to 3GiB ( stos liczony jest od góry ). Sorki ze dopiero teraz ale musialem wziac dziecko na łąki coby sobie na myszki polne popolowalo :].
A teraz do rzeczy : Tobie sie chyba pomylilo o czym my tu w ogole rozmawiamy :). Forst of all - pentium 32bit jest w stanie adresowac do 4GB na stos. Second - rozmiar stosu przydzielony aplikacji != rozmiar maksymalny. Wiec z czym do ludzi ?. Zamiast sie puszyc kodem (BTW - nie ty jeden takie rzeczy piszesz :) ) wystarczy zerknac na spec np kompilatora CL microsoftu. Zobaczysz ze domyslnby commit dla stosu to 1MB. Przekroczenie go wywola wyjatek przepelnienia stosu. Tak jak AoD (alias marcepanowy czopek) powiedzial - wystarczy zwykla rekurencja zeby wywalic program :).
Samples : (sory za tyle ale nie mam za duzo czasu sie bawic z Wami :) ) :
http://www.bf2engine.com/kse/stack.png
I o tym caly czas prawimy a ty zes wyskoczyl jak filip z konopii :P
EDIT :
I nie chodzi o przerwanie 12 - blad stosu - ale o przepelnienie stosu. **O TYM MOWIMY W POSCIE ** (tez dalem Ci w gwiazdkach zebys zobaczyl).
Użytkownik st3tc edytował ten post 30 czerwiec 2005, 20:57
Mam wam wyslac caly system:P
Wy gadacie tutaj o jakis urojonych wariacjach windowsa, itp, itd..
Zrozumcie koles chce przepelnic stos, chodzi mu o argc i argv (dos , lub windows console), to są srodowska bardzo połączone ze sprzętem, więc zostaje przy moim:P
Ej - ja WIEM co to jest przerwanie 12 :). Chcesz to Ci moge zaraz cala liste podac ;).
Zrozum - MZet i tak nie czai po co i dla czego jest 12. Ide o 100% zakladu ze chodzi mu o "klasyczne" wywalenie programu przez przepelnienie stosu - tak mozna bylo z powodzeniem wysypac Win32/64. Dlatego nasze opisy nie odnosza sie do architektury sprzetowej - ale do tego co moze On zrobic :].
(Choc sam nie jestep pewien - MZet chyba tez nie :ph34r: ). Nie posadzaj go ze zna arch. x86 :) (a moze sie myle ...). Trzeba podejsc do tego w ten sposob : "co user mogl miec na mysli" a nie "co ja wiem na ten temat" :)
// BTW - nie pamietam dokladnie ale w zwyklym dos-ie mozna bylo z powodzeniem przepelnic stos.
Użytkownik st3tc edytował ten post 30 czerwiec 2005, 21:04
I po pierwsze: tak jak widzicie stos zaczyna sie w 3GiB(dolna granica) ( patrz screenshot )
Overflow występuje z powodu rekurencji ( kompilator wyczil overflow trap w kodzie ) czyli przpelnienie buforu w programowego procesu i......... wyszlo na moje:P
( kompilator wyczil overflow trap w kodzie )
Po pierwsze sorki, bo tego wtojego ostatniego postu nie zauwazylem, gdybym zauwazyl to bym nie wyslal ostatniego:) Wielkie sorry (wszyo ze zachowalem sie jak dziecko) pod rugie "kompilator WYCZAIŁ <- lterówka"
Pozdro
i jeszcze jedno - nie kompilator tylko debuger ( ja nazywam kompilatorem cale IDE)
i jeszcze jedno - nie kompilator tylko debuger ( ja nazywam kompilatorem cale IDE)
Zobaczysz ze domyslnby commit dla stosu to 1MB. Przekroczenie go wywola wyjatek przepelnienia stosu.
No mogę się pochwalic że to i ja wiem :P
I jeszcze jedno - st3tc, nie bądź aż taki mądry... Dlaczego sądzisz, że miałbym nie znac architektury? Owszem, nie znam jej na tyle jak ty, ale to nie znaczy, że ja to już NIC kompletnie nie wiem...
BTW - reqst, czemu nazywasz windę shitem? I jakiego ty systemu używasz?
Hehe, wszystkie systemy Micro$oftu to shity (włącz zostaw na dzień i przyjdż zobacz rezulataty - po kilku godzinach juz siadl - pewien znajomy mowil mi, ze probowal kiedys wytlumaczyc swojemu amerykanskiemu koledze, ktory uzywal MacOS'a, co to znaczy ze system się zawiesił :P On się zapytał:
- to co wtedy sie dzieje, jak się zawiesi?
- no wlasnie sęk w tym, że nic:))))
Reszte dopowiedz sobie sam.
Ja uzywam teraz systemu NETCore :) (ale do pisania jego uzywam Linuxa (tez kupa, ale mam idealnie skonfigurowanego zeby tylko usiasc, pisac i testowac)
Dlaczego sądzisz, że miałbym nie znac architektury? Owszem, nie znam jej na tyle jak ty, ale to nie znaczy, że ja to już NIC kompletnie nie wiem... Moze po Twoich poprzednich wyczynach na forum ? :). Jak zobacze, ze sie zmieniles to zmienie osady co do Twojej osoby :]
reqst - I jak tam to twoje przerwanie przepelnienia wynikow oper. arytm. zwane u ciebie przepelnieniem stosu ? :). Doczytales juz ? Bo cos zamilkles ...
Użytkownik st3tc edytował ten post 01 lipiec 2005, 10:56
Oj widzisz, nie wszystko jest w ksiazkach i jakis info ze stron inetala. Nieraz trzeba bazowac na wlasnych doswiadczeniach, a ja podczas pisania swojego O.S'a wlasnie takich zdobywam coraz wiecej. Wiec uwiez mi na slowo - stack overflow wystepuje z roznych powodow ( nie mowie ze zle piszesz - przeciez intel lepiej wie:P )
Co powiesz na to:
Mailem taką kiedys werjsę kernel'a, że jak naciskałeś z 3 minuty 'enter' to ci wyskakiwal: 'Invalid TSS fault' ;)
st3tc, ja tylko o jedno Cię proszę: wiem, że masz ogromną wiedzę, dużo większą od mojej, ale miej wyrozumiałośc dla ludzi początkujących i o wiele zapewne młodszych od Ciebie (takich jak ja), którym chcę się choc cokolwiek ambitniejszego robic na komuterze, a nie tylko grac jak większośc moich kolegów...
czesc czolem
co st3tc nie ma wyrozumiałosci dla ciebie? poka gdzie?
reqst: ładnie piszesz os'y super, naprawdę wiele musisz wiedzieć ale wyluzuj troszkę bo jesteś za bardzo waleczny (o to dobre słowo :) ).
pozdro
spax.
Użytkownik spax edytował ten post 01 lipiec 2005, 17:55
poka gdzie?
Na pewno widziałem że w wielu miejscach próbował ci pomagać(razem z innymi) tylko ty nie chciałeś tego zauważyć.
PS. Normalnie jak Visual. (nie zrozumiesz ;p)
zanotowane.pl doc.pisz.pl pdf.pisz.pl zsf.htw.pl
Tak sobie pomyślałem: argumenty dane programowi, napisanemu w C/C++ to typ char (char * argv[]). Zmienna tego typu może pomieścic chyba (jeżeli się mylę, to mnie poprawcie) do 64 KB tekstu. A gdyby tak dac więcej i spowodowac stack overflow? Co o tym myślicie?
Pozdrówka
Użytkownik MZet edytował ten post 30 czerwiec 2005, 10:16
Witam
Tak sobie pomyślałem: argumenty dane programowi, napisanemu w C/C++ to typ char (char * argv[]). Zmienna tego typu może pomieścic chyba (jeżeli się mylę, to mnie poprawcie) do 64 KB tekstu. A gdyby tak dac więcej i spowodowac stack overflow? Co o tym myślicie?
Pozdrówka

Ekhm... Chyba się nieprecyzyjnie wyraziłem (wybacz, skrót myślowy :)). Chodziło mi o przekazanie do programu ciągu znaków o zbyt dużej długości. Mówisz, że 64 kB nie ma racji bytu? Ależ ma - przecież łancuch znaków nie ma chyba ograniczonej długości...
// EDIT: co do systemu - może sprecyzuj? Winda np. ma takie ograniczenie?
Pozdro
Użytkownik MZet edytował ten post 30 czerwiec 2005, 11:19
Mówisz, że 64 kB nie ma racji bytu? Ależ ma

Na twoim miejscu bym nie podwazal moich wypowiedzi :old: :shades:
Dobrze, Święta Wyrocznio :)
Oki, nieważne... Nie drążmy tego tematu. Proponuję EOT.
ale jak ktos juz uzywa tych danych to pewnie kopijue je za pomoca strncpy albo czegos podobnego wiec i tak nic bys nie wskoral. poza tym - czy to mial byc *twoj* *pomysl* ?
Jeszcze nie slyszalem zeby wskaznik do char mial ograniczenie:D
A jezeli chodzi o stackoverflow to ty nawet czarami go w windowsie nie wywolasz ( a nawet jezeli to nie bedziesz wiedzial bo windows takich niesamowitych informacji nie raczy pokazywac userowi). Jakbys zaluwazyl to pamiec wirtualna procesu w windows zaczyna sie ok. 3 GiB. Wiec stos prawdopodobnie jest ponizej czyli górna granica stosu to 3GiB ( stos liczony jest od góry ). Wiec co najwyzej mozesz spowodowac Page Fault z cr2 usawionym na 3GiB - sizeof_stack_in_ring3 ( czy kto tam wie w jakim ringu dzialają aplikacje pod windą :). Wiec co najwyzej twoje mażenia o niesamowitcyh bledach systemu rozprysnęły się, bo tym co chciałeś zrobić to najwyzej sobie program zamkniesz poprzez uprzednie wywolanie Page Fault.
A jezeli chodzi o stackoverflow to ty nawet czarami go w windowsie nie wywolasz Zara moment :P. Sami experci na tym forum ... No to ja bede magiem :blink:
To ja otwieram cyrk ( mam magika ).
A tak z drugiej strony to moze fakt - spowodujesz page-fault, windows sobie nie poradzi (tak to z window$ami bywa:D) i zawiesisz windows ( ale zawieszenie tego shitu nie jest jakims szczgolnym osiagnieciem:P )
sorry ze co chwile sie dopisuje ale musze powiedziec, ze system chroni sie przed takimi *pomyslami* uzytkownika, w moim systemiku jest to zrobione w ten sposob ze argv i argc jest kladzione w 3 GiB pamieci virtualnej procesu, z tamtąd crt0 odczutyje je z tamtad i zrzuca na stos, poczym wywoluje main'a. Wiec po pierwzse jeszcze raz argv NIE ma ograniczen, a po drugie argc mozna nazwa jedynym ograniczeniem argv, rozmiar argc to w rmode 16, a w pmode 32 bity.
to co mowisz to juz jest belkot :) i nic on nie znaczy :> a stack overflow to nawet prosta rekurencja mozesz sobie wywolac :> i windows nawet cie o tym poinformuje :)
chlopcze nie mow oczyms, czego nawet nie rozumiesz.
macie tu jakas stara wersje obslugi wyjatkow dla mojego kernela.
zaznacze trzema gwaizkami to czego nie rozumiecie.
/* * /NetOSr0/kernel/exceptions.c * * about: Exception Handler * * author: Grzegorz Pelechaty * * language: Polish * * code-page: iso-8859-2 * * Copyright 2004 - 2005 ® * */ #include <netos/process.h> #include <netos/types.h> #include <netos/idt.h> #include <netos/gdt.h> #include <netos/system.h> #include <netos/segment.h> #include <netos/kernel.h> #include <netos/status.h> #include <netos/io.h> #include <netos/deamons/deamon.h> #include <netos/app/application.h> ; NORETURN valid_exception(UINT32 nr); NORETURN invalid_exception(UINT32 nr); kernel_process_t *exceptions[19]; kernel_process_t *valid_exception_deamon; kernel_process_t *invalid_exception_deamon; volatile uint32 dada; char *ex_name[19] = { "Divide error fault", "Debug trap/fault", "NMI received", "Breakpoint trap", "Overflow trap", *** twoje stack overflow "Bound range exceeded fault", "Invalid opcode fault", "Device not avalaible", "Double fault abort", "Coprocessor segment overrun abort", "Invalid TSS fault", "Segment not present fault", "Stack fault", *** a oto chodzi w poscie "General protection fault", "Memory fault", "Buggy CPU non-fault", "Floating point error fault", "Alignment check fault ", "Machine check abort" }; extern NORETURN exception_0(NOARG); extern NORETURN exception_1(NOARG); extern NORETURN exception_2(NOARG); extern NORETURN exception_3(NOARG); extern NORETURN exception_4(NOARG); extern NORETURN exception_5(NOARG); extern NORETURN exception_6(NOARG); extern NORETURN exception_7(NOARG); extern NORETURN exception_8(NOARG); extern NORETURN exception_9(NOARG); extern NORETURN exception_A(NOARG); extern NORETURN exception_B(NOARG); extern NORETURN exception_C(NOARG); extern NORETURN exception_D(NOARG); extern NORETURN exception_E(NOARG); extern NORETURN exception_F(NOARG); extern NORETURN exception_10(NOARG); extern NORETURN exception_11(NOARG); extern NORETURN exception_12(NOARG); extern NORETURN exception_unknown(NOARG); NORETURN new_exception_gate(UINT32 nr, UINT32 addr) { valid_exception_deamon = _create_kernel_Hdeamon(addr); _set_gate(nr, valid_exception_deamon -> gdt_entry, NULL, IDT_PRESENT | IDT_TASK | IDT_DPL3); exceptions[nr] = valid_exception_deamon; } volatile kernel_process_t *to_death; kernel_deamon_t *destroyer_deamon; NORETURN deleter(NOARG) { while(1) { if (dada == 1) { cli(); outb(0x20,0x20); outb(0x20,0xA0); kernel_application_t *app; app = to_death -> _root_addr; /*_destroy_kernel_process( to_death ); _delete_kernel_application( app ); _destroy_kernel_application( app ); _send_kernel_warrning("DELETER: DONE\n");*/ to_death = NULL; dada = 0; sti(); } } } NORETURN init_exceptions(NOARG) { UINT32 i; /*new_exception_gate(0x0, (uint32)&exception_0); new_exception_gate(0x1, (uint32)&exception_1); new_exception_gate(0x2, (uint32)&exception_2); new_exception_gate(0x3, (uint32)&exception_3); new_exception_gate(0x4, (uint32)&exception_4); new_exception_gate(0x5, (uint32)&exception_5); new_exception_gate(0x6, (uint32)&exception_6); new_exception_gate(0x7, (uint32)&exception_7); new_exception_gate(0x8, (uint32)&exception_8); new_exception_gate(0x9, (uint32)&exception_9); new_exception_gate(0xA, (uint32)&exception_A); new_exception_gate(0xB, (uint32)&exception_B); new_exception_gate(0xC, (uint32)&exception_C); new_exception_gate(0xD, (uint32)&exception_D); new_exception_gate(0xE, (uint32)&exception_E); new_exception_gate(0xF, (uint32)&exception_F); new_exception_gate(0x10, (uint32)&exception_10); new_exception_gate(0x11, (uint32)&exception_11); new_exception_gate(0x12, (uint32)&exception_12);*/ // valid_exception_deamon = _create_kernel_Hdeamon(&exception_unknown); //invalid_exception_deamon = _create_kernel_Hdeamon(&invalid_exception); // for(i = 0x13; i < 0x20; i++) // _set_gate(i, valid_exception_deamon -> gdt_entry, NULL, IDT_PRESENT | IDT_TASK | IDT_DPL0); // destroyer_deamon = _create_kernel_deamon(&deleter,"Destroyer",0); // _register_kernel_process(destroyer_deamon -> deamon_process); } extern kernel_process_t *current; extern kernel_process_t *last; extern kernel_process_t *idle_process; extern kernel_process_t *process_changer; typedef struct to_kill_s { UINT32 addres; UINT8 exception_nr; } to_kill_t; volatile to_kill_t to_kill; #define DEBUG extern UINT32 *PROCESSES_DATA_BASE; NORETURN valid_exception(UINT32 nr) { //outb(0x20, 0xA0); // Reset 8259A line... //outb(0x20,0x20); //_unregister_kernel_process(current); //to_kill.addres = (UINT32 *)current; //to_kill.exception_nr = nr; //printk("EXCEPTION NR: %i",nr); //halt(); disable_scheduler(); panic( current, nr ); enable_scheduler(); //_unregister_kernel_process(current); //exceptions[nr] -> tss.previous = idle_process -> gdt_entry; } NORETURN invalid_exception(UINT32 nr) { panic(0); to_death = current; /*panic(nr); printk("Exception 0x%x is not a core point...\n",nr); printk("Please reboot computer.\n"); halt();*/ } NORETURN panic(kernel_process_t *process, UINT32 nr) { INT32 status; if ((pid_t)process -> pid == (pid_t)NULL) // This is a NULL pid ?? { print_process( idle_process ); if ( nr <= 0x12 ) printk("PANIC: %s\n",ex_name[nr]); else printk("PANIC: Undefined exception in thread stack...\n"); printk("KERNEL PANIC: core crashed -> system crashed...\n\n"); printk("Please reboot computer.\n"); halt(); } if (_search_by_pid(process -> pid) != FAILURE) { printk("System Protection Fault at: "); print_date(); printk("\n\n"); print_process( process ); if ( nr <= 0x12 ) printk("PANIC: %s\n",ex_name[nr]); else printk("PANIC: Undefined exception in thread stack...\n"); /* * Check if this is a page fault */ if ( nr == 0xE ) { printk("\ndetails:\n"); printk("Access volation at address: %p\n",get_register_cr2()); } status = _unregister_kernel_process( process ); #ifdef _EXECPTIONS_DEBUG_ if (status == ESUCCESS ) printk("[ thread deleted from scheduler queue ]\n"); else printk("[ zombie thread is alive! ]\n"); #endif } else { printk("Double fault before destroy operation...\n"); _unregister_kernel_process( process ); } }
Użytkownik qwas edytował ten post 30 czerwiec 2005, 20:35
A Ty caly czas piszesz o jakims programowym bledzie przepelnienia bufora procesu. Ale ty nawet nie wiesz co to jest. Dzieki temu windows moze powiadomic o takich rzeczch nawet nim sie cos takiego wydarzy. I na drugi raz zastanówcie się co piszecie.
A jezeli chodzi o stackoverflow to ty nawet czarami go w windowsie nie wywolasz ( a nawet jezeli to nie bedziesz wiedzial bo windows takich niesamowitych informacji nie raczy pokazywac userowi). Jakbys zaluwazyl to pamiec wirtualna procesu w windows zaczyna sie ok. 3 GiB. Wiec stos prawdopodobnie jest ponizej czyli górna granica stosu to 3GiB ( stos liczony jest od góry ). Sorki ze dopiero teraz ale musialem wziac dziecko na łąki coby sobie na myszki polne popolowalo :].
A teraz do rzeczy : Tobie sie chyba pomylilo o czym my tu w ogole rozmawiamy :). Forst of all - pentium 32bit jest w stanie adresowac do 4GB na stos. Second - rozmiar stosu przydzielony aplikacji != rozmiar maksymalny. Wiec z czym do ludzi ?. Zamiast sie puszyc kodem (BTW - nie ty jeden takie rzeczy piszesz :) ) wystarczy zerknac na spec np kompilatora CL microsoftu. Zobaczysz ze domyslnby commit dla stosu to 1MB. Przekroczenie go wywola wyjatek przepelnienia stosu. Tak jak AoD (alias marcepanowy czopek) powiedzial - wystarczy zwykla rekurencja zeby wywalic program :).
Samples : (sory za tyle ale nie mam za duzo czasu sie bawic z Wami :) ) :
http://www.bf2engine.com/kse/stack.png
I o tym caly czas prawimy a ty zes wyskoczyl jak filip z konopii :P
EDIT :
I nie chodzi o przerwanie 12 - blad stosu - ale o przepelnienie stosu. **O TYM MOWIMY W POSCIE ** (tez dalem Ci w gwiazdkach zebys zobaczyl).
Użytkownik st3tc edytował ten post 30 czerwiec 2005, 20:57
Mam wam wyslac caly system:P
Wy gadacie tutaj o jakis urojonych wariacjach windowsa, itp, itd..
Zrozumcie koles chce przepelnic stos, chodzi mu o argc i argv (dos , lub windows console), to są srodowska bardzo połączone ze sprzętem, więc zostaje przy moim:P
Ej - ja WIEM co to jest przerwanie 12 :). Chcesz to Ci moge zaraz cala liste podac ;).
Zrozum - MZet i tak nie czai po co i dla czego jest 12. Ide o 100% zakladu ze chodzi mu o "klasyczne" wywalenie programu przez przepelnienie stosu - tak mozna bylo z powodzeniem wysypac Win32/64. Dlatego nasze opisy nie odnosza sie do architektury sprzetowej - ale do tego co moze On zrobic :].
(Choc sam nie jestep pewien - MZet chyba tez nie :ph34r: ). Nie posadzaj go ze zna arch. x86 :) (a moze sie myle ...). Trzeba podejsc do tego w ten sposob : "co user mogl miec na mysli" a nie "co ja wiem na ten temat" :)
// BTW - nie pamietam dokladnie ale w zwyklym dos-ie mozna bylo z powodzeniem przepelnic stos.
Użytkownik st3tc edytował ten post 30 czerwiec 2005, 21:04
I po pierwsze: tak jak widzicie stos zaczyna sie w 3GiB(dolna granica) ( patrz screenshot )
Overflow występuje z powodu rekurencji ( kompilator wyczil overflow trap w kodzie ) czyli przpelnienie buforu w programowego procesu i......... wyszlo na moje:P
( kompilator wyczil overflow trap w kodzie )

Po pierwsze sorki, bo tego wtojego ostatniego postu nie zauwazylem, gdybym zauwazyl to bym nie wyslal ostatniego:) Wielkie sorry (wszyo ze zachowalem sie jak dziecko) pod rugie "kompilator WYCZAIŁ <- lterówka"
Pozdro
i jeszcze jedno - nie kompilator tylko debuger ( ja nazywam kompilatorem cale IDE)
i jeszcze jedno - nie kompilator tylko debuger ( ja nazywam kompilatorem cale IDE)

Zobaczysz ze domyslnby commit dla stosu to 1MB. Przekroczenie go wywola wyjatek przepelnienia stosu.
No mogę się pochwalic że to i ja wiem :P
I jeszcze jedno - st3tc, nie bądź aż taki mądry... Dlaczego sądzisz, że miałbym nie znac architektury? Owszem, nie znam jej na tyle jak ty, ale to nie znaczy, że ja to już NIC kompletnie nie wiem...
BTW - reqst, czemu nazywasz windę shitem? I jakiego ty systemu używasz?
Hehe, wszystkie systemy Micro$oftu to shity (włącz zostaw na dzień i przyjdż zobacz rezulataty - po kilku godzinach juz siadl - pewien znajomy mowil mi, ze probowal kiedys wytlumaczyc swojemu amerykanskiemu koledze, ktory uzywal MacOS'a, co to znaczy ze system się zawiesił :P On się zapytał:
- to co wtedy sie dzieje, jak się zawiesi?
- no wlasnie sęk w tym, że nic:))))
Reszte dopowiedz sobie sam.
Ja uzywam teraz systemu NETCore :) (ale do pisania jego uzywam Linuxa (tez kupa, ale mam idealnie skonfigurowanego zeby tylko usiasc, pisac i testowac)
Dlaczego sądzisz, że miałbym nie znac architektury? Owszem, nie znam jej na tyle jak ty, ale to nie znaczy, że ja to już NIC kompletnie nie wiem... Moze po Twoich poprzednich wyczynach na forum ? :). Jak zobacze, ze sie zmieniles to zmienie osady co do Twojej osoby :]
reqst - I jak tam to twoje przerwanie przepelnienia wynikow oper. arytm. zwane u ciebie przepelnieniem stosu ? :). Doczytales juz ? Bo cos zamilkles ...
Użytkownik st3tc edytował ten post 01 lipiec 2005, 10:56
Oj widzisz, nie wszystko jest w ksiazkach i jakis info ze stron inetala. Nieraz trzeba bazowac na wlasnych doswiadczeniach, a ja podczas pisania swojego O.S'a wlasnie takich zdobywam coraz wiecej. Wiec uwiez mi na slowo - stack overflow wystepuje z roznych powodow ( nie mowie ze zle piszesz - przeciez intel lepiej wie:P )
Co powiesz na to:
Mailem taką kiedys werjsę kernel'a, że jak naciskałeś z 3 minuty 'enter' to ci wyskakiwal: 'Invalid TSS fault' ;)
st3tc, ja tylko o jedno Cię proszę: wiem, że masz ogromną wiedzę, dużo większą od mojej, ale miej wyrozumiałośc dla ludzi początkujących i o wiele zapewne młodszych od Ciebie (takich jak ja), którym chcę się choc cokolwiek ambitniejszego robic na komuterze, a nie tylko grac jak większośc moich kolegów...
czesc czolem
co st3tc nie ma wyrozumiałosci dla ciebie? poka gdzie?
reqst: ładnie piszesz os'y super, naprawdę wiele musisz wiedzieć ale wyluzuj troszkę bo jesteś za bardzo waleczny (o to dobre słowo :) ).
pozdro
spax.
Użytkownik spax edytował ten post 01 lipiec 2005, 17:55
poka gdzie?

Na pewno widziałem że w wielu miejscach próbował ci pomagać(razem z innymi) tylko ty nie chciałeś tego zauważyć.
PS. Normalnie jak Visual. (nie zrozumiesz ;p)