PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Shellcode lesen/schreiben



ashcr@ck
05.01.2017, 08:19
Ich habe in letzter Zeit einige Quellcodes studiert. Einige von ihnen haben Shellcode inkludiert. Jetzt würde ich gern in Erfahrung bringen, wie Shellcode geschrieben wird und wie man ihn lesen kann. Hat jemand gute Quellen oder schon gute Erfahrungen damit?

Cystasy
05.01.2017, 12:45
Ich habe in letzter Zeit einige Quellcodes studiert. Einige von ihnen haben Shellcode inkludiert. Jetzt würde ich gern in Erfahrung bringen, wie Shellcode geschrieben wird und wie man ihn lesen kann. Hat jemand gute Quellen oder schon gute Erfahrungen damit?

Ist Geschmackssache, aber Grundlegend kann man sagen das mans z.b so machen kann:

1) C/C++ Compilieren
2) Entsprechend Compilierte Binary anschaun mit Hexeditor / Debugger
3) Bytecodes rauskopieren (nur die funktionen / befehle, natürlich nicht den binary header usw)
4) Bytecode umschreiben ins /x00/x00/x00 Format^^

In anderen Worten - Shellcode is einfach ASM Code den man in Hex umgewandelt hat und dann in Form von /x00/x00/x00 Format aufgeschrieben hat.
Mehr ises wirklich nicht - is keine Magie oder ^-^

Manche schreiben auch direkt ASM Code und wandeln das in Hex / Shell/Byte/Opcodes um.. ist Geschmackssache wie man das macht.
Zumindestens hab ichs immer so gemacht, und kenne es von anderen so.

grüße

ChEeTaH182
05.01.2017, 13:47
Ich hatte damals diese Lib benutzt, kp welche Sprache du benutzt, aber ich denke den Wrapper kann man einfach ummünzen bzw. gibts schon Implementierungen dafür. https://github.com/ZenLulz/Fasm.NET

Edit: Um Shellcode erzeugen zu können habe ich NDISAM benutzt. Kann man einfach in sein Programm einbinden und sich den Shellcode dann in einer Textbox ausgeben lassen http://www.nasm.us/doc/nasmdoca.html

ashcr@ck
05.01.2017, 21:18
Ich hätte jetzt mit mehr Aufwand gerechnet. Umso besser, dass es wirklich nicht so kompliziert ist.
Damit werde ich mich dann mal beschäftigen.

Danke für die Erläuterungen.

blackberry
06.01.2017, 19:20
Ich hätte jetzt mit mehr Aufwand gerechnet.
Es wird i.Allg. auch aufwändiger ausfallen, da dein Compiler sich nicht bemüht dir positionsunabhängigen Code auszuspucken. Etwas in C schreiben, kompilieren, linken und dann aus dem fertigen Programm den Maschinencode der gewünschten Funktion rauszukopieren für gewöhnlich in allen relevanten Fällen etwas, was du nicht mit dem gewünschten Effekt ausführen können wirst. (Versteh mich nicht falsch; Die kopierten Befehle werden von der CPU natürlich verstanden, aber sagen einem beispielsweise zu einer Adresse zu springen, die in dem ursprünglichen Programm sinnvollen Code enthalten hätte, aber in deiner Shellcode-Anwendung nichts brauchbares beinhaltet.)

gORDon_vdLg
06.01.2017, 23:42
Ich denke mal das müsste sich z.B. mit fasm ganz gut machen lassen. Wer Shellcode in einer Hochsprache schreiben will macht eh was verkehrt^^ Bei fasm kannst du die Ausgabe auf binär einstellen, habe es jetzt nicht direkt ausprobiert aber ließ dich mal rein, das wird das sein was du suchst.

Cystasy
06.01.2017, 23:59
Wer Shellcode in einer Hochsprache schreiben will macht eh was verkehrt^^

Naja, damals habe ich das z.b mal gemacht und hatte auch andere Personen gesehen die das z.b unter Linux (Backtrack4) so machten.
Es kommt natürlich auch drauf an was genau man dann später mal mit dem Shellcode machen möchte.. in wiefern das ganze dann
Linux spezifisch aussieht weiß ich nicht - ich hatte es damals unter Windows gemacht gehabt.

Ich weiß aber noch das man da noch "nachbessern" musste bei der Konvertierung :P
Ist schon ein bisschen frickelarbeit, aber mit etwas Mühe ging das^^

Wobei ich sagen muss das ich es größtenteils fürs Memory Hacking used hatte im Gamehacking Bereich.
Beispielweise hatte ich eigene Funktionen & Programmabschnitte dann in den Metin2 Clienten reingepatcht
die dann über nen entsprechenden Hook ausgeführt wurden den man in den Clienten reinwurschtelte.
Wenn man das ganze für ein Exploit nutzt dürfte das ganze dann vllt etwas umfangreicher
ausfallen als bei einem reinen Gamehack.

Aber wollte ja ohnehin nur "Grob" erklären wie so die Vorgehensweise aussehen könnte :P
Das beste vom Vorgehen her wäre ohnehin das ganze direkt in ASM zu schreiben und dann zu converten finde ich.
Aber wer kann heutzutage so gut ASM das er da TCP Shells usw coden kann? Wohl die wenigsten (ich nich) ^^

grüße

blackberry
07.01.2017, 23:00
Wenn man seine Zielapplikation genau kennt, dann kann man natürlich auch patchen und hat keine großen Schwierigkeiten. Wenn man aber erwartet, dass der geschriebene Code in einem unbekannten Programm an unbekannter Speicherposition ausgeführt wird, dann hat man schnell zusätzliche Schwierigkeiten. Allein schon eine Funktion aus einer DLL (ich bleibe mal gedanklich in der Windows-Welt, weil ich zu ignorant bin, um mich besser mit dem ELF-Format auszukennen) aufrufen ist, dann gar nicht mehr so einfach. (Das hängt damit zusammen, wie das Aufrufen Funktionen aus beim Linken eingebundenen DLLs funktioniert, siehe etwa hier (http://sandsprite.com/CodeStuff/Understanding_imports.html).) Mit dem Problem hatte ich auch mal zu kämpfen -- siehe etwa PELoc.asm in diesem Thread (https://free-hack.com/showthread.php?74378-C-C-ASM-Sourcedump!).

Btw: Ich habe auch schon Programme in ASM geschrieben und dann die relevanten Instruktionen mit OllyDbg rausgesucht und kopiert. Allerdings war mir dann auch vorher immer schon klar, dass der Code danach auch wo anders funktionieren würde, weil ich mir halt selbst aussuchen konnte, wie Funktionen aufgerufen wurden und ob meine Sprungadressen positionsunabhängig sind, oder nicht.


Aber wer kann heutzutage so gut ASM das er da TCP Shells usw coden kann? Wohl die wenigsten (ich nich) ^^
Ich könnte so etwas schon machen und würde mich so weit aus dem Fenster lehnen zu sagen, dass jemand, der das in C kann, auch in zwei Tagen genug ASM lernen kann, um das in ASM zu schreiben. Mit Assemblern wie MASM kann man (wenn man möchte) sogar halbwegs gediegen If- und Schleifenkonstrukte (https://stackoverflow.com/questions/15350651/if-else-macro-in-masm) hinreiben und findet sich nach 200 Zeilen Code und zwei Monaten Zeitunterschied vielleicht sogar noch im eigenen Code zurecht, auch wenn man keine zusätzlichen hundert Zeilen Kommentare geschrieben hat.

ashcr@ck
08.01.2017, 12:06
Da ist ja doch eine kleine Diskussion entstanden. :)

Die Problematik mit der Adressierung habe ich gar nicht bedacht. ISt natürlich richtig, dass diese angepasste werden muss für verschiedene Systeme. Ein bisschen ASM habe ich auch schonmal geschrieben. Damit werde ich mich dann mal wieder intensiver befassen.

Es gibt doch noch sehr häufig Code in dem Queelcode zu finden ist, in den unterschiedlichsten Bereichen. Gibt es denn eine Möglichkeit diesen irgendwie zu "lesen" oder muss den dann reversen in ASM?

Cystasy
08.01.2017, 15:29
Es gibt doch noch sehr häufig Code in dem Queelcode zu finden ist, in den unterschiedlichsten Bereichen. Gibt es denn eine Möglichkeit diesen irgendwie zu "lesen" oder muss den dann reversen in ASM?


Shellcode = ASM Anweisungen / Maschienencode


Beispiel:

Der ASM Befehl "NOP" (tut einfach garnichts) ist z.b der Hex Wert 90 ( sofern ich grad nicht Gehirntumor habe :D )
In Shellcode wäre das dann z.b /x90/. Das kannst du 1 zu 1 übersetzen wenn du einen Shellcode hast.
Die Schwierigkeit besteht dann eher darin, den ASM Code ansich zu verstehen (was er tut).

Ich habe dir mal in Google eben als Beispiel ne Liste rausgesucht wo du dir anschauen kannst, welche ASM Befehle welche Opcodes haben:
http://www.mathemainzel.info/files/x86asmref.html
Da siehst du welche ASM Befehle welche Opcodes haben und kannst dann quasi wenn du dir die Mühe machen willst das ganze Manuell übersetzen.
Da sollte es aber sicher Tools für geben die das automatisiert tun^^

grüße

ashcr@ck
10.01.2017, 21:35
Ah. Perfekt. Danke dir für den Hinweis. Und ja NOP = x90.
Danke dir auch fürs raussuchen. Jetzt weiß ich erstmal was ich wissen wollte und werde mich näher damit auseinander setzen.