upx로 패킹한 파일을 분석해보자.
패킹된 파일의 EP 포인트 지점에서는 ESI 레지수터에 두번째 섹션 시작 주소를, 그리고 EDI레지스터에는 첫번째 섹션 시작 주소를 세팅한다.
Source(ESI)로부터 데이터를 읽어 압축 해제 후 Destination(EDI)에 저장시킬 것이다. 그러므로 UPX EP 코드를 전부 트레이싱하면 OEP를 찾을 수 있다.
중요한 루프 #1
EDX에서 한 바이트를 읽어 EDI에 쓰는 것이다. EDI레지스터가 가리키는 주소는 첫 번째 섹션의 시작 주소이며, 메모리에서만 존재하는 섹션이다(내용은 전부 NULL).
중요한 루프 #2
본격적인 디코딩 루프로, ESI가 가리키는 두 번째 섹션의 주소에서 차례대로 값을 읽어서 적절한 연산을 거쳐 압축을 해제하여 EDI가 가리키는 첫 번째 섹션의 주소에 값을 써준다.
중요한 루프 #3
원본 코드의 CALL/JMP명령어의 destination 주소를 복원시켜주는 코드이다.
중요한 루프 #4
IAT를 세팅하는 루프이다. EDI가 두번째 섹션 영역으로 세팅된다. 이곳에는 원본 notepad.exe에서 사용되는 API 이름 문자열이 저장되어 있다. 이 과정을 이름 문자열이 끝날 때까지 반복하면 원본 notepad.exe의 IAT 복원 과정이 마무리된다.
upx패커의 특징 중 하나는 EP코드가 PUSHAD/POPAD명령어로 둘러싸여 있다는 것이다. OEP코드로 가는 JMP명령어가 POPAD명령어 바로 이후에 나타나므로 이 JMP명령어에 BP를 설치하고 실행하면 바로 OEP로 갈 수 있다.