본문 바로가기

2. Reversing (리버싱)/2) 개념 정리

[26.05.08] 개구리버싱 6주차 활동

16~19강 강의 정리

 

 

1. IAT (Import Address Table) 상세 메커니즘

프로그램 실행 시 DLL 내의 실제 함수 주소를 기입하는 테이블

PE 로더의 주소 바인딩 과정

  1. DLL 로드: IMAGE_IMPORT_DESCRIPTOR의 Name을 참조하여 LoadLibrary 실행
  2. INT 탐색: OriginalFirstThunk가 가리키는 INT(Import Name Table) 배열로 이동
  3. 함수 정보 추출: INT의 각 원소가 가리키는 IMAGE_IMPORT_BY_NAME 구조체에서 HintName 문자열 확인
  4. 실제 주소 계산: 해당 DLL의 EAT를 참조하거나 GetProcAddress를 호출하여 함수의 실제 메모리 주소(VA) 계산
  5. IAT 기입: 계산된 주소를 FirstThunk가 가리키는 IAT 배열의 대응하는 위치에 덮어쓰기

 

2. EAT (Export Address Table) 상세 구조

다른 모듈이 함수를 찾을 수 있도록 정보를 공개하는 논리적 연결망

3가지 핵심 배열의 상호작용

  • AddressOfNames: 함수 이름들의 문자열 주소 모음 (알파벳순 정렬)
  • AddressOfNameOrdinals: 이름 배열과 주소 배열을 이어주는 '인덱스 치환 테이블'
  • AddressOfFunctions: 함수의 실제 상대 주소(RVA)가 저장된 최종 리스트

GetProcAddress() 탐색 단계 (Binary Search)

  1. AddressOfNames에서 이진 탐색으로 원하는 함수 이름의 배열 인덱스(k) 추출
  2. AddressOfNameOrdinals의 k번째 위치에서 값(m) 확인
  3. 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을 거쳐 커널 서비스 호출 구조 활용