Smashing the stack for fun and profit



  • Hallo,

    Also ich hab Smashing the stack for fun and profit gelesen und wollte das selbst mal ausprobieren, aber irgendwie funktioniert das nicht. Könnt ihr mir sagen was ich falsch mache?

    #include "stdio.h"
    #include "Windows.h"
    
    void Nachricht( void )
    {
    	MessageBox( NULL, "Nachricht", "Caption", 0 );
    }
    
    void Funktion( void )
    {
    	char buffer[16]; // Anfangsadresse 0x0012FF1C
    	char shellcode[] =
    	"\x66\x31\xc0\xb4\x40\x66\xc1\xe0\x08\xb8\x0a\x10\x66\xff\xd0";
    
    	sprintf( buffer, "%s1abcd%c%c%c%c", 0x1C, 0xFF, 0x12, 0x00 );
    
    }
    
    int main(int argc, char* argv[])
    {
    
    Funktion();
    	// 0x40100a
    /*	_asm
    	{
    		xor eax,eax
    		mov ah, 40h
    		shl eax, 8
    		mov ax, 100ah
    
    		call eax
    	}
    */
    	return 0;
    }
    

    also der assembler code soll die adresse der funktion Nachricht (0x40100a) in eax bewegen und die Funktion dann aufrufen. Der auskommentierte asm code funktioniert auch. Den habe ich mit nasm assembliert und daraus den 15 byte langen shellcode erzeugt. sprintf soll jetzt den shellcode in die ersten 15 bytes des buffers kopieren, dann noch 1 zeichen und danach 4 chars für den Basepointer und danach mit der Adresse von buffer den ip überschreiben. Ich hab das Programm unter VS6 als Debug kompiliert. Mache ich irgendetwas falsch ? Könnt ihr das bei euch mal ausprobieren. Wenn ichs starte stürzt es immer nur ab 😕



  • Wo kopierst du denn den shellcode in den buffer.

    sprintf( buffer, "%s1abcd%c%c%c%c", 0x1C, 0xFF, 0x12, 0x00 );

    "shellcode" taucht doch garnicht auf 😕



  • ups, Das ist ein Tippfehler, sollte natürlich

    sprintf( buffer, "%s1abcd%c%c%c%c", shellcode, 0x1C, 0xFF, 0x12, 0x00 );
    

    sein.



  • 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