OEP와 분기점의 OPCODE를 구해야 겠군요. 다음은 실행화면 입니다.
다음은 PEiD로 본 프로그램 정보입니다. ASPack 으로 패킹된 것을 보실 수 있습니다.
ASPack은 UPX같은 패커가 아닌 프로그램을 보호하기 위한 프로텍터입니다.
이 프로텍터의 언패킹 방법을 알아보겠습니다. 아래는 Ollydbg로 열었을 때의 화면입니다.
PUSHAD 명령어로 레지스터들을 전부 스택에 올리는 것으로 프로그램을 시작합니다. 이는 나중에 패킹이 모두 풀리고 난 후 POPAD 명령어로 레지스터들을 돌려받게 됩니다. 그렇기 때문에 PUSHAD 명령어를 실행했을 때의 ESP에 브레이크 포인트를 걸어놓으면, 패킹이 모두 풀리고 프로그램이 시작하는 위치로 이동할 수 있습니다.
구체적인 순서는 우선 PUSHAD 명령어를 실행(F8)합니다. 그 후 레지스터 창의 ESP에서 마우스 오른쪽 클릭 -> Follow in Dump를 클릭합니다.
그리하면 OllyDbg 하단의 왼쪽(Dump 창)이 ESP의 위치로 이동하게 됩니다.
그 후 ESP 위에서 마우스 오른쪽 -> Breakpoint -> Hardware, on access -> Dword 순으로 클릭한 후, 프로그램을 실행(F9)하면 우리가 원하는 위치에서 멈추게 됩니다.
실행한 후의 모습입니다. 바로 윗줄에는 POPAD로 레지스터들을 돌려받는 코드가 있는 것을 보실 수 있습니다.
그리고 4줄 아래에 RETN 명령어가 있는 것 볼 수 있는데 이 부분이 실제 프로그램으로 가는 부분입니다.
이동하고 나면 위처럼 코드가 이상하게 보이게 됩니다. 이 때 Ctrl + a 를 누르면 어느 정도 정렬이 되긴 하지만 안될때도 있습니다. 이럴 땐 덤프를 뜬 후 그 파일로 실행하시면 제대로 보이게 됩니다.
덤프한 파일의 내용입니다. 저 시작부분이 OEP 입니다. OPCODE를 구하는 것은 다음 글에서 설명하겠습니다.