2016-06-16 22 views
0

Ich weiß ein wenig C und ein bisschen Montage und wollte über Reverse Engineering lernen, also habe ich den Versuch von Hopper Disassembler für Mac heruntergeladen. Ich habe ein Super-Grund C-Programm:Nicht verstehen Hopper Decompiler-Ausgabe

int main() { 
    int a = 5; 
    return 0; 
} 

Und es mit der Option -g kompiliert (weil ich das sah vor und war nicht sicher, ob es von Bedeutung):

gcc -g simple.c 

Dann öffnete ich die a.out Datei im Hopper Disassembler und klickte auf der Pseudo-Code-Taste und es gab mir:

int _main() { 
    rax = 0x0; 
    var_4 = 0x0; 
    var_8 = 0x5; 
    rsp = rsp + 0x8; 
    rbp = stack[2047]; 
    return 0x0; 
} 

die einzige Linie, die ich hier irgendwie verstehen setze eine Variable 0x5 . Ich bin nicht in der Lage zu verstehen, wofür all diese zusätzlichen Zeilen (wie die rsp = rsp + 0x8;) für solch ein einfaches Programm sind. Wäre jemand bereit, mir das zu erklären?

Auch wenn jemand gute Quellen/Tutorials für ein Intro in Reverse Engineering kennt, wäre das auch sehr hilfreich. Vielen Dank.

+1

Optimierung deaktiviert? –

+0

Oh, ich habe Optimierungen vergessen. Ich schalte das mit einem anderen Compiler-Flag aus, oder? Nur als allgemeine Frage, werden Programme, die mit Optimierungen kompiliert wurden, sehr schwer rückentwickelbar? – Austin

+1

Haben Sie die ABI für Ihr System gelesen? Haben Sie überprüft, was Rax, RSP und Rbp ist? Mai das ist es wert zu lesen https://cs.nyu.edu/courses/fall11/CSCI-GA.2130-001/x64-intro.pdf – 4386427

Antwort

3

Sieht aus wie es eine besonders schlechte Arbeit zur Herstellung von „Demontage Pseudo-Code“ macht (was immer das ist - es ist ein Disassembler oder ein decompliler können sich nicht entscheiden?)

In diesem Fall sieht es aus wie es ist hat elided das Stack-Frame-Setup (die Funktion Prolog), aber nicht die Bereinigung (Funktion Epilog). So haben Sie eine viel bessere Vorstellung davon, was los ist, um einen tatsächlichen Disassembler mit auf dem tatsächlichen Abbau Code aussehen:

$ gcc -c simple.c 
$ objdump -d simple.o 

simple.o:  file format elf64-x86-64 

Disassembly of section .text: 

0000000000000000 <main>: 
    0: 55      push %rbp 
    1: 48 89 e5    mov %rsp,%rbp 
    4: c7 45 fc 05 00 00 00 movl $0x5,-0x4(%rbp) 
    b: b8 00 00 00 00   mov $0x0,%eax 
    10: 5d      pop %rbp 
    11: c3      retq 

Also, was wir hier haben, Code ist einen Stapelrahmen einzurichten (Adresse 0 -1), die Zuweisung, die Sie haben (4), Einrichten des Rückgabewerts (b), Abreißen des Rahmens (10) und dann Rückkehr (11). Möglicherweise sehen Sie etwas anderes aufgrund der Verwendung einer anderen Version von gcc oder eines anderen Ziels.

Im Falle Ihrer Demontage wurde der erste Teil vom Disassembler entfernt (was als uninteressante Haushaltsaufgabe ausgelassen wurde), aber der zweitletzte Teil (der den ersten Teil rückgängig macht) hat dies nicht getan.