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정보들도 가져와야한다
[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 |