2016-06-16 5 views
0

Я знаю немного C и немного сборки и хотел начать изучать обратную инженерию, поэтому я загрузил пробную версию Hopper Disassembler для Mac. Я создал супер основную программу C:Неиспользуемый вывод декомпилятора бункера

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

И скомпилирован с флагом -g (потому что я видел это раньше, и не был уверен, если это имеет значение):

gcc -g simple.c 

Тогда я открыл a.out файл в Хоппер Disassembler и нажал на кнопку псевдокоде, и он дал мне:

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

Единственная линия я вроде понимаю здесь устанавливает переменную 0x5 , Я не могу понять, для чего предназначены все эти дополнительные строки (например, rsp = rsp + 0x8;), для такой простой программы. Кто-нибудь захочет объяснить это мне?

Также, если кто-нибудь знает о хороших источниках/учебниках для введения в обратную инженерию, что тоже очень полезно. Благодарю.

+1

Оптимизация отключена? –

+0

О, я забыл об оптимизации. Я отключил это с каким-то другим флагом компилятора? Как общий вопрос, сделать программы, которые были скомпилированы с оптимизациями, очень сложно перестроить? – Austin

+1

Вы читали ABI для своей системы? Вы проверили, какие rax, rsp и rbp? Возможно, стоит прочитать https://cs.nyu.edu/courses/fall11/CSCI-GA.2130-001/x64-intro.pdf – 4386427

ответ

3

Похоже, он делает особенно плохую работу по производству «разборка псевдокода» (что бы это ни - это дизассемблер или decompliler не может решить?)

В данном случае это выглядит, как это имеет имеет elided установку кадра стека (пролог функции), но не очистка (функция epilog). Таким образом, вы получите гораздо лучшее представление о том, что происходит с помощью фактического дизассемблер посмотреть на реальный код разборки:

$ 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 

Итак, что мы имеем здесь код для установки кадра стека (адрес 0 -1), у вас есть задание (4), установив возвращаемое значение (b), срывая рамку (10), а затем возвращая (11). Вы можете увидеть что-то другое из-за использования другой версии gcc или другой цели.

В случае вашей разборки первая часть была удалена (оставленная как неинтересная задача по хозяйству) с помощью дизассемблера, но вторая-последняя часть (которая отменяет первую часть) не имеет.