EXE 형식의 PE 파일에서 Base Relocation Table 항목은 실행에 큰 영향을 끼치지 않고, 실제로 제거 후 실행을 해봐도 정상적으로 실행이 잘 된다. VC++에서 생성된 PE 파일의 Relocation 섹션이름이 바로 '.reloc'인데, 이 섹션이 제거되면 PE 파일 크기가 약간 줄어드는 효과를 볼 수 있다. .reloc 섹션은 보통 마지막에 위치하는데, 이렇게 마지막에 위치한 섹션을 제거하는 건 PEView와 Hex editor만 가지고도 수동으로 충분히 할 수 있다.
실습파일의 끝에 존재하는 '.reloc'섹션을 정확히 제거하려면 아래의 4단계 작업을 해야한다.
1단계- .reloc 섹션 헤더정리
PEView를 이용해 실습 파일의 .reloc 섹션 헤더 영역을 확인해보면, 섹션 헤더가 파일 Offset 270에서 시작한다는 것을 확인할 수 있다. Hex Editor을 이용해 이 부분을 모두 0으로 덮어 씌워준다.
섹션 헤더 크기가 28이기 때문에 Offest 270부터 297까지 0으로 덮어 써주면 된다.
2단계- .reloc 섹션 제거
PEView에서 .reloc 섹션의 시작 Offset이 C000임을 알 수 있다. 이곳부터 파일의 끝까지 .reloc 섹션 영역이라고 보면 된다. Hex Editor을 이용해 C000부터 끝까지 삭제해버린다. (아까는 00으로 '덮어쓰기'였지만 이번엔 'Delete')
Hex Editor에서 Ctrl+g 를 한 뒤 C000을 치면, C000의 주소로 바로 넘어가게 된다. 그 부분부터 끝까지 그래그 한 뒤, Backspace를 누르거나 Delete를 하면 된다. 이로써 .reloc 섹션은 물리적으로 제거되었지만, 다른 PE 헤더 정보들이 아직 수정되지 않아 파일이 정상적으로 실행되지가 않는다. 다음 단계들에서 이를 수정할 것이다.
3단계- IMAGE_FILE_HEADER 수정
섹션을 하나 제거 했으니 IMAGE_FILE_HEADER의 Number of Sections (섹션의 개수) 항목을 수정해줘야 한다.
IMAGE_NT_HEADERS의 IMAGE_FILE_HEADER에 들어가면, Number of Sections를 찾을 수 있다. Data에 5라고 적혀있는데, 이는 섹션의 개수가 5개라는 의미이다. 위에서 .reloc 섹션 하나를 삭제해줬기 때문에 4로 변경해줘야 한다.
Hex Editor에서 DE 주소를 가보면 05 내용을 확인할 수 있다. 04로 수정해주자!
4단계- IMAGE_OPTIONAL_HEADER 수정
.reloc 섹션이 제거되면서 섹션 크기만큼의 전체 이미지 크기가 줄어들었을 것이다. 이미지 크기는 IMAGE_OPTIONAL_HEADER 항목의 Size of Image 값에 명시되어 있으므로 이를 수정해 줄 것이다.
128 주소에 Size of Image가 11000으로 되어 있음을 확인할 수 있다.
아까 맨처음에 .reloc 섹션헤더를 살펴보면 Virtual Size가 E40임을 알 수 있다. 여기서 Section Alignment에 맞게 확장하면 1000이 된다. 따라서 Size of Image 값을 1000만큼 빼준다.
00 10 01 00 00 을 00 00 01 00 00으로 수정해주면 된다.
이제 모든 작업이 끝나서 EXE 파일이 정상적으로 작동될 것이다!
이 외에도 마지막 섹션의 크기 변경, 섹션 추가 등의 작업을 PEView와 Hex Editor만 가지고 변경할 수 있다.
끝~~
'리버싱(Reversing) > 리버싱 개념' 카테고리의 다른 글
리버싱 핵심원리 18장(UPack PE 헤더 상세 분석) (1) | 2020.11.14 |
---|---|
리버싱 핵심원리 16장(Base Relocation Table) (0) | 2020.11.09 |
리버싱 핵심원리 15장(UPX 실행 압축된 notepad 디버깅) (0) | 2020.11.07 |
리버싱 핵심원리 (14장) (0) | 2020.11.02 |
리버싱 핵심원리 13.5~13.8(PE File Format) (0) | 2020.11.02 |
댓글