2016-06-16 12 views
0

일부 C 및 어셈블리를 알고 리버스 엔지니어링에 대해 배우기 시작 했으므로 Mac 용 호퍼 디스어셈블러의 시험판을 다운로드했습니다. 나는 슈퍼 기본 C 프로그램을 만들어 :호퍼 디 컴파일러 출력을 이해하지 못했습니다.

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

을 그리고 (가 중요하면 나는 전에이를보고 확실하지 않았기 때문에) -g 플래그로 컴파일 :

gcc -g simple.c 

그런 다음 나는 오픈 a.out 호퍼 디스어셈블러의 파일은 의사 코드 버튼을 클릭 그리고 그것은 나를 주었다

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

에게 나는 일종의 여기 이해 0x5에 변수를 설정하는 것입니다 유일한 라인 . 이러한 단순한 프로그램을 위해 모든 추가 라인이 무엇인지 (예 : rsp = rsp + 0x8;) 이해할 수 없습니다. 누구든지이 사실을 설명해 주겠습니까?

또한 누구든지 리버스 엔지니어링에 대한 소개를위한 훌륭한 소스/튜토리얼을 알고 있다면 도움이 될 것입니다. 감사. 그것은이처럼 보이는이 경우

- (이 디스어셈블러 또는 decompliler 결정할 수있다? 그게 무엇이든)은 "해체 의사를"생산의 특히 가난한 일을하고있다처럼

+1

최적화가 비활성화 되었습니까? –

+0

아, 최적화를 잊어 버렸습니다. 나는 다른 컴파일러 플래그로 그걸 막 겠네? 일반적인 질문과 마찬가지로, 최적화 된 컴파일 프로그램은 리버스 엔지니어링하기가 매우 어려워 집니까? – Austin

+1

시스템에 대한 ABI를 읽었습니까? rax, rsp, rbp가 무엇인지 확인 했습니까? 이 책을 읽을 가치가 있습니다. https://cs.nyu.edu/courses/fall11/CSCI-GA.2130-001/x64-intro.pdf – 4386427

답변

3

이 보이는 스택 프레임 설정 (함수 프롤로그)이 elided이지만 정리 (함수 에필로그)가 아닙니다.

$ 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 또는 다른 대상을 사용하여 다른 것을 볼 수 있습니다.

해체의 경우, 첫 번째 부분은 디스어셈블러에 의해 생략되지만 (흥미로운 정리 작업이 아닙니다), 마지막 부분부터 두 번째 부분 (첫 번째 부분을 실행 취소하는 부분)은 그렇지 않습니다.