티스토리 뷰
유명한 패커중에 UPX, UPackPE 등등이 존재하는데 이번 포스팅에서는 굉장히 특이한 변형을 통해 PE 파일을 보호하는 UPackPE를 분석하고 이해하여서 PE구조에 대해 좀 더 심도깊은 이해를 해보자.
UPackPE에 적용된 기법들을 차례로 설명한다.
- 헤더 겹쳐쓰기.
헤더의 불필요한 부분을 낭비하지 않고 그 부분에 또 다른 헤더에 대한
데이터를 교묘하게 겹쳐쓰는 방법을 이용했다. (DOS Header와 PE Header)
- DOS Header에서 PE헤더의 Offset을 나타내는 e_lfanew 항목의 값을 0x10으로 바꿔 헤더를 겹쳤다.
이렇게 할 경우 DOS Header의 사용하지 않는 부분에 PE Header의 데이터를 작성할 수 있다.
- SizeOfOptionalHeader의 값은 구조체라 0xE0으로 고정되어있다.
그러나 이 값을 0x148로 바꾸게 되면 OptionalHeader 뒷 부분에 크기의 차이만큼 여유공간이 생긴다.
그 여유공간에 디코딩에 필요한 코드를 끼워넣는다. ( 띠용,,,, )
- SizeOfRvaAndSizes의 값은 구조체 배열의 길이이기 때문에 0x10으로 고정되어있다.
그러나 이 값을 0x0A로 바꾸게 되면 6개의 구조체배열만큼의 여유공간을 이용할 수 있다.
이 여유공간에 디코딩 코드를 끼워넣는다.
- IMAGE_SECTION_HEADER에서도 사용되지 않는 항목들에 UPack에서 사용되는 데이터들을 기록한다.
- 총 3개의 섹션이 존재하는데 Section 1, 3은 File상에서 같은 RVA, Size를 가진다.
그리고 Section 2는 무지무지 큰 Size를 가진다. (압축된 실제 데이터가 저장되어 있는 것 !)
Section 1의 Memory상에 올라갈 때 크기는 무지무지 크다. 압축 해제시
해당 PE파일의 모든 Section들의 코드가 Section 1에 자리잡게 된다.
- 이 때 보통 Section 1, 3 의 시작주소는 0x10으로 되어있는데, Alignment가 0x200이라면
이를 0x10이 아니라 0으로 내림해서 계산해야 원하는 RVA를 찾을 수 있다.
- IAT는 OptionalHeader의 Directory 배열에서 RVA를 찾을 수 있다.
이후 RVA - RAW 변환을 통해 이 PE파일에서 사용하는 API목록까지 찾을 수 있다.
결국 포인트는 PE구조에서 실제 사용되는 값과 사용되지 않는 값의 숙지가 중요하다는 것이다.
이쪽 블로그에 사진 및 자세한 내용이 설명되어있다.
https://redscreen.tistory.com/131
'Reversing > Concept' 카테고리의 다른 글
[Reversing] Detours 을 이용한 Windows API 후킹 2 (Feat. CreateRemoteThread를 이용한 DLL Injection) (0) | 2020.02.28 |
---|---|
[Reversing] Detours을 이용한 Windows API 후킹 (0) | 2020.02.27 |
[Reversing] PE 파일의 재배치 ( Feat. 나뭇잎 ) (0) | 2020.01.14 |
[Reversing] PE File Format 2 ( Feat. 나뭇잎 ) (0) | 2020.01.14 |
[Reversing] RVA → RAW ( Feat. 나뭇잎 ) (0) | 2020.01.14 |