티스토리 뷰

반응형

유명한 패커중에 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

 

UPack PE 헤더 분석 + 디버깅

안녕하세요. Message 입니다. 오늘은 오랜만에 리버싱과 관련된 2가지 주제로 포스팅을 하려 합니다. ① UPack PE 헤더 상세 분석 ② 디버깅 - OEP 찾기 <리버싱 핵심 원리 - 이승원님> 책에 있는 내용을 베이스로..

redscreen.tistory.com

 

반응형
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함