Reversing
PUSHAD 명령어 : 현재 레지스터들을 스택에 저장한다.(EAX ~ EDI)
POPAD 명령어 : 레지스터를 원래대로 복구하는 명령어
스택에 하드웨어 브레이크 포인트 설치(실행 압축파일 OEP로 빠르게 가는법) 알아보기
POPAD 명령어 이후에 BP설치하기
하드웨어 BP는 CPU에서 지원하는 BP로 BP까지 실행후 멈춤
kernel32. dll, user32.dll 등 주요 시스템 DLL은 OS버전별로 고유 ImageBase를 부여 하였습니다.
그래서 재배치가 필요하지 않지만 , 다른 시스템 DLL들은 고유ImageBase가 있음에도 재배치가 일어난다.
Base Relocation Table : PE 재배치 를 한번 읽어 보았는데 어렵다...
PE 재배치 작업의 기본 동작 원리
1. 프로그램에서 하드코딩된 주소 위치를 찾는다.
2. 값을 읽은 후 ImageBase 만큼 뺀다.(VA -> RVA)
3. 실제 로딩 주소를 더한다(RVA -> VA)
핵심은 하드코딩된 주소 위치를 찾는 것인데 PE 파일 내부에 Relocation Table이라고 하는 하드코딩 주소들의 옵셋을 모아 놓은 목록이 존재함 NTheader - Optionalheader - Image data directory[5]
구조체는 IMAGE_BASE_RELOCATION의 배열로 이루어져 있다.
주요 멤버는
VirtualAddress : 기준주소// base address(RVA)
SizeOfBlock : 블록의 크기
// TypeOffset[1] : 멤버는 아니지만 주석으로 표시된 TypeOffset 배열의 의미는 이 구조체 밑으로 WORD(2byte) 타입의 배열이 따라 온다는 뜻이다.
#define IMAGE_REL_BASED_HIGHLOW 3
#define IMAGE_REL_BASED_ABSOLUTE 0
2바이트 배열의 값들은 TypeOffset 형태로 존재 type 4비트, offset 12비트 가 합쳐진 형태
ex) typeoffset 값이 3420 이면 type 은 3 offset은 420 이다.
type은 PE 파일에서 일반적으로 3 ,64 비트용 PE+ 는 파일에서 A이다.
간혹 악성파일은 type을 0으로 수정하는 경우가 있다(IMAGE_REL_BASED_ABSOLUTE 0)
따라서 Virtual Address 계산은 1000(virtual size) + 420(offset) = 1420(RVA)
찾는과정 요약 -
PE view 로 notepad.exe 오픈 - optional header 의 base reloction table의 데이터는 2f000 이다. 다시 PE에서
2f000 주소로 가보면(?) - IMAGE_BASE_RELOCATION 구조체를 볼수 있다. 기준주소가 1000으로 되어있다
첫번째 오프셋 값을 보면 3424 임을 알수 있다. 그럼 변환하면 1424(RVA) 이다. RAW로 변환하면 824이다.
PEview 에서 842 에 가보면 010010C8 이 있는 것을 알수 있다. 이젠 OllyDbg에서 해당 ImageBase + 1424로 가본다
그럼 ex) B810C8 이라는 값이 하드 코딩 되어있는 것을 볼수 있는데 이 값은 PE 재배치를 통해 바뀐 값이라는 것을 알수 있다.