문제는 다음과 같다.

StolenByte를 구하라는 문제이다.
StolenByte가 뭔지 잘 몰라서 검색해보니 다음과 같았다.

언패킹을 했을때 덤프를 뜨기 어렵도록 원본코드 일부분을 패커 메모리 영역에 숨겨서 실행하는 안티 리버싱 기술이라고 한다.
PEView로 확인했을때 UPX패킹이 되어있었으므로 우선 언패킹을 해보자.

popad까지 언패킹을 하면 보이는 화면이다.
jmp 40100c구문이 EP로 이동하는 구문이다.

EP로 이동하게 되면 MessageBoxA함수를 호출하는데 매개변수가 0하나 밖에 보이지 않는다.

공식문서에 따르면 매개변수는 총 4개가 들어가야 하는데 지금으로썬 hWnd 핸들변수 하나만 전달된 것이다.
하지만 실행해보면 메시지 박스가 잘 띄워지는 것을 확인 할 수 있다.
그 이유는 바로 이전에 그림2를 보면 popad이후 push문이3개가 보인다.
패커 코드 영역에서 매개변수를 전달하도록 코드를 숨긴것이다.
바로 이부분이 StolenByte이다.
그러므로 StolenByte는 6A0068002040006812204000가 된다.
그렇다면 이제 이 파일을 언패킹 한 상태로 덤프를 뜨고 싶다면 어떻게 해야될까.
우선 이 상태로 덤프를 떠보자.
원래라면 아래와 같은 화면이 실행되어야 한다.

하지만 덤프 뜬 파일을 실행해보면 매개변수가 제대로 전달되지 않아서 아래와 같이 된다.

그래서 StolenByte를 코드에 옮겨주었다.

하지만 이상태로 덤프를 떠도 이전과 똑같이 오류가 난다.
그 이유는 NT헤더의 Address of Entry Point가 100C를 가리키고 있기 때문이다.
이 부분만 1000으로 수정해주면 정상 작동 할 것이다.
HxD프로그램을 이용해서 수정했다.

PEView상에서 Address of Entry Point의 위치가 128위치였으므로 이 부분을 0C 10에서 00 10으로 수정했다.(리틀엔디언)


간단한게 StolenByte를 찾고 안티디버깅을 우회해서 덤프까지 떠보았다.
확실히 PE파일의 구조를 잘 알고 있어야지 막힘없이 문제를 해결하는데 도움이 되는것 같다.