Smashing the stack for fun and profit



  • Also die Rücksprungadresse wird richtig überschrieben, wenn ich es im Debugger schrittweise ausführe, springt er nach dem ret von Funktion() zu 0012FF1C und schmiert dann bei 0012FF27 ab.

    0012FF1C   xor         eax,eax
    0012FF1E   mov         ah,40h
    0012FF20   shl         eax,8
    0012FF23   mov         ax,100Ah
    0012FF27   ???
    0012FF28   jmp         46133F3D
    0012FF2D   push        ebp
    0012FF2E   inc         edx
    

    Ist vielleicht an meinem Shellcode irgendetwas falsch? Assembliert habe ich es mit "nasm.exe -o shell.bin shell.asm" :

    BITS 32
    
    xor eax,eax
    mov ah, 40h
    shl eax, 8
    mov ax, 100ah
    call eax
    


  • wenn ich den buffer grösser mache, funktionierts aber ich versteh nicht wieso es mit buffer[16] nicht geht 😕

    void Funktion( void )
    {
    	char buffer[32]; // 0x0012FF0C
    
    	char shellcode[] =
    	"\x31\xc0\xb4\x40\xc1\xe0\x08\x66\xb8\x0a\x10\xff\xd0";
    
    	sprintf( buffer, "%sAAAAAAAAAAAAAAAAAAABBBB%c%c%c%c", shellcode, 0x0C, 0xFF, 0x12, 0x00 );	
    }
    


  • Die Erklärung ist ganze einfach: Klassischer Bufferoverflow

    Sobald du über die Grenze von buffer hinausschreibst, überschreibst du irgendwo im Arbeitsspeicher rum, was zu undefinierten Verhalten führt (das Programm macht plötzlich komische Sachen bis hin zum Absturz).



  • AJ, will er das nicht gerade?

    Marvus, der GCC alloziiert fuer autoarrays etwas mehr als angegeben. probier mal rum



  • Es ist doch ganz einfach was da schiefgeht.mit

    sprintf( buffer, "%sAAAAAAAAAAAAAAAAAAABBBB%c%c%c%c", shellcode, 0x0C, 0xFF, 0x12, 0x00 );
    

    wird shellcode in den buffer kopiert. shellcode ist nicht 0-terminiert. Wieviel da kopiert wird ist undefiniert. Trotzdem was soll dieses blöde Spielchen (threadtitle).
    K



  • Na klar ist shellcode[] nullterminiert, siehst du nicht richtig?



  • ok



  • Also, du schreibst in dein Array buffer die 15 Bytes aus shellcode. Danach irgendwelche Buchstaben und dann noch Bytes.

    Und was soll das bewirken?



  • dass der funktionsprolog ueberschrieben wird und beim verlassen der funktion nicht zurueck zum call gesprungen wird, sondern auf den shellcode gesprungen wird.



  • Was bedeutet der 2.Parameter bei der sprintf Funktion.
    Ich hab recherchiert und raus bekommen dass er die Formatierung des strings bestimmt,aber soooo lang ??

    Mfg Heiner


Anmelden zum Antworten