메가IT아카데미 국기과정/리버싱과 악성코드 분석
[1-7] PE 파일 분석(PE 재배치)
한님폐하
2022. 9. 13. 11:55
1. PE 재배치
- 실행 파일이 로드될때 ImageBase에 다른 실행 파일이 로드되어 있다면, 중첩되는 문제가 발생된다.
- 이런 문제를 해결하기 위해서 로더는 ASLR 기능에 의해서 다른 주소를 찾아서 해당 주소로 실행 파일을 로드한다.
- 이때, 로드되는 주소가 변경되면 절대 주소 값을 변경된 주소로 수정되어야 한다.
- 이렇게 변경된 주소 정보를 '.reloc' 섹션에 저장하여 다른 실행 프로그램과 중첩되지 않도록 동작한다.
- 즉, PE 재배치는 프로그램에 하드코딩된 메모리 주소를 현재 로딩된 주소에 맞게 수정해주는 기능을 의미한다.
- DLL 파일이 로드될때 이미 그 주소에 다른 DLL이 로드된 경우, PE 재배치를 통해서 다른 주소에 로드된다.
2. PE 재배치 위치 확인
- PE 재배치 위치를 확인하려면, 다음과 같은 요소를 파악한다.
- ImageBase
- .reloc 섹션의 RVA 주소
- Base Relocation Table
- 프로그램 실행시 ImageBase 대역
- ImageBase 확인
- IMAGE_NT_HEADER -> IMAGE_OPTIONAL_HEADERS -> Image Base
- 0x01000000
- .reloc 섹션의 RVA 주소 확인
- IMAGE_NT_HEADER -> IMAGE_OPTIONAL_HEADERS -> Number of Data Directories -> BASE
- RELOCATION Table -> RVA
- IMAGE_SECTION_HEADER .reloc -> RVA
- 0x000BC000
- Base Relocation Table 확인
- SECTION .reloc -> IMAGE_BASE_RELOCATION
- RVA 0x1000 위치에 재배치할 주소가 0xB4(180byte) 크기 만큼있다는 의미이다.
- RVA of Block 0x00001000
- Size of Block 0x000000B4
- Type RVA 0x3000+0x0641(Offset)
- 프로그램 실행시 ImageBase 대역
- 'calc.exe'를 올리디버거 오픈 -> 맨 위로 올려서 확인
- 0x00911000
3. PE 재배치 구하기
① 프로그램에서 하드코딩된 주소(재배치될 주소) 위치를 찾는다.
② 하드코딩된 주소(재배치될 주소)에서 ImageBase 값을 뺀다.
③ 실행 파일이 로드될때 ImageBase 대역에 위의 ② 주소 값을 더한다.
- 하드코딩된 주소(재배치될 주소)가 있는 오프셋 구하기
- ImageBase 0x01000000
- RVA of Block 0x00001000
- Size of Block 0x000000B4
- Type RVA 0x3000+0x0641(Offset)
- 하드코딩된 주소가 있는 오프셋 = RVA of Block + Offset
- 하드코딩된 주소가 있는 오프셋 = 0x00001000 + 0x0641 = 0x00001641
- PEview 주소 보기를 RVA로 변경한 이후 '0x00001641' 위치로 이동하여 재배치될 4byte 주소 값을 확인한다.
- SECTION .text -> '0x0001641' 위치의 4byte 주소 값 확인 -> 64 40 05 01
- 하드코딩된 주소(재배치될 주소)에서 ImageBase 값 빼기
- 하드코딩된 주소값이 저장된 오프셋 4byte 주소 값 리틀 엔디언
- 0x00001641 64 40 05 01 01 05 40 64
- 0x01054064 - 0x01000000 = 0x00054064
- 파일이 로드될때 ImageBase 대역에 '0x00054064' 주소 값을 더하기
- 0x00911000 + 0x00054064 = 0x00965064
- 올리디버거 코드창에서 '0x00965064'로 이동(Ctrl+g)하여 재배치된 주소에 코드를 확인한다.
- 00965064 06 PUSH ES
- 이런 과정을 모든 Type+Offset에 대해서 반복적으로 진행하여 Type+Offset 값이 '0'이 되면 하나의 IMAGE_BASE_RELOCATION 구조체 동작은 종료된다.