스터디/SWING 리버싱

[Reversing] 패킹 & UPX 문서화 및 PEiD 결과 비교

ruruby 2021. 9. 25. 18:20

패킹이란?

프로그램 코드의 크기를 줄이기 위해 압축하거나, 프로그램 분석을 어렵게 하기 위해 암호화를 하는 것.

패킹을 하면, 악성코드가 은폐되고 문자열 검색이 안됨. (실제 악성코드들 중 몇몇은 리버싱을 막기 위한 패킹이 되어있음)

 

실습과정

0. 준비

1. 툴 없이 언패킹

2. PEiD 결과 비교

* PEiD? 패커를 탐지해주는 툴. 패킹 여부 확인 가능.  

 

0. 준비

notepad.exe 32bit 버전과 upx를 다운 받아 동일한 폴더에 놓는다. (EP Section, 컴파일 환경 등 출력 가능)

참고자료: upx 다운로드 링크(Release UPX 3.96 · upx/upx (github.com)), PEiD 다운로드 링크(Download PEiD free - latest version (softfamous.com))

 

 

notepad.exe 파일은 PE32 정보를 가지는 32bit 파일이다.

 

upx를 실행 시 출력되는 화면이다. 적절한 옵션을 통해 사용한다.

 

기존의  notepadxp.exe파일을 upx로 패킹해준다. 이때 패킹한 결과 파일명은 notepadxp_upx.exe로 지정해주었다.

파일 크기가 66048byte에서 48128byte로 압축되었다. 

 

  Notepadxp.exe Notepadxp_upx.exe
공통점 PE header 크기 동일
첫 섹션의 RawDataSize는 0
.rsrc 는 거의 변하지 않음
차이점 .text
.data
EP는 첫번째 섹션에 위치
.text 이름이 .UPX0로 변경된다
.data 이름이 UPX1으로 변경된다
EP는 두 번째 섹션에 위치

 

아래는 원본 파일(Notepadxp.exe)의 entry point 부분이다. 

 

PEiD 설치

 

 

 

 

1. 툴 없이 언패킹

패킹한 파일(Notepadxp_upx.exe)의 시작지점에는 PUSHAD 명령어로 시작한다.

PUSHAD부터 코드를 진행하여 POPAD를 모두 수행해야 언패킹이 되고, 이후 몇개의 명령어를 실행하면 원래 프로그램의 진입지점으로 이동한다. 

따라서 언패킹을 하기 위해서는 POPAD까지 수행한 후, 원래의 진입지점으로 jmp해야한다. 

아래에서 POPAD와 jmp에 bp를 걸어준 후 실행해주었다.

 

 jmp명령어 실행 직후 프로그램의 원래 진입지점이 등장했다. (0. 준비 과정에서 확인한 명령어의 집합과 동일)

 

2. PEiD 결과 비교

Notepadxp.exe 파일(패킹 미적용)

 

Notepadxp_upx.exe 파일(패킹 적용)

EP Section의 경우 UPX1로 변경된  것을 확인할 수 있었으나,

UPX 패킹이 되었다는 결과는 검출해내지 못했다. (원래 패킹 여부와 패킹 방식을 모두 검출해주는 툴인데, 안되는 이유를 차후 알아봐야겠다.)