IAT 입력 과정(실습)
IMAGE_IMPORT_DESCRIPTOR 구조체의 위치(PE 바디에 위치)
>IMAGE_OPTIONAL_HEADER32.DataDirectory[1].Virtual Address =IMAGE_IMPORT_DESCRIPTOR 구조체 배열의 시작 주소
RVA가 7604 이다. 이는 .text섹션에 포함
RAW를 구하는 공식: RAW-Pointer to Raw Data = RVA - Virtual Address
text섹션 헤더의 Pointer to Raw Data=400
Virtual Address =1000
따라서.
RAW=7604-1000+400=6A04
어떻게 text 섹션에 포함된 줄 알았냐하면 text섹션을 봤을 떄 RVA가 1000이고 Virtual Size가 7748이라 7604가 이 안에 포함되기 때문입니다.
00007990: OriginalFirstThunk
FFFFFFFF: TimeDateStamp
FFFFFFFF: ForwarderChain
00007AAC: Name
000012C4: FirstThunk
-Name(임포트 함수가 소속된 라이브러리 파일의 이름 문자열 포인터)
RVA:7AAC RAW: ????
7AAC 또한 text섹션에 포함되어 있으므로 아까와 공식은 같다.
RAW=7AAC-1000+400=6EAC
따라서 RAW:6EAC이다.
comdlg.dll IID구조체의 첫번째 원소의 라이브러리 이름이다. 그 밑 두번째 원소의 라이브러리 이름도 이와 같은 방법으로 찾을 수 있다.
-OriginalFirstThunk(INT)
RVA:7990 RWA:6D90
저 빨간 박스가 INT이고, 각은 박스하나하나가 저번포스팅에서 언급한 IMAGE_IMPORT_BY_NAME구조체의 시작 주소입니다. 예를 들어 저기서 00007A7A를 보면
RVA:7A7A RAW:6E7A
임포트하는 API의 이름을 볼 수있었습니다.
하나 더 보자면
RVA:7A5E RAW:6E5E
역시 임포트하는 API의 이름을 볼 수 있었습니다.
-FirstThunk
RVA:12C4 RAW:6C4
저 부분이 comdig32.dll 라이브러리에 해당하는 IAT 배열 영역이다. INT와 마찬가지로 구조체 배열로 되어있어 NULL로 끝난다.
지금 보이는 이 763249006, 763185CE 등은 의미 없는 값으로, 프로그램이 메모리에 로딩될 때 이 값은 정확한 주소 값(API의 주솟값 INT의 값)으로 대체됩니다.
ollydbg로 확인할 수 있다.
-출처: 리버싱핵심원리
0 개의 댓글