2016-12-08 5 views
0

COST 바이너리를 올바르게 디스 어셈블하는 것이 여전히 문제가 있다는 것을 알고 있습니다. 그러나 기호와 디버그 정보가 주어지면 디스어셈블러는 모든 바이너리를 분해 할 때 100 % 정확도를 얻을 수 있습니까? 그렇지 않은 경우 실패한 사례가 무엇인지 알고 싶습니다.디스어셈블러는 100 % 정확도를 얻을 수 있습니까?

답변

0

일부 플랫폼에서는 디스 어셈블에 단일 해결 방법이 없을 수도 있습니다. 예를 들어,이 코드를 체크 아웃 :

mov rax, 0x1111111111E8 
call get_eip 
get_eip: 
pop rax 
sub rax, 13 
jmp rax 

가에 조립 다음 E8 11 11 11 11 유효한을 형성 :

48 B8 E8 11 11 11 11 11 00 00 E8 00 00 00 00 58 48 2D 0D 00 00 00 FF E0 

jmp rax 실제로 특별히 바이트의 mov rax, 0x1111111111E8 옵 코드의 중앙으로 이동합니다 상대 호출 opcode.

그럼 어떻게 위의 바이너리를 분해합니까? :)

다른 플랫폼 (예 : ARM)에서는 eip (ARM의 경우 pc) 값이 아키텍처를 결정합니다. 의 경우 이 PC 인 경우 켜기는 thumb 모드 (다른 명령어 세트)를 실행하는 반면 opcode는 항상 4 바이트 길이 (aarch64)이고 일반 모드에서는 4 바이트, 바이트는 thumb 모드 iirc에서 길다).

그러나 실제로는 대부분의 코드가 컴파일러에서 생성됩니다. 따라서 컴파일러 코드는 실제로 쉽게 분해됩니다.