지난번 포스트에서 재배치를 배웠다. 생각해보면 PE 파일에서 Base Relocation Table 항목에서 .reloc 섹션을 날렵려도 실행이 될 것이다. exe 파일을 제일 먼저 실행시키기 때문에.
(DLL이나 sys 형식 파일은 base relocation table이 거의 필수다)
가장 마지막 섹션인 .reloc 섹션을 제거해보자.
이 섹션을 날리기 위해선 4단계의 절차가 필요하다.
1st .reloc 섹션 헤더 정리
2nd .reloc 섹션 제거
3rd IMAGE_FILE_HEADER 수정
4th IMAGE_OPTIONAL_HEADER 수정
PE view로 실습 파일을 연다.
몇가지 중요한 건 헤더의 시작 offset과 섹션의 진입주소이다.
헤더는 270에서 시작하고 섹션은 C000이구나.
이 헤더가 reloc 섹션의 헤더인데 이걸 다 0으로 덮어주면 된다. 시작 offset이 270이니까 270부터 297까지 덮어주면 된다고 한다. 근데 왜 297까지인지는 모르겠다. 섹션 헤더의 크기가 28이라서 그렇다고 하는데 그걸 어떻게 알아낸건지는 모르겠다.
헥스값을 편집하는 툴로 나는 HxD를 선택했다.
270 offset으로 가면 헤더 데이터들이 있다. 0으로 덮어주자.
헤더를 제거했으니 섹션을 제거하자. C000으로 간다.
전부 드래그에서 삭제해준다.
이제 끝난거 아닌가? 생각들 수 있지만 PE 헤더의 정보들이 수정되지 않아서 이대로는 실행되지 않는다.
정상 실행되려면 PE 헤더 정보를 수정해야 한다.
헤더 정보를 모아둔 여기서 Number of Sections 항목의 값을 하나 줄여야 한다. 왜냐면 .reloc 섹션을 날렸으니까.
저 Number of Section offset에 가서 5를 4로 바꿔야 한다.
요거를
요렇게 바꾼다. 그리고 다시 pe view로 보면
Number of Section이 잘 줄어들었다.
섹션 하나를 줄였으면 전체 프로세스의 이미지 크기가 줄어들었을 것이다. 그래서 헤더 정보에서 전체 사이즈도 수정해줘야 한다.
맨처음 여길 보면 .reloc 섹션의 virtual size는 E40이다.
메모리로 올라갈 땐 section alignment를 따를 테니까 E40의 virtual size는 1000만큼 확장된다. (뒤에 null이 붙어있을 거라고)
그래서 섹션 사이즈만큼을 빼준다면 원래 이미지 사이즈 11000에서 1000을 빼야한다.
128 offset부터 00 10 01인데 이거 littel endian으로 읽어야 한다.
그럼 011000이다. 이걸 010000으로 바꾸는 거니까 리틀 엔디안으로 00 00 01이다.
이제 reloc 섹션이 제거된 이 파일은 정상적으로 잘 실행된다.