16~19강 강의 정리
1. IAT (Import Address Table) 상세 메커니즘
프로그램 실행 시 DLL 내의 실제 함수 주소를 기입하는 테이블
PE 로더의 주소 바인딩 과정
- DLL 로드: IMAGE_IMPORT_DESCRIPTOR의 Name을 참조하여 LoadLibrary 실행
- INT 탐색: OriginalFirstThunk가 가리키는 INT(Import Name Table) 배열로 이동
- 함수 정보 추출: INT의 각 원소가 가리키는 IMAGE_IMPORT_BY_NAME 구조체에서 Hint와 Name 문자열 확인
- 실제 주소 계산: 해당 DLL의 EAT를 참조하거나 GetProcAddress를 호출하여 함수의 실제 메모리 주소(VA) 계산
- IAT 기입: 계산된 주소를 FirstThunk가 가리키는 IAT 배열의 대응하는 위치에 덮어쓰기
2. EAT (Export Address Table) 상세 구조
다른 모듈이 함수를 찾을 수 있도록 정보를 공개하는 논리적 연결망
3가지 핵심 배열의 상호작용
- AddressOfNames: 함수 이름들의 문자열 주소 모음 (알파벳순 정렬)
- AddressOfNameOrdinals: 이름 배열과 주소 배열을 이어주는 '인덱스 치환 테이블'
- AddressOfFunctions: 함수의 실제 상대 주소(RVA)가 저장된 최종 리스트
GetProcAddress() 탐색 단계 (Binary Search)
- AddressOfNames에서 이진 탐색으로 원하는 함수 이름의 배열 인덱스(k) 추출
- AddressOfNameOrdinals의 k번째 위치에서 값(m) 확인
- AddressOfFunctions의 m번째 위치에 저장된 주소값이 해당 함수의 실제 주소
3. 주요 구조체 및 변수 상세
IMAGE_IMPORT_DESCRIPTOR
| 멤버명 | 역할 설명 |
| OriginalFirstThunk | INT의 시작 주소(RVA)로 함수 명칭 리스트 포함 |
| TimeDateStamp | DLL 바인딩 정보 확인용 타임스탬프 |
| Name | 해당 라이브러리 파일 이름 문자열 포인터 |
| FirstThunk | 실제 주소가 기록될 IAT의 시작 주소(RVA) |
IMAGE_IMPORT_BY_NAME
- Hint: DLL 내부의 고유 인덱스 번호
- Name: 호출하려는 함수의 실제 이름 문자열 (NULL 종료)
4. 핵심 기술적 특이사항
DLL 재배치 (Relocation)
- 원인: DLL의 ImageBase가 이미 다른 모듈에 의해 점유된 경우 발생
- 현상: 운영체제가 DLL을 다른 빈 주소 공간에 로딩함
- 결과: 이때 IAT의 존재 덕분에 프로그램 코드 수정 없이 바뀐 주소로 자동 갱신 가능
INT와 IAT의 관계
- 파일 상태: INT와 IAT는 동일하게 함수 이름 정보를 지칭하거나 같은 값을 가짐
- 메모리 로드 후: INT는 원본 정보를 유지하나, IAT는 실제 함수 주소값(VA)으로 완전히 교체됨
Kernel 및 Ring 구조
- Ring 0 (Kernel Mode): 시스템 자원 직접 제어 및 하드웨어 관리 모드
- Ring 3 (User Mode): 일반 애플리케이션 실행 모드로 시스템 보호를 위해 기능 제한
- 연결 고리: 유저 모드 프로그램이 시스템 기능을 쓸 때 DLL을 거쳐 커널 서비스 호출 구조 활용
'2. Reversing (리버싱) > 2) 개념 정리' 카테고리의 다른 글
| [26.05.22] 개구리버싱 8주차 활동 (0) | 2026.05.22 |
|---|---|
| [26.05.15] 개구리버싱 7주차 활동 (0) | 2026.05.15 |
| [26.05.01] 개구리버싱 4주차 활동 (0) | 2026.05.01 |
| [26.04.10] 개구리버싱 3주차 활동 (0) | 2026.04.10 |
| [26.04.03] 개구리버싱 2주차 활동 (0) | 2026.04.03 |