reverse_assembly UPX packing/unpacking
32_패킹&언패킹
- 분석 환경 : Windows7(32bit)
- 분석 도구 : exeinfope, PEview, upx, OllyDbg
1. UPX
- 운영 체제에서 사용하는 실행 파일 압축/해지 프로그램
- 대략 60% 정도의 압축율을 제공한다.
2. 'Packing_1.exe' 파일 UPX 패킹
1) upx을 이용하여 'Packing_1.exe' 파일을 'Packing_1_pack.exe'으로 패킹한다.
2) 'Exeinfope'를 이용하여 패킹/언패킹 유무를 확인한다.
3) 'PEview'를 이용하여 패킹/언패킹 PE 구조를 확인한다.
- 원본 파일(Packing_1.exe) -> SECTION .rdata -> IAT (DLL/함수 전체 목록 확인 가능)
- 패킹 파일(Packing_1_pack.exe) -> SECTION . rsrc -> IAT (DLL/함수 전체 목록 확인 불가능)
_____________________________________________________________________________________
- 원본 파일(Packing_1_pack.exe) : 섹션 5개
- 패킹 파일(Packing_1_pack.exe) : 섹션 3개
_________________________________________________________________________________________
- 원본 파일(Packing_1.exe): EP - 0x1340
-패킹파일(Packing_1_pack.exe): EP - 0x7910
_______________________________________________________________________________________
// 참고
- SECTION UPX0 : 메모리에 로드 된 우 압축 코드가 해제될 공간
- SECTION UPX1 : 압축 코드가 저장되어 있는 공간
3. 'Packing_1_pack.exe' 파일 UPX 언패킹
4. 올리디버거를 이용한 'Packing_2.exe' 언패킹
1) 'Exeinfope'를 이용하여 패킹/언패킹 유무를 확인한다.
2) 'PEview'를 이용하여 패킹/언패킹 PE 구조를 확인한다.
3) 올리디버거로 확인시 'UPX' 패킹 특징
EP 지점에 'PUSHAD' 명령어를 확인할 수 있다.
PUSHAD : 범용 레지스터 EAX ~ EDI를 스택에 저장(백업)하는 동작이다.
POPAD : 나중에 프로그램 내부에서 언패킹할때 명령어를 이용하여 스택에 저장된 레지스터 값을 복원한다.
3-1) EP = ImageBase + AddressOfEntryPoint = 0x00400000 + 0x00007910 = 0x00407910
PEview에서 확인한 정보들로 EP를 계산했더니 0x00407910가 나왔다.
3-2) 'F8'을 통해 'PUSHAD' 명령에 의해서 레지스터 값들이 스택에 저장되는지 확인한다.
-----> PUSHAD (F8)
3-3) Ctrl+S 를 통해 'POPAD' 명령어를 검색하고 해당 위치에 BP를 지정한다.
이때 주의할 점은 POPAD가 여러개 나올 수 있어서 F2 -> Ctrl+L 으로 POPAD가 더 있나 찾아줘야 한다.
여러개 나온다면 제일 마지막 POPAD로 이동해서 BP지정 후 F9로 실행시키기!
4) 올리디버거 플러그인 기능을 이용하여 덤프를 실시한다.
5) ImportREC를 이용하여 덤프된 파일에 IAT 정보를 연결한다.
importrec을 이용하면 아래와 같이 IAT가 연결된 파일이 한개 더 생성된다
IAT을 연결하기 전과 후의 차이점을 Peview를 통해 확인해보자.
- Packing_2_dump.exe 파일 IAT 정보를 연결 전 IAT
- Packing_2_dump.exe 파일 IAT 정보를 연결 후 IAT