writeup

hischall 2013 hatehexray 헥스레이 디컴파일이 안되는 이유 + 되게 하는 법

진모씨 2014. 2. 20. 16:22

hischall 대회 2013년도 문제였던 hatehexray의 디컴파일법이 있는데요, 사실 그냥 테인트같은거 짜서 확인할수도 있지만 그냥 헥스레이를 되게 하는 방법으로 초점을 맞춰볼게요.


x86 명령어에는 prefix라는게 있는데, 명령어 앞에 있어서 그 명령어에 대한 부가설명을 해줘요.

0x00411EE0 에 들어가보면 db ~ 로 시작하는 부분이 있는데, 사실 prefix가 쓰이는 명령어가 따로 있어요.

예를 들어 0x2E, 0x3E prefix는 branch prediction이라고 해서 조건 문에서 둘 중 하나의 경우에 비중을 둠으로서 CPU 성능을 향상시킬수 있다고 나와있고, gcc의 __builtin_expect라는 구문으로 쓸수 있어요. (c 표준은 아니고 리눅스 커널 보면 이런소스 많이 나오는 것 같네요 - 사실 소스 하나보고 이렇게 말하는게 함정)


근데 이건 jmp같은 문법에서나 나오지, 일반 명령어에서는 쓰지 않아도 되거든요.

근데 쓸수 있어요. 근데 IDA에선 이걸 해석을 못했어요.


디스어셈블러에서 이런 prefix를 지원하지 않아서 생기는 문제에요. db ~ 로 출력하는데.. 뭐 지원하기는 또 애매하겠죠, 생략하는 건 좀 그렇고, 뭐 좋은 방법이 없었을 지 궁금해요. 헥스레이도 마찬가지에요.


그냥 이 prefix는 무시되는 부분이니까 죄다 nop(0x90)으로 바꾸고 실행하면 잘 디컴파일이 됩니당.


근데 소스가 왜이리 긴지 모르겠어요. 그냥 돌려보는게 쉬웠네요!


소스는 올려봤어요.

important.c


'writeup' 카테고리의 다른 글

Codegate 2014 weird_snus 풀이  (0) 2014.02.25
Codegate 2014 weirdshark 포렌식 문제 풀이  (0) 2014.02.24