1. 패킹(Packing)
1) 정의
- 실행압축
- 실행(PE) 파일을 대상으로 파일 내부에 압축해제코드를 포함하고 있어 실행 시 메모리에서 압축을 해제 시킨 후 실행시키는 기술
- 코드 분석을 통한 프로그램의 악용을 막는 목적으로 활용
2) 종류
① Compressor
- 파일의 사이즈를 줄여 배포를 쉽게 하기 위해 사용하는 packer
- 악성코드에서 많이 활용
- Petite, ASPack, MEW, FSG, UPX 등
② Protector
- 원본 코드를 보호하기 위해 사용하는 packer
- 주로 상용 프로그램이나 온라인 게임 파일을 패킹할 때 많이 활용
- 코드 가상화 기법과 코드 난독화 기법을 많이 활용
- Themida, Yoda, ASProtect, armadilo 등
3) 패킹을 하는 이유
- 데이터 압축
- 악성코드에서는 작은 용량으로 빠르고 많이 퍼지게 하며 분석이 불가능하게 하기 위한 목적
- 데이터 보호
- 취약하게 나타날 수 있는 중요정보를 포함한 어플리케이션에 대한 노출 최소화
4) 패킹된 파일의 특징
- Section Name이 일반적이지 않거나 패커의 이름을 가짐
- Code Section은 보통 첫번째 Section이지만, 패킹 시 첫째가 아닐 수 있음
- Code Section은 보통 EP를 가리키므로 MEM_Excute권한을 가지지만, 패킹 시 그렇지 않을 수 있음
- Unpacking하면 Packing된 데이터가 저장되어 있던 세션이 비어있거나 Raw Size와 Virtual Size의 차이가 지나치게 큰 세션이 존재
5) 패킹 방법
- 원본코드를 복원시켜주기 위한 Unpacking Routine이 먼저 동작을 해야 하기 때문에 EntryPoint는 Unpacking Routine을 가리키고 Unpacking Routine부터 실행
- Unpacking Routine을 통해서 Decompressing/Decoding 작업을 수행하여 원본파일의 세션에 맞게 저장
원본파일이 가지고 있던 API를 원활하게 호출할 수 있게 수정
- 원본코드의 EntryPoint(OEP)로 점프
2. 언패킹(Unpacking)
1) 정의
- 패킹했던 파일을 푸는 것
- 압축이 해제된 상태의 코드를 덤프뜨는 것
- 강력한 패커일수록 언패킹이 어려움
2) 언패킹 방법
- Unpacking이 끝나고 나면 원본 코드를 동작시키기 위해 OEP로 분기하기 때문에 OEP로 분기하는 지점의 코드를 찾아야 함
- Unpacking된 데이터와 코드를 메모리에서 덤프하게 되면 파일로 저장할 수 있음
- 메모리 상에서 덤프를 하게 되면 IAT Table이 바인딩된 상태로 파일이 저장되므로 이것을 수정해주는 작업을 해야 함
- 언패킹을 했음에도 파일이 제대로 실행되지 않는 경우 패커가 패킹과정에서 엔트리 포인트 부분의 코드를 다른 부분으로 옮겨두기 때문에 이때 옮겨진 코드를 복구해야 함
'2020 WINTER STUDY > CTF Study' 카테고리의 다른 글
[Reversing] Day 6_Anti-Debugging (0) | 2021.02.22 |
---|---|
[Reversing] Day 5_CodeEngn Basic RCE L06 (0) | 2021.02.19 |
[Reversing] Day 4_abex' crackme #2 (0) | 2021.02.18 |
[Reversing] Day 3_suninatas 9 (0) | 2021.02.18 |
[Reversing] Day 3_xcz.kr prob 9 (0) | 2021.02.18 |