Shellcode um in Datei zu schreiben



  • 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.



  • Hallo freecrac,

    du musst den Unterschied zwischen Assemblercode (kann man als Mensch lesen, aber nicht der x86 Prozessor) und Maschinencode (x86 Prozessor versteht das, als Mensch hingegen nur sehr schwer lesbar) verstehen, dann hast du gewonnen.

    Hier ein einfaches Beispiel:

    Ich möchte folgende Assembler Befehle in Maschinensprache (x86) übersetzen:

    mov eax,0xAABBCCDD
    mov ebx,eax
    

    Also rufe ich das Programm nasm auf, das erledigt das für mich.
    Der Output ist nun folgender Maschinencode in HEX Darstellung, erkennst du z.B. den Wert 0xAABBCCDD wieder (little endian byte order - daher findet er sich als ccdd aabb wieder).

    b866 ccdd aabb 8966 00c3
    

    Man kann sich den Machinencode auch als ASCII ansehen, nur wird das halt nicht sehr vernünfig sein, aber siehe selbst:

    f???f??
    

    Der letzte Teil des Maschinencodes fehlt in der ASCII Darstellung. Überleg dir mal warum.

    Aber bedenke, dass es egal ist ob du den Maschinencode im HEX Editor ansiehst, oder ihn dir im ASCII Format in einem Texteditor ansiehst, oder ihn dir binär ansiehst - es ist und bleibt Maschinencode, und der x86 Prozessor kann damit umgehen.

    Da du aber mit den Basics anfangen solltest, würde ich dir empfehlen, lad dir das Programm nasm runter, und schreibt ein paar einfache Programme in Assembler. Ich denke, damit wird das alles viel klarer als wenn wir hier weiter herum theoretisieren.



  • freecrac schrieb:

    Deine Frage lautet doch eigentlich, wofür gibt es überhaupt genaue Definitionen?

    Nein. Mir gehts nur konkret um diesen Fall hier. Zum einen ist Shellcode einfach ein Begriff, den irgendwann paar Hacker/Programmierer benutzt haben und der sich etabliert hat. Der hat für mich keine formale Definition, selbst wenn jemand später versucht haben sollte, den Begriff genau zu definieren. Ist vielleicht so ähnlich wie mit "Software". Das ist ein recht schwammiger Begriff (der sich irgendwie definiert ist), der je nach Kontext verschiedene Bedeutungen haben kann. Ich kann die Binaries von MySql als Software bezeichnen, genauso aber auch den Quellcode davon. Das macht jetzt nicht den Kern des Begriffs Software aus.
    Das wollte ich damit jetzt eigentlich nur sagen. Deine Fragen waren etwas schwammig formuliert, und ich wollte dich nur darauf hinweisen, dass ich die Unterscheidung hier für das Verständnis des Begriffs Shellcode für nicht besonders relevant halte.



  • gdgfdgdgdfg schrieb:

    Hallo freecrac,

    du musst den Unterschied zwischen Assemblercode (kann man als Mensch lesen, aber nicht der x86 Prozessor) und Maschinencode (x86 Prozessor versteht das, als Mensch hingegen nur sehr schwer lesbar) verstehen, dann hast du gewonnen.

    Hier ein einfaches Beispiel:

    Ich möchte folgende Assembler Befehle in Maschinensprache (x86) übersetzen:

    mov eax,0xAABBCCDD
    mov ebx,eax
    

    Also rufe ich das Programm nasm auf, das erledigt das für mich.

    Vorschlag: Weil wir eh im Internet zugange sind, da bietet es sich an anstelle von nasm einen Online-assembler zu verwenden, der für uns objdump zum disassemblieren verwendet.

    https://defuse.ca/online-x86-assembler.htm#disassembly
    (Architecture: x86 für den 32 Bit Adressmode)

    0:  b8 dd cc bb aa          mov    eax,0xaabbccdd
    5:  89 c3                   mov    ebx,eax
    

    Der Output ist nun folgender Maschinencode in HEX Darstellung, erkennst du z.B. den Wert 0xAABBCCDD wieder (little endian byte order - daher findet er sich als ccdd aabb wieder).

    Ja stimmt, das ist mir bekannt.

    So auch das Maschinencode direkt ausführbar ist und alles Andere eben kein Maschinencode ist. Auch wenn der Begriff Maschinencode in manchen Anworten nach dieser Definition falsch verwendet wurde und es somit auch deutlich wird, wie wichtig es ist eine allgemeingültige Definition zu verwenden, wenn wir grundlegende Missverständnisse vermeiden möchten. So ist es eben nicht besonders sinnvoll, wenn von einer allgemeingültigen Definition abgewichen wird und jeder etwas Anderes damit meint.

    Man kann sich den Machinencode auch als ASCII ansehen, nur wird das halt nicht sehr vernünfig sein, aber siehe selbst:

    f???f??
    

    Der letzte Teil des Maschinencodes fehlt in der ASCII Darstellung. Überleg dir mal warum.

    Da brauche ich nicht lange zu überlegen, weil mit ASCII-Zeichen lassen sich nicht alle Bytes darstellen und wenn man z.B. einen Machinencode in eine Batchdatei verwenden möchte, dann muss man eben nur solche Bytes verwenden die als ASCIIs dargestellt werden können.

    Aber bedenke, dass es egal ist ob du den Maschinencode im HEX Editor ansiehst, oder ihn dir im ASCII Format in einem Texteditor ansiehst, oder ihn dir binär ansiehst - es ist und bleibt Maschinencode, und der x86 Prozessor kann damit umgehen.

    Ja das ist mir auch bekannt.

    Da du aber mit den Basics anfangen solltest, würde ich dir empfehlen, lad dir das Programm nasm runter, und schreibt ein paar einfache Programme in Assembler. Ich denke, damit wird das alles viel klarer als wenn wir hier weiter herum theoretisieren.

    Ich selber verwende schon viele Jahre Assembler und habe x86-Befehle zum ersten Mal schon auf einem 80286 zusammen mit Debug.exe unter DOS ausprobiert. Danach hat es auch nicht so lange gedauert, bis ich zu einem 80386 wechselte, um auch dessen Befehle und Möglichkeiten kennen zu lernen. Ich meine die Basics der Assembler-Programmierung sind mir damit schon klar genug geworden.

    DarkShadow44 schrieb:

    Der Shellcode selber sind einfach nur Bytes die zusammengenommen lauffähigen Maschinencode bilden.

    Lauffähigen Maschinencode bedeutet das eine CPU genau diesen Code auch ausführen kann.

    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 ?

    Nö das ist nicht egal, sondern es entscheidet darüber, ob es ein Maschinencode ist, oder ob zur Laufzeit dieses Maschinencode erst erzeugt wird, weil es vorher noch kein Maschinencode war.

    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.

    Bei Maschinencode kommt es eigentlich nur darauf an, ob eine CPU die Bytefolge ausführen kann, oder nicht. Ob und wie wir Menschen es interpretieren ist dafür eigentlich völlig irrelavant und Assemblerbefehle und percent-encoded bytes sind selber noch kein Maschinencode, sondern werden erst später dazu gemacht. Genau darin unterscheiden sich Maschinencode und andere Bytes die in ihrer Form noch nicht von einer CPU direkt ausführbar sind.

    Weil es für den Begriff Maschinencode schon eine allgemeingültige Definition gibt wäre es überaus sinnvoll auch nur diese Definition zu verwenden und eben nicht etwas Abweichendes davon hinein zu interpretieren, weil das nur grundlegende Missverständnisse erzeugt, die nur wenig hilfreich sind.

    Es mag ja sein das es für den Begriff "Shellcode" immer noch keine allgemeingültige Definition gibt, aber für den Begriff Maschienencode gibt es bereits eine allgemeingültige Definition, womit nur von einer CPU direkt ausführbarer Code gemeint ist und nichts anderes.

    Doch bisher habe ich immer noch keinen Shellcode gesehen, der selber auch wirklich Maschinencode enthält, der von einer CPU genauso in dieser (noch) unveränderten Form auch ausgeführt werden kann. Bisher habe ich nur Shellcode gesehen, der selber gar keinen Maschinencode enthält und dessen Bytes nicht direkt und unverändert von einer CPU ausgeführt werden können.

    Im Falle in einem Shellcode aber niemals von einer CPU direkt ausführbarer Maschinencode enthalten ist, dann wäre es ja nicht so schwer eine allgemeingültige Definition dafür zu finden, wenn man sagt dass bestimmte in einem Schellcode sich befindende Bytes erst zur Laufzeit in einen direkt ausführbaren Maschinencode umgewandelt werden.

    @Mechanics: Ich hoffe ich habe mich nun etwas weniger schwammig ausgedrückt.

    Kann nun jemand von euch auch mal einen Shellcode zeigen, der direkt ausführbaren Maschinencode enthält, oder gibt es so etwas doch nicht?

    Dirk



  • Sag mal meinst du das ernst oder willst du nur provozieren ? 😕

    Assemblerbefehle und percent-encoded bytes sind selber noch kein Maschinencode, sondern werden erst später dazu gemacht. Genau darin unterscheiden sich Maschinencode und andere Bytes die in ihrer Form noch nicht von einer CPU direkt ausführbar sind.

    Deine Logik hinkt. Demnach müsste auch ein Bild das komprimiert oder verschlüsselt ist kein Bild mehr sein.. Weil es erst beim entschlüsseln/dekomprimeiren dazu gemacht wird.
    Natürlich ist es Maschinencode wenn es Prozentkodiert angeben ist, nur in anderer Form!

    Doch bisher habe ich immer noch keinen Shellcode gesehen, der selber auch wirklich Maschinencode enthält, der von einer CPU genauso in dieser (noch) unveränderten Form auch ausgeführt werden kann.

    Da könnte man sich jetzt drüber streiten ob Hexkodierung/Prozentkodierung als "Veränderte Form" zählt.. Ich meine letztlich gibtst du direkt die Bytes an, die Umwandlung ist ja wohl trivial.

    Doch bisher habe ich immer noch keinen Shellcode gesehen, der selber auch wirklich Maschinencode enthält, der von einer CPU genauso in dieser (noch) unveränderten Form auch ausgeführt werden kann.

    Weil Shellcode eben meist in Form von source vorliegt. Also damit meine ich z.B. ein C Programm in dem der Shellcode in Form eines char-Arrays eingebunden ist. Diese Art der Einbindung ist nunmal die leichteste die ich kenne. In den Binaries liegt der Shellcode dan wieder in der "reinen" Form vor (binär als Bytes). D.h. nach deiner Definition enthält das Binary Shellcode die Source aber nicht... ?



  • Sone schrieb:

    So auch das Maschinencode direkt ausführbar ist und alles Andere eben kein Maschinencode ist.

    Und ausführbar ist er nur, wenn er gerade im Prozessor ist oder wenigstens auf dem Bus. Ausgedruckt oder auf dem Monitor ist es natürlich kein Maschinencode mehr, sondern das sind nur textuelle Repräsentationen. Nichtmal das Magnet-Zeug auf der Platte kann Maschinencode sein, da isses ja gar nicht ausführbar. 🤡



  • Moin.

    DarkShadow44 schrieb:

    Sag mal meinst du das ernst oder willst du nur provozieren ? 😕

    Moment mal, dich kann man schon mit einer allgemeingültige Definition provozieren?

    Ich suche eigentlich immer noch nach einer Definition für den Shellcode, aber nicht für den Maschienencode. Weil für den Maschienencode gibt es bereits eine eindeutige und allgemeingültige Definition. Und diese Definition ist nicht nur meine Definition, auch wenn ich es selber für zweckmäßig halte, genau diese Definition auch eigenständig zu verwenden. Es wäre auch eine Form der Höflichkeit, wenn du dich der allgemein üblichen Verwendung von bereits definierten Begriffen halten könntest. Danke.

    Assemblerbefehle und percent-encoded bytes sind selber noch kein Maschinencode, sondern werden erst später dazu gemacht. Genau darin unterscheiden sich Maschinencode und andere Bytes die in ihrer Form noch nicht von einer CPU direkt ausführbar sind.

    Deine Logik hinkt.

    Demnach müsste auch ein Bild das komprimiert oder verschlüsselt ist kein Bild mehr sein.. Weil es erst beim entschlüsseln/dekomprimeiren dazu gemacht wird.

    Natürlich ist es Maschinencode wenn es Prozentkodiert angeben ist, nur in anderer Form!

    Der Begriff "Bild" hat seine eigene Definition und diese ist mit der Definition vom "Maschienencode" nicht mal im entferntesten verkuppelt. Was du hier zu konstruieren versuchst hat keine gemeinsame Basis. Verschone mich bitte mit so einer Logik von dir und halte dich lieber an die allgemeingültige Definition, anstelle mir ein unlogisches Verhalten anzudichten. Welche Logik nun mehr hinkt, das hast du nun mit diesem Tanz auf zwei völlig unterschiedlichen Hochzeiten ja schon recht eindrucksvoll genug zeigen können.

    Es gibt nach der allgemeingültigen Definition keine andere Form von Manschienecode. Begreife das nun endlich auch einmal. Mir es dann auch noch vorzuhalten ich würde provozieren. Sag mal gehts dir noch gut? Halte dich gefälligts an die allgemeingültige Definition und laber mich hier nicht mit deinem davon abweichenden Stuss voll. Ich bin hier nicht deine Fussmatte für deine absonderlichen Spinnereien darüber.

    Doch bisher habe ich immer noch keinen Shellcode gesehen, der selber auch wirklich Maschinencode enthält, der von einer CPU genauso in dieser (noch) unveränderten Form auch ausgeführt werden kann.

    Da könnte man sich jetzt drüber streiten ob Hexkodierung/Prozentkodierung als "Veränderte Form" zählt.. Ich meine letztlich gibtst du direkt die Bytes an, die Umwandlung ist ja wohl trivial.

    Man kann sich eben nicht darüber streiten, wie die Definition von Maschienencode ist. Halte dich an die allgemeingültige Definition und höre damit auf den Begriff falch zu verwenden, bzw. anders zu definieren und eine davon abweichende Bedeutung anzudichten.

    Doch bisher habe ich immer noch keinen Shellcode gesehen, der selber auch wirklich Maschinencode enthält, der von einer CPU genauso in dieser (noch) unveränderten Form auch ausgeführt werden kann.

    Weil Shellcode eben meist in Form von source vorliegt.

    Meistens, oder immer nur? Wie wäre es einmal ein konkretes Statement darüber zu äussern, anselle das du die allgemeingültige Definition von Maschinencode immer wieder in Abrede stellst und den Begriff davon abweichend verwendest?

    ..

    @volkard: Entscheidend ist doch nur, ob die unveränderten Bytes so ausgeführt werden können, oder nicht. Wenn diese Bytes unverändert ausgeführt werden können, dann ist es nicht so wichtig wie diese Bytes zu einer CPU gelangen, um dort ausgeführt zu werden. So kann auch ein Maschienencode eingebettet in einer Batchdatei und auch auf einer Festplatte sich befinden und von dort in unveränderten Form zur Ausführung gebracht werden. Mit direkt von der CPU ausführbar bedeutet in diesem Zusammenhang doch nur, dass die Bytes selber für die Ausführung nicht verändert werden brauchen, also auch wenn diese Bytes erst zu einer CPU noch befördert werden müssen, ist danach die direkte Ausführung solcher unveränderten Bytes möglich.

    Wenn jedoch die Bytes erst verändert werden müssen, um ausführbar zu werden, z.B wenn diese Byte vorher komprimiert wurden, dann sind die Byte in dieser Fom nicht ausführbar und damit auch noch kein Maschinencode, sondern diese Bytes müssen erst wieder ausgepackt und damit verändert werden, um ausgeführt werden zu können.

    Dirk



  • Der Begriff "Bild" hat seine eigene Definition und diese ist mit der Definition vom "Maschienencode" nicht mal im entferntesten verkuppelt.

    Das war ein Vergleich...

    halte dich lieber an die allgemeingültige Definition

    Also an gar nichts ? Weil es keine allgemeingültige Definition gibt ?? 🙄
    Woher stammt deine heilige Definition von Maschinencode ?

    So kann auch ein Maschienencode eingebettet in einer Batchdatei und auch auf einer Festplatte sich befinden und von dort in unveränderten Form zur Ausführung gebracht werden

    Und wenn z.B. die Festplatte verschlüsselt ist ? Dann können die Bytes nicht unverändert ausgeführt werden. Das bedeutet wenn die Festplatte verschlüsselt ist und ich dort Maschinencode ablege ist es danach keiner mehr 🤡

    Meistens, oder immer nur? Wie wäre es einmal ein konkretes Statement darüber zu äussern, anselle das du die allgemeingültige Definition von Maschinencode immer wieder in Abrede stellst und den Begriff davon abweichend verwendest?

    Immer natürlich nicht. Irgendwann muss man sie ja in Binaries verwandeln um sie einzusetzen. Wenn du den Shellcode nur einsetzen willst brauchst du keine Asm Source, da reichen die Binaries. Wenn du es aber verstehen willst machts ein kommentierter Quelltext einfacher.



  • freecrac schrieb:

    @volkard: Entscheidend ist doch nur, ob die unveränderten Bytes so ausgeführt werden können, oder nicht. Wenn diese Bytes unverändert ausgeführt werden können, dann ist es nicht so wichtig wie diese Bytes zu einer CPU gelangen, um dort ausgeführt zu werden. So kann auch ein Maschienencode eingebettet in einer Batchdatei und auch auf einer Festplatte sich befinden und von dort in unveränderten Form zur Ausführung gebracht werden. Mit direkt von der CPU ausführbar bedeutet in diesem Zusammenhang doch nur, dass die Bytes selber für die Ausführung nicht verändert werden brauchen, also auch wenn diese Bytes erst zu einer CPU noch befördert werden müssen, ist danach die direkte Ausführung solcher unveränderten Bytes möglich.

    Also sind die Bitmuster auf der Festplatte definitiv KEIN Maschinencode.
    http://de.wikipedia.org/wiki/Run_Length_Limited
    Da finde ich so eine einfache Hex-Codierung wie im C-Quelltext aber doch viel einfacher als das, was die Festplatte da codiert.

    freecrac schrieb:

    Wenn jedoch die Bytes erst verändert werden müssen, um ausführbar zu werden, z.B wenn diese Byte vorher komprimiert wurden, dann sind die Byte in dieser Fom nicht ausführbar und damit auch noch kein Maschinencode, sondern diese Bytes müssen erst wieder ausgepackt und damit verändert werden, um ausgeführt werden zu können.

    Tja, mir reicht es auch, wenn die Codierung ausreichend trivial und eindeutig ist.

    Als Purist müßtest Du sagen, daß nur die Folge von Nullen und Einsen als Maschinencode gelten kann. Bereits die Spannungslevel auf dem Bus sind eine Codierung. Man müßte zum Beispiel dazusagen, ob 0=LO 1=HI oder 0=HI 1=LO gilt, um es überhaupt decodieren zu können.



  • tgdgdgd schrieb:

    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.

    Sehr schon gesagt. Das Wort "shellcode" läuft uns davon! Muss jetzt keine shell mehr aufmachen, muss nur irgendwie was Nettes machen und per Pufferüberlauf-Exploit oder Ähnliches ausführbar sein, nichtmal erhöhte Rechte erzeugen.
    Nu kommen sogar Leute her und assemblieren den Code nicht mehr, und tragen ihn in eine shellcode-Datenbank ein, wie gemein von ihnen!
    http://www.shell-storm.org/shellcode/files/shellcode-146.php

    Ich fürchte, der Unterscheidung zwischen Assembler-Code und Maschinen-Code geht es irgendwann auch an den Kragen. Hat ja auch nicht gerade mehr die Praxisrelevanz heute.

    Das macht natürlich die allgemeingültigen Definitionen ein wenig schwierig.



  • Hallo freecrac,

    ich kann ja verstehen, dass man genaue Definitionen zu gewissen Begriffen haben möchte.
    Aber ich denke, in dem Thread ist jetzt alles geklärt.
    Und verschiedene Leute haben halt leicht unterschiedliche Erklärungen zu bestimmten Begriffen. Diese Schwammigkeit ist in der Praxis einfach vorhanden, damit muss man wohl oder übel leben.

    Wenn du dich näher mit Shellcode, Hacking sowie 'Reversen' auseinandersetzen möchtest, so lerne es. Nur durchs Rumspielen erhältst du ein gutes Gefühl, wie das ganze funktioniert. Und dann brauchst du auch keine genaue Definition von irgendeinem Begriff mehr.

    Wenn du kein Geld für Bücher ausgeben möchtest, lies z.B. das hier:
    Smashing The Stack For Fun And Profit
    http://insecure.org/stf/smashstack.html

    Writing Shellcode
    http://staff.ustc.edu.cn/~sycheng/sst/exp_bof/Writing_shellcode.html

    Wenn du dich näher mit dem Thema auseinandersetzen möchtest, so kann ich dir folgendes Buch empfehlen. Es hat eine vorbereitete Linux CD dabei, welche du in einer virtuellen Maschine installieren kannst. Damit kannst du alle Beispiele des Buches probieren (gesamter Sourcecode ist dabei).
    **Hacking - Art of Exploitation von Jon Erickson
    **


Anmelden zum Antworten