COST 바이너리를 올바르게 디스 어셈블하는 것이 여전히 문제가 있다는 것을 알고 있습니다. 그러나 기호와 디버그 정보가 주어지면 디스어셈블러는 모든 바이너리를 분해 할 때 100 % 정확도를 얻을 수 있습니까? 그렇지 않은 경우 실패한 사례가 무엇인지 알고 싶습니다.디스어셈블러는 100 % 정확도를 얻을 수 있습니까?
0
A
답변
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에서 길다).
그러나 실제로는 대부분의 코드가 컴파일러에서 생성됩니다. 따라서 컴파일러 코드는 실제로 쉽게 분해됩니다.