32_패킹&언패킹

oogu ㅣ 2022. 7. 28. 22:59

@ 32_패킹&언패킹

 

패킹

실행파일을 실행이 가능한 상태로 압축을 한다.

프로그램 코드 크기를 압축 + 프로그램 분석을 어렵게 하기 위해 암호화한다.
패킹된 파일은 PEview - IAT가 압축되어 함수가 보이지않는다. 따라서 분석을 하기가 힘들다.

 

압축 프로그램으로 파일을 압축을하면 압축을 풀어야지 파일을 실행할 수 있다.

하지만 파일을 패킹하면 파일을 실행할 때 자동으로 압축이 풀려서 실행이된다.

패킹된 파일을 원래상태로 되돌리는 것을 언패킹이라고 한다.

 

패킹할 수 있는 프로그램을 패커라고 한다.


1. UPX 

 - 운영 체제에서 사용하는 실행 파일 압축/해지 프로그램
 - 대략 60% 정도의 압축율을 제공한다.
 

2. 'Packing_1.exe' 파일 UPX 패킹

 1) upx을 이용하여 'Packing_1.exe' 파일을 'Packing_1_pack.exe'으로 패킹한다.

upx Packing_1.exe -o Packing_1_pack.exe

Packing_1.exe 가 Packing_1_pack.exe 으로 패킹되어 용량이 줄어든걸 확인할 수 있다.


 2) 'Exeinfope'를 이용하여 패킹/언패킹 유무를 확인한다.

                                            패킹 전                                                                                    패킹 후

 

Entry Point, File Size 가 달라진것을 확인할 수 있다. 또한 패킹 전에는 Microsoft Visual C++로 실행한다고 나오지만

패킹 후 에서는 UPX를 확인할 수 있다.

 


 3) 'PEview'를 이용하여 패킹/언패킹 PE 구조를 확인한다.

 - 원본 파일 -> SECTION .rdata -> IAT
 - 패킹 파일 -> SECTION . rsrc -> IAT (DLL/함수 전체 목록 확인 불가능)

 - 원본 파일 : 섹션 5개
 - 패킹 파일 : 섹션 3개


 - 원본 파일 : EP는 0x1340
 - 패킹 파일 : EP는 0x7910

 


3. 'Packing_1_pack.exe' 파일 UPX 언패킹

upx -d Packing_1_pack.exe -o Packing_1_unpack.exe

Packing_1_unpack.exe 파일을 언패킹 한다.

파일 용량이 줄어든걸 확인할 수 있다.

 

4. 올리디버거를 이용한 'Packing_2.exe' 언패킹

 1) 'Exeinfope'를 이용하여 패킹/언패킹 유무를 확인한다.

UPX가 보여 패킹이 된걸 확인할 수 있다.

 

 2) 올리디버거로 확인시 'UPX' 패킹 특징


 - EP 지점에 'PUSHAD' 명령어를 확인할 수 있다.
 - 'PUSHAD' 명령어를 이용하여 범용 레지스터 EAX ~ EDI(8개)를 스택에 저장(백업)하는 동작이다.  

 - 'POPAD' 명령어를 검색하고 해당 위치에 BP를 지정한다.
 - 'Ctrl+S' -> 'POPAD' 검색 -> F2 -> 'Ctrl+L' -> 더이상 검색 X -> F9

 

패킹된 파일은 실행하면 자체적으로 언패킹한다.
언패킹을 하기전 초기 레지스터 값을 가지고 EP에서 실행되어야 되기 때문에 PUSHAD 통해 스택에 저장해 둔다.

그 후 언패킹이 끝난 후 POPAD를 통해 초기 레지스터 값을 복원한다.


PUSHAD 개수 만큼 POPAD가 존재한다.

 

올리디버거를 이용한 언패킹 파일을 얻기 위해서는 자체적으로 언패킹이 끝난후 엔트리 포인트 주소(실제 코드)가 필요하다.


 4) 올리디버거 플러그인 기능을 이용하여 덤프를 실시한다.

PUSHAD를 실행한 후 Ctrl+s 눌러 POPAD 문자를 찾는다.

POPAD 문자를 찾았다. POPAD문자가 여러 개 일 수도 있기 때문에 Ctrl+l 눌러 찾아본다. 만약 더이상 문자가 없다면 Item not found 문자가 아래창에 뜬다.

 

POPAD 문자가 더 존재하지 않기 때문에 POPAD 문자 위치로 이동한다.

POPAD 위치가 초기 레지스터 값을 복원하는 위치이다. 따라서 POPAD가 실행되면 언패킹이 끝난 것이다.

언패킹이 끝나면 코드 엔트리 포인트가 나올 것이다.

그 위치가 아래 브레이크 포인트이다.

함수로 진입하면 언패킹이 끝난 후 엔트리 포인트이다.

이 위치를 엔트리 포인트로 만든 덤프파일(실행파일)을 만든다.

Plugins - OllyDump - Dump debugged process 
-> 언패킹 과정(401340)이 끝난 실행파일을 만든다.

기존 EP(7910)에서 EP(1340)으로 된 덤프파일을 만든다.

하지만 덤프파일은 실행되지 않는다. DLL 파일이 없기 때문이다. 
원래는 패킹된 파일이 실행되면서 자체적인 언패킹 과정을 통해서 DLL 파일이 연결되지만 덤프파일을 언패킹과정이 없기 때문에 DLL 파일 또한 없다.

 

따라서 덤프파일에 DLL 를 연결시키기위해 ImportREC 이용한다.

 

 

 5) ImportREC를 이용하여 덤프된 파일에 IAT 정보를 연결한다.


ImportRFC 프로그램은 덤프파일이랑 IAT 연결시켜준다. - 메모리에 올라간 실행파일에서 DLL를 긁어올수있다.따라서 실행되고 있어야 한다.

Attach to an Active Process 를 통해 메모리에 올라간 실행파일을 가져온다.


OEP(엔트리 포인트) 수정한다. 

현재 Packing_2.exe 위치한 주소(401340)는 자체적인 언패킹 과정이 끝났기 때문에 DLL이 존재한다. 

따라서 Packing_2.exe 위치한 EP 주소를 넣어야한다.

AutoSearch - 확인 - Get Imports

 

Packing_2.exe 가 가진 DLL 파일을 긁어왔다.

Fix dump 눌러 덤프파일을 선택하면 위 사진처럼 파일명 뒤에 _ 붙은 파일이 생성된다.

Packing_2_dump_.exe 파일이 언패킹된 실행파일이다.

정상적으로 실행되는 것을 확인할 수 있다.

Packing_2_dump_.exe 파일를 PEview로 확인해보면 IAT를 확인할 수 있다. 따라서 분석하기 편해졌다.

 

 

5. 올리디버거를 이용한 'Packing_3.exe' 언패킹

UPX 패킹되어있는걸 확인할 수 있다.

PUSHAD가 보인다. 따라서 POPAD가 있을 것이다.
Ctrl+s 로 POPAD를 찾고 Ctrl+l 로 찾으면 POPAD가 많이 나온다.

POPAD가 여러개 일때 PUSHAD에 대한 POPAD가 어떤 것인지 알 수 없다.

이럴때 ESP 레지스터에 breakpoint 걸어서 언패킹 방법(하드웨어 브레이킹) 사용한다.

 

PUSHAD 실행 후 메모리에서 ESP로 이동 후 

오른쪽 클릭 - Breakpoint - Hardware on write - Byte

esp 레지스터에 breakpoint가 걸린다.

F9를 누르면 esp가 breakpoint로 돌아올 때를 보여준다. 따라서 PUSHAD에 대한 POPAD를 할때 멈춘다.

 

어셈블리 한 칸 위로 올려보면 POPAD가 보인다. PUSHAD에 대한 POPAD가 실행 된 후 모습이다. 

레지스터 값을 확인해보면 초기 레지스터 값을 복원한걸 확인할 수 있다.

 

그 후 'Packing_2.exe' 언패킹 과정과 똑같다.

 

ImportREC에서 Get Imports를 눌렀을 때 DLL를 일부분만 가져오면 Size를 더 크게 조절하자!




6. 올리디버거를 이용한 'Packing_4.dll' 언패킹

EXEinfo로 확인한 결과 MPRESS로 패킹된걸 확인할 수 있다.

IAT 확인 결과 dll API가 압축되어 있는거 같다.

 

Packing_4 파일은 dll 파일이기 떄문에 EXE로 바꿔서 분석해야하는다. -> 권장

 

PEview - NT_HEADERS - FILE_HEADER

Characterisrics를 확인해보면 IMAGE_FILE_DLL(2000) 때문에 DLL 파일이 된 것이다.

저 부분을 1000(EXE)으로 바꾸면 EXE 파일이 된다.

pFile 위치를 확인하고 HXD를 실행한다.

드레그 부분이 Characterisrics 위치이다.

1302로 수정하고 후 저장하고 확장자를 EXE로 변경하면 DLL 파일를 EXE 파일로 변경이 가능하다.

수정된 파일을 올리디버거로 열면 PUSHAD가 보인다. 

 

위에서 했던 방법으로 언패킹 파일을 만들자!

 

 


만약 올리디버거에서 어셈블리어가 안보이면 CTRL + A 누르면 된다.

 

 

 

 

 

[참고]

패킹 요약

https://www.youtube.com/watch?v=DaSJwcNOcD4

'레나 튜토리얼' 카테고리의 다른 글

Ollydbg 패치  (0) 2022.07.30
Ollydbg 설명  (0) 2022.07.30
MOV, LEA, ADD, SUB, IMUL, IDIV  (0) 2022.07.28
02_PE 파일 분석(PE 헤더)  (0) 2022.07.26
01_리버싱 선수 지식  (0) 2022.07.26