C + shellcode: warum segfault?



  • nachdem ich bei wikipedia über den SIGILL-artikel gestolpert war, probierte ich das dortige beispiel aus. das funktionierte auch, aber wenn ich nun versuche eine korrekte funktion zu schreiben schmiert das programm immer ab.

    hier ersteinmal der code für linux mit gcc und nasm:

    #include <stdlib.h>
    
    int main()
    {
        // der dazugehörige asm-code kommt unten
    	char shellcode[] = "\x31\xc0\xfe\xc0\x31\xdb\xb0\x64\xcd\x80";
    	char code[10];
    
    	strncpy(code, shellcode, 10);
    
    	void (*function)() = (void (*)()) code;
    	function();
    }
    
    BITS 32
    
        xor     eax, eax
        inc     al      ; eax == 1 d.h. sys_exit
        xor     ebx, ebx
        mov     bl, 100 ; der rückgabewert
        int     80h     ; system interrupt
    

    laut gdb stürzte die erste version beim terminierungszeichen ab, woraufhin ich das strncpy einfügte, allerdings crasht es dann später. kurz gesagt: egal was ich mache, es crasht.

    meine frage jetzt : wieso klappt der interrupt aufruf nicht?



  • Bedenke, dass du den üblichen Funktions-Code auch benutzen solltest, wenn der Code für den GCC eine Funktion darstellen soll. Zumindest ein Rücksprung fehlt. (Okay, Rücksprung ist unwichtig in dem Fall :))

    Folgender Text sollte dir dabei ein wenig hilfreich sein http://www.nondot.org/sabre/os/files/Booting/CompilingBinaryFilesUsingACompiler.pdf



  • kingruedi schrieb:

    Bedenke, dass du den üblichen Funktions-Code auch benutzen solltest, wenn der Code für den GCC eine Funktion darstellen soll. Zumindest ein Rücksprung fehlt. (Okay, Rücksprung ist unwichtig in dem Fall :))

    BITS 32
    
    		push	ebp
    		mov 	ebp, esp
    
    		xor 	eax, eax
    		inc 	al
    		xor 	ebx, ebx
    		mov 	bl, 99
    		int 	80h
    
    		leave
    		ret
    

    🙄

    Danke für den Tipp!



  • Ist eine spaßige Sache. Ich habe so mal einen Jitter für einen pseudo Assembler geschrieben, für einen WPC Wettbewerb.


Anmelden zum Antworten