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 있다.

   

   

'리버싱' 카테고리의 다른 글

개요  (0) 2016.09.20
어셈블리 정리  (1) 2016.09.20

+ Recent posts