Shellcode um in Datei zu schreiben



  • Hallo ich wollte einen Shellcode erzeugen,welcher Test\n in eine Datei schreibt. dazu habe ich zuerst ein Assembler Programm geschrieben:

    section .data
    msg	db	"Test",0x0a,0x0d
    file 	db	"./test.txt"
    section .text
    global _start
    _start:
    xor eax,eax
    mov eax,8
    mov ebx,file
    mov ecx,0x700
    int 0x80
    mov ebx,eax
    mov eax,4
    mov ecx,msg
    xor edx,edx
    mov edx,6
    int 0x80
    mov eax,6
    int 0x80
    mov eax,1
    xor ebx,ebx
    int 0x80
    

    Dieses funktioniert auch. Dann habe ich versucht, daraus Shellcode zu erstellen:

    BITS 32
    jmp short file
    file2:
    xor eax,eax
    mov al,8
    pop ebx
    mov ch,0x7
    int 0x80
    mov ebx,eax
    mov al,4
    jmp short msg
    msg2:
    pop ecx
    xor edx,edx
    mov dl,6
    int 0x80
    mov al,6
    int 0x80
    mov al,1
    xor ebx,ebx
    int 0x80
    msg:
    call msg2
    db	"Test",0x0a,0x0d
    file:
    call file2
    db	"./test.txt"
    

    Doch dieser funktioniert leider nicht und ich weiß nicht wieso!
    Bitte um Hilfe!



  • So jetzt funktionierts! Habe jetzt jedoch ein anderes Problem:
    Die Zugriffsrechte stimmen nicht. Hier der open syscall aufruf:

    pop ebx
    push ebx
    mov eax,ebx
    xor ecx,ecx
    mov [eax+16],cl
    lea ebx,[eax+6]
    mov cx,0777
    xor eax,eax
    mov al,8
    int 0x80

    Ich möchte 777 oder 666 als Zugriffsrechte einstellen. So sehen die
    Rechte in Textform momentan aus: -r----x--t
    Woher kommt das t und was bedeutet es? Was ist falsch an meinen Rechten
    und wie stelle ich das ganze richtig? Bitte um Hilfe



  • Kann es sein dass du nicht wirklich weißt was du da machst.. ?
    Was hast du denn jetzt geändert dass es geht ?
    Hier trotzdem noch meine Korrektur, schau dir die Kommentare an:

    BITS 32
    jmp short file 
    file2:
    pop ebx 
    xor eax,eax ;set eax 0
    mov [ebx+0xa], al ;nullterminate string! (nullbytes are forbidden, so this way)
    mov al,8
    xor ecx,ecx ; clear ecx ?!
    mov ch,0x7 
    int 0x80 
    mov ebx,eax 
    mov al,4 
    jmp short msg 
    msg2: 
    pop ecx 
    xor edx,edx 
    mov dl,6 
    int 0x80 
    mov al,6 
    int 0x80 
    mov al,1 
    xor ebx,ebx 
    int 0x80 
    msg: 
    call msg2 
    db  'Test',0x0a,0x0d 
    db '$' ;char index: 6
    file: 
    call file2 
    db  './test.txt'
    db '$' ;char index: 10
    

    Zu deinem Zugriffsrecht t schau mal hier: http://de.wikipedia.org/wiki/Sticky_bit

    Ich kenn mich mit Linux nicht sonderlich aus und habe auch keine großartige Lust mich da jetzt reinzuarbeiten, daher mal ne allgemeine Frage:
    - Sind die Zahlen im richtigen Format oder vermischt du Hex/Dec/Oct ?



  • Jetzt geht alles!
    Hier der Code:

    BITS 32
    
    jmp short file
    file2:
    pop ebx
    push ebx
    mov eax,ebx
    xor ecx,ecx
    mov [eax+16],cl
    lea ebx,[eax+6]
    mov cx,666o
    xor eax,eax
    mov al,8
    int 0x80
    pop ecx
    mov ebx,eax
    mov al,0x0a
    mov [ecx+4],al
    mov al,0x0d
    mov [ecx+5],al
    
    xor eax,eax
    mov al,4
    xor edx,edx
    mov dl,6
    int 0x80
    mov al,6
    int 0x80
    mov al,1
    xor ebx,ebx
    int 0x80
    file:
    call file2
    db  "Test##./test.txt#"
    


  • Noch mal etwas zusammengefasst (ungetested):

    jmp short file 
    file2: 
    pop ebx 
    push ebx 
    xor ecx,ecx
    mov [ebx+0x6],cl  
    mov [ebx+0x11],cl 
    lea ebx,[ebx+7] 
    mov cx,666o 
    xor eax,eax 
    mov al,8 
    int 0x80 
    pop ecx
    mov ebx,eax
    
    xor eax,eax 
    mov al,4 
    xor edx,edx 
    mov dl,6 
    int 0x80 
    mov al,6 
    int 0x80 
    mov al,1 
    xor ebx,ebx 
    int 0x80 
    file: 
    call file2 
    db  'Test', 0x0a, 0x0d,'#./test.txt#'
    

    Hab die Nachricht auch gleich nullterminiert, das hast du vergessen.

    Allerdings ist es doch besser die zwei strings zu trennen, dann kannst du auch schwerer vergessen irgendwelche offsets anzupassen wenn du sie mal änderst.
    Und du solltest dir dringen angewöhnen Kommentare zu machen !



  • Du willst doch wohl kein Knacker Programm erstellen oder?!



  • DarkShadow44 schrieb:

    Hab die Nachricht auch gleich nullterminiert, das hast du vergessen.

    wenn es sich um Shellcode handelt, so dürfen in der Regel keine Bytes mit Wert 0 vorkommen.

    Shellcode wird im befallenen Programm ja normalerweise mit strcpy oder ähnlichen Funktionen in den Puffer kopiert. Und strcpy hört auf Zeichen zu kopieren, sobald ein 0 Byte gefunden wird.

    Der gesamte Shellcode mitsamt NOP Sled und sich wiederholender Rücksprungadresse hier als Skizze:

    +------+-----------+----------------+
    | NOPs | Shellcode | Return Adresse |
    +------+-----------+----------------+
    

    Sind 0er bereits im Shellcode zu finden, so wird die Rücksprungadresse am Stack nicht überschrieben und dein Code wird niemals ausgeführt.

    Im Übrigen übergibt man dem Syscall write ja eh die Länge des Strings, somit kann man sich das terminierende 0 Byte ohnehin sparen.

    Du willst doch wohl kein Knacker Programm erstellen oder?!

    uhhh böse da interessiert sich jemand für Assembler, Reverse Engineering und Shellcode. Das muss ein böser Hacker sein 😃



  • wenn es sich um Shellcode handelt, so dürfen in der Regel keine Bytes mit Wert 0 vorkommen.
    

    Nullterminiert müssen Strings für API Aufrufe ja trotzdem sein, darum ja der Trick mit dem Nullterminieren per XOR.
    Der Asmcode den ich gepostet hab erzeugt kein einziges Nullbyte. 😉



  • DarkShadow44 schrieb:

    wenn es sich um Shellcode handelt, so dürfen in der Regel keine Bytes mit Wert 0 vorkommen.
    

    Nullterminiert müssen Strings für API Aufrufe ja trotzdem sein, darum ja der Trick mit dem Nullterminieren per XOR.
    Der Asmcode den ich gepostet hab erzeugt kein einziges Nullbyte. 😉

    ah ok sorry da hab ich nicht genau genug geschaut.
    wenn man das byte zur laufzeit auf 0 setzt ist das natürlich ok!



  • Du willst doch wohl kein Knacker Programm erstellen oder?!

    uhhh böse da interessiert sich jemand für Assembler, Reverse Engineering und Shellcode. Das muss ein böser Hacker sein :D[/quote]

    Tja, Bürschchen wir von GData sind schon ein paar schlaue Füchse !
    Dein Shellcode kann nix mehr machen der ist nämlich auf unserer Blacklist !
    Da besteht GAR KEIN ZWEIFEL das du da Schwindluder treiben willst.

    Ich kenn mich aus ich weiss wovon ich rede !
    Den ich habe ein Computer Bild Abonnement und lese die Zeitung jeden Monat von vorne bis hinten durch !

    GUTEN TAG !



  • Hallo.
    Ich dachte Shellcode ist ein Begriff aus der Software-Programmierung und bezeichnet die bereits schon in Opcodes umgewandelte Form von Assemblersprachenbefehlen.

    Zb. so etwas aus dem Shellscript von Herbert Kleebauer(Most of the code is stolen from Frank Kotler):
    http://coding.derkeiler.com/Archive/Assembler/alt.lang.asm/2007-07/msg00440.html

    Linux Xdemo

    7f454c4601010100000000000000000002000300010000007480040834000000
    0000000000000000340020000200000000000000010000000000000000800408
    0080040858020000580200000500000000100000010000005802000058920408
    58920408340000002004000006000000001000006a006a016a0189e1bb010000
    00b866000000cd8083c40c85c00f88a401000089c76813000000684482040857
    89e1bb03000000b866000000cd8083c40c85c00f887e01000089fbb903000000
    b837000000cd8085c00f886801000089fbb90400000089c281ca00080000b837
    000000cd8085c00f884a0100006a00680c00000068589204085789e1bb090000
    00b866000000cd8083c41085c00f88240100006a0068e8030000689092040857
    89e1bb0a000000b866000000cd8083c4103df5ffffff74db85c00f88f7000000
    be909204088b460ca368920408a3889204080fb7461883c02b24fc0fb6561dc1
    e20301d08b0406a36c9204086a00682000000068649204085789e1bb09000000
    b866000000cd8083c41085c00f88a50000006a0068e803000068909204085789
    e1bb0a000000b866000000cd8083c4103df5ffffff740885c00f88780000006a
    00680800000068849204085789e1bb09000000b866000000cd8083c41085c00f
    88520000006a0068e803000068909204085789e1bb0a000000b866000000cd80
    83c4103df5ffffff740885c00f88250000006a0068e803000068909204085789
    e1bb0a000000b866000000cd8083c4103df5ffffff74dbbb00000000b8010000
    00cd800001002f746d702f2e5831312d756e69782f5830006c000b0000000000
    00000000010008000000000000000000640032009001c8000a00000000000000
    000000000800020000000000
    

    Dirk



  • IHR HAB DOCH ALLE GAR KEINE AHNUNG IHR SCRIPT KIDDYS ! 😡

    Sowas schreibe ich in HTML in 1 Minute ! 🕶



  • Naja in "Opcodes umgewandelt" ist falsch ausgedrückt. Aber ja, es ist maschinencode (meist einfach binär oder als string durch angabe der hex-kodierten Bytes) der normalerweise dazu genutzt wird um Schwachstellen auszunutzen.
    Allerdinds würde ich den Assemblercode aus dem er entstanden ist auch noch als Shellcode bezeichnen. 😃

    @1337 H4CkEr
    Ach du schreibst uns jetzt in HTML ausführlich die Definition von Shellcode ? :p



  • @ DarkShadow44

    Ich h4b m4l mIt HTML eIn BeTrIeBsYsTem geScHriEben

    für nur 4000€ pro Tag kannst du an einem meiner HACKER KURSE teilnehmen !
    Der Kurs geht 13,37 Tage



  • freecrac schrieb:

    Hallo.
    Ich dachte Shellcode ist ein Begriff aus der Software-Programmierung und bezeichnet die bereits schon in Opcodes umgewandelte Form von Assemblersprachenbefehlen.

    Zb. so etwas aus dem Shellscript von Herbert Kleebauer(Most of the code is stolen from Frank Kotler):
    http://coding.derkeiler.com/Archive/Assembler/alt.lang.asm/2007-07/msg00440.html

    Linux Xdemo

    7f454c4601010100000000000000000002000300010000007480040834000000
    0000000000000000340020000200000000000000010000000000000000800408
    0080040858020000580200000500000000100000010000005802000058920408
    58920408340000002004000006000000001000006a006a016a0189e1bb010000
    00b866000000cd8083c40c85c00f88a401000089c76813000000684482040857
    89e1bb03000000b866000000cd8083c40c85c00f887e01000089fbb903000000
    b837000000cd8085c00f886801000089fbb90400000089c281ca00080000b837
    000000cd8085c00f884a0100006a00680c00000068589204085789e1bb090000
    00b866000000cd8083c41085c00f88240100006a0068e8030000689092040857
    89e1bb0a000000b866000000cd8083c4103df5ffffff74db85c00f88f7000000
    be909204088b460ca368920408a3889204080fb7461883c02b24fc0fb6561dc1
    e20301d08b0406a36c9204086a00682000000068649204085789e1bb09000000
    b866000000cd8083c41085c00f88a50000006a0068e803000068909204085789
    e1bb0a000000b866000000cd8083c4103df5ffffff740885c00f88780000006a
    00680800000068849204085789e1bb09000000b866000000cd8083c41085c00f
    88520000006a0068e803000068909204085789e1bb0a000000b866000000cd80
    83c4103df5ffffff740885c00f88250000006a0068e803000068909204085789
    e1bb0a000000b866000000cd8083c4103df5ffffff74dbbb00000000b8010000
    00cd800001002f746d702f2e5831312d756e69782f5830006c000b0000000000
    00000000010008000000000000000000640032009001c8000a00000000000000
    000000000800020000000000
    

    Dirk

    der name shellcode kommt daher, dass diese codes oft dazu verwendet werden, ein programm welches mit root rechten läuft dazu zu bekommen, eine shell (terminal, konsole) zu starten, welche auch mit root rechten läuft.
    dann hat man plötzlich als otto normal user root rechte, kann also so ziemlich alles mit dem system anstellen.

    shellcode wird meist in asm programmiert und dann in maschinencode übersetzt (die übersetzungsarbeit nimmt einem z.b. das programm nasm ab).
    oft muss man darauf achten, dass der maschinencode keine 0 bytes enthält, da der schadcode oft vom befallenen programm mit strcpy in den angegriffenen puffer kopiert wird.
    also dinge wie mov eax,0 sollte man vermeiden, und stattdessen etwa xor eax,eax verwenden.



  • Wenn ihr was über Shellcodes lernen wollt dann schaut mal hier vorbei:

    http://www.projectshellcode.com

    4ber nIcHt d4s IhR miR d4miT UnFuG treiBt !!!



  • Danke für die Erklärung.
    Nun habe ich nur noch zwei Fragen dazu:

    Werden mit dem Begriff Shellcode nun eigentlich die in Opcodes umgewandelte Form von Assemblerbefehlen definiert, oder gehören Assemblerbefehle die noch nicht zu Opcodes umgewandelt wurden auch mit zum Shellcode und sind ein Teil davon?

    Und besteht ein Shellcode wirklich schon selber aus ausführbaren Opcodes, oder werden diese Opcode-Bytes doch nur in ihrer für uns lesbaren Form als Werte in Ziffern dargestellt und nur damit gebildet?

    Weil reine Opcodes als ASCIIs können vergleichsweise nur so, oder ähnlich als Text dargestellt werden:
    [url]https://groups.google.com/forum/#!msg/alt.msdos.batch.nt/KTQaCTUKG3Q/9Vv8XtKESncJ[/url]

    Dirk



  • Warum willst du jetzt so genau wissen, wie es definiert ist? So genau ist es nicht definiert, und selbst wenn das jemand definiert hätte, wär mir das egal. Den fertigen Binärcode würde ich als Shellcode bezeichnen. Genauso aber auch den Asemblerquellcode davon. Und niemand kann mich daran hindern 😉



  • Moin.

    Mechanics schrieb:

    Warum willst du jetzt so genau wissen, wie es definiert ist?

    Deine Frage lautet doch eigentlich, wofür gibt es überhaupt genaue Definitionen? Antwort: Damit wir eine gemeinsame Sprache verwenden können und diese auch verstanden wird, denn was nützt es sonst, wenn man nur Bahnhof versteht und nicht wirklich weiss was genau gemeint ist? Damit dürfte dieser Punkt, wofür eine präzise Definition wichtig ist, auch hoffentlich ausreichend geklärt sein.

    In diesem speziellen Fall geht es auch darum, die Risiken die von einem Shellcodes ausgehen können, besser beurteilen zu können.

    So genau ist es nicht definiert, und selbst wenn das jemand definiert hätte, wär mir das egal. Den fertigen Binärcode würde ich als Shellcode bezeichnen. Genauso aber auch den Asemblerquellcode davon. Und niemand kann mich daran hindern 😉

    Ich wüsste jetzt nicht wen es genau interessieren könnte, ob dir eine allgemeingültige Definition gleichgültig ist, oder auch nicht und ob du auch die Fähigkeit dazu hast einem Wort eine beliebige und eigenwillige Bedeutung beizumessen und/oder ob dich daran keiner hindern kann. Wen soll das eigentlich genau interessieren? Ich meine das sind Dinge mit denen man sich schon in seiner Kindheit beschäftig und die bei meiner Frage eigentlich nicht von so grosser Bedeutung sind. Eher das genaue Gegenteil davon trifft zu.

    Wichtiger wäre die Frage, ob ein fertigen Binärcode in einem Schellcode überhaupt möglich ist, oder doch nur Assemblerbefehle und repräsentative Werte eines Opcodes als ASCII-Ziffern aufgelistet?

    Beispiel: Encoded into a string using percent-encoding (using the unescape() function to decode): unescape("%u9090");
    Diese Werte der Opcodes werden hier nur als lesbare Ziffern in Textform angegeben und dieser Text ist selber noch kein Opcode und kann so in dieser Form nicht von einer CPU als Opcodes ausgeführt werden.

    Ich möchte schlicht es nur wissen woraus ein Shellcode ganz genau bestehen kann und welche Bestandteile dort möglich und anzutreffen sind. Bisher habe ich selber noch keinen Shellcode gesehen wo tatsächlich ausführbare Opcodes enthalten sind, die von der CPU in dieser Form auch ausgeführt werden können.

    Dirk



  • Der Shellcode selber sind einfach nur Bytes die zusammengenommen lauffähigen Maschinencode bilden. Ob diese Bytes jetzt direkt binär in einer Datei stecken, Hexkodiert in einen string eingebunden, percent-encoded sind, oder einfach zur Laufzeit aus einem bild reconstruiert werden ist doch egal ?

    Wichtiger wäre die Frage, ob ein fertigen Binärcode in einem Schellcode überhaupt möglich ist, oder doch nur Assemblerbefehle und repräsentative Werte eines Opcodes als ASCII-Ziffern aufgelistet?

    Bitte was ?
    Shellcode ist letztlich >immer< Maschinencode. Und Maschinencode sind Bytes. ASCII-Zeichen sind Bytes. Das heißt du kannst jede ASCII Zeichenfolge auch als Maschinencode interpretieren. Das macht natürlich nur Sinn wenn es dann auch lauffähigen Machinencode bildet. Das merkt man dann aber meistens, weil die Zeichenfolge dann als Zeichenfolge betrachtet keinen Sinn mehr ergibt, gerne mal voll mit Sonderzeichen ist. Und weil es mit Sonderzeichen in Zeichenketten oft mal Probleme gibt (z.B. der Editor/Browser Zeichen 'verschluckt'/umwandelt oder was auch immer) verwendet man Hex oder Prozent Kodierung. Wäre für nen Angriff ja blöd wenn dein schöner Shellcode vom Browser des Ziels plötzlich verändert und damit zerstört wird.


Anmelden zum Antworten