Packing & Unpacking

2018. 4. 10. 23:57악성코드 분석




[1] Packing

(1) Compressor

단순히 실행파일의 압축을 목적으로 한다 ex) UPX

(2) Protector

실행파일의 보호를 목적으로 한다. Anti-reversing기법이 적용된다.



MS-DOS용 upx.exe 패킹도구를 이용해서 UPX패킹 및 언패킹을 실행시켜보겠다.


\> upx.exe [Target]

해당 타겟 실행파일을 upx패킹한다

\> upx.exe -d [Target]

해당 타겟 upx압축파일을 언패킹한다

\> upx.exe [Target] -o [FileName]

타겟실행파일을 다른 이름으로 패킹하여 저장한다


다음은 메모장의 패킹 전 후 의 모습이다 ( win32 )

실행파일의 용량이 압축되어 작아졌다

     


< 패킹 전 후의 헤더모습 >

[ 그림 1 ]

[ 그림 2 ]

 < 그림1 & 그림2 >

기존의 헤더에서는 IMAGE_SECRION_HEADER_.text, .data, .rsrc 가 존재하지만 그림2에서처럼 패킹된 파일은 IMAGE_SECTION_HEADER UPX0,1을 가지고 있다

UPX0에는 VirtualSize, SizeOfRawData 데이터가 있으며, WRITE권한을 가지고 있다

즉, 가상공간에 데이터크기만큼 복사해서 쓰기를 실행하고 있다


[ 그림 3 ]

[ 그림 4 ]

< 그림3 & 그림4 >

원본파일에는 import주소들이 존재하고 있지만, 패킹된 파일에서는 해당 import정보가 존재하지 않는다 

따라서 언패킹시 원본파일 소스코드 뿐 아니라, import정보들도 가져와야한다


[2] Unpacking

UPX패킹파일의 특징을 살펴보고 직접 수동으로 언패킹해보자.

Ollydbg Tool을 사용해서 소스코드를 먼저 분석한다



# UPX의 특징 PUSHAD & POPAD

PUSHAD : EAX ~ EDI 레지스터 모두 스택에 PUSH한다

POPAD : 스택에 있던 레지스터 값들을 각각의 레지스터로 복구시킨다

So, 패킹하려고 하는 실행파일의 원본을 스택에 저장시켜서 원본파일의 내용을 유지시킨다


아래 그림은 PUSHAD명령어가 실행되어 스택에 레지스터값들이 PUSH된 모습이다


여기서 잠시 생각해보자 !


UPX패킹툴이 PUSHAD를 실행한 다음, 실행파일에 대해서 패킹을 실시할 것이다

패킹을 완료한 이후에는 스택에 저장한 원본파일의 레지스터값들을 가져와서 복사하여 다른 메모리 주소에 저장한다

그래야 패킹한 파일이 원본파일처럼 동작될 수 있잔아 ~


우리가 언패킹해서 얻으려고 하는 것은 바로 "패킹되기 전 실행파일의 원본소스코드" 이다.


#1 PUSHAD를 실행하면 STACK에 레지스터값들이 들어갈 것이고, ESP는 스택의 최상위를 가리키고 있다

#2 ESP의 주소는 0x0006FFA4

#3 해당 주소에 break를 걸어둔다면?

#4 패킹파일이 실행되면서, ESP주소에 접근했을 때 파일 실행이 멈춘다.

#5 멈춤 이후 지점부터는 실행파일의 원본데이터가 존재한다

#6 해당 데이터들을 dump하자


* ESP주소 지점에 Break를 걸어주자

ctrl+G => ESP검색 => breakpoint-Hardware,on access-byte

debug - Hardware breakpoints 에서 다음 그림과 같이 확인할 수 있다


해당 실습은 Lena21번 문제의 UPX.exe를 활용한 문제이다

풀이는 다음 주소에 있다 http://itsaessak.tistory.com/306



'악성코드 분석' 카테고리의 다른 글

FSG 수동언패킹 [ Lena21 ]  (0) 2018.04.14
Upack 수동언패킹 [ Lena21 ]  (0) 2018.04.14
UPX 수동언패킹 [ Lena 21 ]  (0) 2018.04.10
PE File Structure  (0) 2018.04.10
어셈블리어 정리 ( cmp & TEST & ZF & CF )  (0) 2018.04.04