Speicherzugriffsfehler beim Shellcode ausführen



  • Servus!
    Ich wusste nicht genau ich welches Forum also Linux, Assembler, Rund um die Programmierung oder doch Themen rund um den PC. Falls das falsch sein sollte bitte verschieben!

    Ich fange an mich ein wenig für Shellcode zu interessieren und stoße bereits am Anfang auf ein Problem. Und zwar habe ich dieses C Programm was Shellcode ausführen kann.

    char code= "";
    
    int main (void) {
    	void (*func)();
       	func = (void(*)()) (&code);
       	func();
    }
    

    Das Problem ist egal welche Hexadezimalen Werte ich dort oben eintrage es kommt immer Speicherzugriffsfehler!

    Ich habe dieses Assemblerprogramm geschrieben was sich einfach beendet und als Rückgabewert 255 zurück gibt aber auch da kommt die Meldung wenn ich die Opcodes eintrage.

    08048054 <_start>:
     8048054:       b8 01 00 00 00          mov    $0x1,%eax
     8048059:       bb ff 00 00 00          mov    $0xff,%ebx
     804805e:       cd 80                   int    $0x80
    

    Kann mir einer sagen wie ich den Code ausführen kann ohne diesen Fehler?
    PS: Ich benutze den Kernel 2.6.37.6-0.7



  • Du kannst nicht einfach ein Stueck Speicher nehmen und durch casten in eine ausfuehrbare Funktion verwandeln. Ich habe damals http://code.google.com/p/asmjit/ benutzt, um bei den ganzen JIT-Diskussionen mal das Potenzial abzuschaetzen. Schau einfach dort nach. Gab auch mal einen Blogeintrag, der genau dein Beispiel vorgefuehrt hat, wie man es per Hand macht. Diese Zeilen habe ich damals auch in AsmJit wiedergefunden. Das gute, ich brauche mir die Opcodes nicht merken. Finde den Blog aber nimmer. Etwas kleiner ist wohl: http://homepage1.nifty.com/herumi/soft/xbyak_e.html . Auf die schnelle habe ich nur http://stackoverflow.com/questions/4911993/how-to-generate-and-run-native-code-dynamically gefunden.



  • Danke schon mal!
    Ich habe hier auf dieser Seite ein kleines "Tutorial" gefunden.
    http://www.vividmachines.com/shellcode/shellcode.html
    Allerdings wird es dort genau so gemacht wie ich es probiert habe.
    Ein kleiner Auszug:

    Linux Shellcoding
    
    When testing shellcode, it is nice to just plop it into a program and let it run. The C program below will be used to test all of our code.
    /*shellcodetest.c*/
    
    char code[] = "bytecode will go here!";
    int main(int argc, char **argv)
    {
      int (*func)();
      func = (int (*)()) code;
      (int)(*func)();
    }
    
    Example 1 - Making a Quick Exit
    
        The easiest way to begin would be to demonstrate the exit syscall due to it's simplicity. Here is some simple asm code to call exit. Notice the al and XOR trick to ensure that no NULL bytes will get into our code.
    
    ;exit.asm
    [SECTION .text]
    global _start
    _start:
            xor eax, eax       ;exit is syscall 1
            mov al, 1       ;exit is syscall 1
            xor ebx,ebx     ;zero out ebx
            int 0x80
    
    Take the following steps to compile and extract the byte code.
    steve hanna@1337b0x:~$ nasm -f elf exit.asm
    steve hanna@1337b0x:~$ ld -o exiter exit.o
    steve hanna@1337b0x:~$ objdump -d exiter
    
    exiter:     file format elf32-i386
    
    Disassembly of section .text:
    
    08048080 <_start>:
     8048080:       b0 01                   mov    $0x1,%al
     8048082:       31 db                   xor    %ebx,%ebx
     8048084:       cd 80                   int    $0x80
    
    The bytes we need are b0 01 31 db cd 80.
    
    Replace the code at the top with:
    char code[] = "\xb0\x01\x31\xdb\xcd\x80";
    
    Now, run the program. We have a successful piece of shellcode! One can strace the program to ensure that it is calling exit.
    

    Leider kommt dort wieder mein Speicherzugriffsfehler.
    Kann mir einer sagen was ich falsch mache ich begreife es noch nicht ganz?



  • Der Compiler meckert doch schon bei der ersten Zeile: char code= "";



  • Wieso sollte er das tun?
    Bei mir macht er das nicht 😕

    Edit:
    Achso meinst du meinen Erstbeitrag?
    Das sollte nur provisorisch sein!
    Soll darstellen wie verzweifelt ich bin 😉



  • Du weist einem char (einem einzelnen Zeichen) ein Stringliteral zu.

    Auch Warnungen soll man ernst nehmen.
    Wenn dein Compiler nicht warnt, stell den Warn-Level höher.



  • Wie gesagt das war nur ein Beispiel ich wollte da keine sinnlosen Zeichen reinschreiben es gibt eher um das eigentliche C Programm.
    Aber nochmal zurück zur Frage weiß keiner warum ich immer diesen Fehler bekommen (wenn ich den shellcode von der Beispielseite nehme)?



  • Welchen Beitrag soll ich denn sonst meinen? Einen zweiten gibt es von dir nicht.

    Poste den Code der dir Schwierigkeiten macht. So kurz wie möglich. So lang wie nötig. Und compilierbar.
    Keine Beispiele die so ähnlich sind.

    Meine Kristallkugel zeigt bei solchen Sachen auch nur Nebel.



  • char code[] = "\xb0\x01\x31\xdb\xcd\x80";
    
    int main (void) {
        void (*func)();
           func = (void(*)()) (&code);
           func();
    }
    

    Das wäre ein Code der sicher kompilieren lässt aber beim Ausführen den berüchtigen Fehler anzeigt



  • 7. Why does my shellcode program crash when I run it?
    [..]That is why the shell program needs to copy itself to the stack before attempting execution.

    10. Why does my program keep segfaulting? Yes, I read item 7 above, but it STILL crashes.

    echo 0 > /proc/sys/kernel/exec-shield #turn it off

    Hast du das beachted?



  • Nein hab ich nicht aber diesen Pfad gibt es bei mir nicht.
    Ich habe im Internet noch diesen Befehl gefunden

    Task: Disable ExecShield protection
    
    Type the following command as root user:
    # sysctl -w kernel.exec-shield=0
    

    Aber dort das gleiche er kann den Pfad bzw. die Datei nicht finden.


Log in to reply