일부 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 결정할 수있다? 그게 무엇이든)은 "해체 의사를"생산의 특히 가난한 일을하고있다처럼
최적화가 비활성화 되었습니까? –
아, 최적화를 잊어 버렸습니다. 나는 다른 컴파일러 플래그로 그걸 막 겠네? 일반적인 질문과 마찬가지로, 최적화 된 컴파일 프로그램은 리버스 엔지니어링하기가 매우 어려워 집니까? – Austin
시스템에 대한 ABI를 읽었습니까? rax, rsp, rbp가 무엇인지 확인 했습니까? 이 책을 읽을 가치가 있습니다. https://cs.nyu.edu/courses/fall11/CSCI-GA.2130-001/x64-intro.pdf – 4386427