IAT

배추야펄럭여·2022년 6월 1일
0

PE-Format

목록 보기
3/3

Library

  • 하나 이상의 서브루틴이나 함수들의 집합 파일
  • 재사용이 필요한 기능이 반복적인 코드 작성을 하지 않고 언제든지 호출하여 사용한다는 목적을 갖고 있다

Static Linking

  • 실행파일을 만들 때 라이브러리를 같이 포함시켜 실행파일을 만드는 것

DLL

  • 라이브러리가 메모리에 위치하고, 해당 모듈의 주소만 갖고 있는 방식
  • 동적으로 연결(링크) 할 수 있도록 제작된 라이브러리
  • DLL 로드 방법
명시적 링킹(Explicit) 
- 프로그램이 필요한 순간에 DLL 함수 정보를 로드하고 사용 후 해제

암시적 링킹(Implicit)
- PE 파일 자체에 사용할 DLL 함수 정보를 포함 후 프로그램 실행 시 로드

IAT

  • 프로그램이 다른 모듈에 있는 함수 호출 시 필요한 함수 주소 목록을 담고 있는 테이블



IAT에 기록되는 순서

1. PE 로더는 Name 에 있는 DLL 이름을 얻어온다
2. INT를 참조한다 ( 해당 INT에는 실행파일이 사용할 API들이 저장되어 있음 )
3. IAT에 실제 API의 함수 주소들을 기록한다 

즉 한마디로 [DLL 이름 찾고 함수 목록찾고 이름찾고 주소 찾는다]

1. Import Table 찾아가기

Import Table이 있는 주소를 알려주는데 

0x12B80 은 RVA값이므로 RAW 값으로 변환을 해야 한다

0x12B80은 .text 영역이다. 

0x12B80 - 0x1000(VA) + 0x400(PointerToRawData) = 0x11F80

다음과 같이 0x11F80으로 가면 Import Table이 있는데 가장 먼저 Name을 뽑는다

2. Name

Name의 RVA 값은 0x12E42 인데 이걸 RAW로 바꿔보면

0x12E42 - 0x1000 + 0x400 = 0x12242 

그럼 Name이 들어있는 실제 주소는 0x12242라는 것을 알 수 있다

3. OriginFirstThunk

OriginFirstThunk는 INT를 가르키고 있다 

INT란?
- 해당 실행파일에서 사용하는 API들의 이름 목록
 [ IMAGE_IMPORT_BY_NAME ]
 
해당 구조체 목록의 RVA값은 0x12C48 이걸 RAW로 바꾸면

0x12CA8 - 0x1000 + 0x400 = 0x120A8

4. FristThunk

이제 사용할 API들의 이름들을 얻었으니 실제 주소를 알아와야 한다

FristThunk는 IAT를 가르키는데 IAT는 실제 API들의 주소들이 기록되어 있다

FristThunk는 0x109C(RVA)로 기록되어 있으니 RAW로 변환해 보면 

0x109C - 0x1000 + 0x400 = 0x49C

이제 0x7744E3DB 로 가보면 ShellAboutW 가 로드되어 있을 것 이다.

하지만 디버거에서 확인을 해보면 

다음과 같이 주소가 0x7D642E6F로 바뀌어 있는데 이유는 
PE Loader에 의해 실제 함수의 값이 덮어지기 때문
profile
열심히 살아보죠

0개의 댓글