레나 3에서는 간단하게 PE구조에 대해서 공부할 수 있다.
사용할 도구는 pe view이다
레나 3파일을 실행시키면 다음과 같다.
그리고 코드의 흐름은 다음과 같다.
이때 nag을 지나가는 방법은 je를 jmp로 변경시키는 방법도 있지만 pe 구조를 변경시켜서 enter point를 nag다음으로 설정하는 방법도 있다.
일단 기본적인 파일의 pe 구조는 다음과 같다.
pe구조 설명 : https://rednooby.tistory.com/33
PE(Portable Executable) 말 그대로 옮겨다니면서 실행시킬 수 있는 파일을 뜻합니다.
MS에서 다른 운영체제와 이식성을 좋게 하기위해 만든 파일 포맷입니다
실행, 드라이버, 라이브러리, 오브젝트 총 4개의 계열이 있습니다
자세히 보시면 헤더의 끝부분과 각섹션 끝에 Null값이 붙는것을 확인하실 수 있습니다
Null은 padding이라고 불리우기도 합니다
즉. 최소 기본단위를 사용하기위해 Null값이 존재합니다.
-최소 기본단위? 컴퓨터에서 파일, 메모리, 네트워크 패킷 등을 처리할때 효율을 높이기 위한 개념
파일/메모리에서 섹션의 시작위치는 각각 최소 기본단위의 배수에 해당하는 위치여야하고 빈공간은 Null로 채워버립니다. (이해가 안되시는분은 아래그림 참고)
한번더 정리를 하자면..
각 세션의 시작위치는 최소기본단위의 배수에 해당하는 위치여야 하며 그값이 부족할 경우 Null값을 줘서 부족한 공간을 채워줍니다 이렇게 해서 최소기본단위가 적용된다고 말할 수 있겠습니다
VA는 (Virtual Address): 메모리의 절대주소
RVA(Relative Virtual Address): 어느 기준 위치(ImageBase)에서부터의 상대주소
1) 먼저 PE가 메모리에 적재되기 전에 기본 ImageBase는 0입니다
2) 그리고 PE안에서는 상대주소로 주소가 적히게 됩니다
PE헤더 내의 정보는 RVA형태로 된 것이 많습니다.
PE파일(주로DLL)이 프로세스 가상메모리의 특정위치에 로딩되는 순간 이미 그위치에 다른PE파일(DLL)이 로딩되어 있을 수 있습니다. 이때 재배치(Relocation)를 통해서 비어있는 다른자리에 로딩되어야 하는데 만약 PE헤더 정보들이 VA로 되어있다면 정상적인 엑세스가 이루어지지 않았을것입니다
이해가 안되신다면 그림으로 설명해드리겠습니다
game.dll가 00000000이라는 위치에 로딩되는순간 notepad.dll이 먼저 로딩이 되어버렸습니다
하나의 위치에 2개의 dll파일이 올라갈 수 없기 때문에 이때 재배치(Relocation)을 해줘야 하는 상황이 생기게 됩니다
이때 PE헤더 정보들이 VA(절대주소)로 되어있다면 정상적인 엑세스가 이루어 지지 않기 때문에
RVA(상대주소)로 해서 재배치가 발생해도 기준에 대한 상대주소는 변하지 않기 때문에 문제없이 원하는 정보에 엑세스 할 수 있게 됩니다.
RVA + ImageBase = VA
상대주소 + 기준위치 = 절대주소
섹션의 헤더에는 섹션의 크기, 섹션의 시작위치, 파일에서 섹션이 차지하는 크기, 파일에서 섹션의 위치, 섹션의 속성을 담고 있다.
1) .text
원래 Address of entry Point는 1000이 였다 image Base + address of entry point 를 더하면 4010000이고 이것이 메모리의 시작 주소이다.
위 사진처럼 entry point를 1024로 변경하여 메세지 박스를 넘겼다.
그 후에 나오는 메세지 박스는 nop으로 대체하였다.