Hubeen's Home

UPX Pakking principle

* UPX : 많고 많은 널리 사용되었던 실행 압축 프로그램


PE File : http://blog.hubeen.kr/306

실행압축?

실행압축이란 실행가능한 파일(PE파일)을 대상으로 파일 압축하여 용량과 리소스파일을 보지 못하게 함.
압축된 것을 푸는 방법은 파일 내에 압축해제 코드를 포함하고 있어서 실행되는 순간 메모리에서 압축을 해제시킨 후 실행된다.

Analysis


                                                                                                              [ not pakking.exe Section ]                                                                      [ pakking.exe Section ]                              


위의 이미지는 패킹된 프로그램과 패킹이 되지 않은 프로그램의 차이다.
패킹이 된 프로그램의 크기는 8.00KB에서 6.5KB로 줄어든 것을 볼 수 있으며,
섹션 또한 압축되어 있음을 알 수 있다.

PE File의 기본 구조는 IMAGE_DOS_HEADER - DOS_STUB_CODE - IMAGE_NT_HEADER - TEXT - data - .rsrc 이다.
하지만 압축된 프로그램의 섹션을 보면 UPX0 - UPX1 - .rsrc 로 되있는 것을 볼 수 있다.

그리고 보면 UPX0 섹션에는 RAW Size를 보면 0으로 아무런 값이 들어가있지 않는 청결 순수 이미지를 가진 섹션이라는 것을 알 수 있습니다.



하지만 virtual size는 6000이나 엄청 크다는 것을 볼 수 있습니다.

그렇다면 UPX1에는 압축해제 코드와 원본 데이터가 들어가있다는 것을 예상할 수 있습니다.

그리고 압축해제된 데이터는 upx0에 들어갈 것 같다는 예상을 할 수 있습니다.



그렇다면 이제 올리디버거를 열고 동적 분석을 시작하도록 하겠습니다.



프로그램 실행 전 레지스터와 스택의 상황입니다.



PUSHAD 명령어가 실행된 뒤의 스택의 상황입니다.

PUSHAD 명령어는 레지스터의 모든 값들을 스택에 집어넣습니다. 



ESI와 EDI를 첫번째 섹션과 두번째 섹션 주소로 세팅합니다.

ESI = UPX1

EDI = UPX0



아까 위에서 봤듯이 virtual size는 6000이였음을 보았습니다.

딱 UPX0과 UPX1의 차이가 6000임을 눈으로 직접 볼 수 있습니다.



이 부분은 UPX0 섹션의 데이터 1byte씩 읽어와서 집어넣는 부분이다.


[ UPX1 섹션 데이터 값들 ]


[ UPX0 섹션에 데이터가 차곡차곡 들어간 값들 ]


[ 압축해제 루틴 ]


IAT 복구



함수 이름을 UPX0에서 가져온 뒤 GetProcAddress 함수를 이용해서 함수의 주소를 읽어온다.



그리고 EBX가 가르키는 주소에 함수의 주소를 저장한다.


실제 주소인걸 화긴완료


이제 모든 코드를 압축해제하면 upx0 주소로 점프하는 것을 볼 수 있습니다.


'0x20 Security > 0x22 Reversing' 카테고리의 다른 글

UPX Pakking Principle (UPP)  (1) 2017.07.07
PE File Format  (0) 2016.07.23

댓글 1