본문 바로가기

2. Reversing (리버싱)

[2024.11.16]리버씽씽이_6주차 활동

6주차에는 유튜브 리버싱 강의를 18강 ~ 20강까지 학습하였다. 

https://www.youtube.com/playlist?list=PLY12b4RRLcSdsxgVvTW3mnNzMjVrd8JhO

 

리버싱 강의

리버싱에 대해 공부합시다.

www.youtube.com

 

1. EAT

  • 라이브러리 파일에서 제공하는 함수를 다른 프로그램에서 가져와 사용할 수 있도록 해주는 핵심 메커니즘
  • 함수의 시작 주소 파악 가능 및 구조체가 있음
  • EAT 내부에 저장되는 함수들의 정보는 PE 파일이 내보내는 함수의 개수와 해당 함수의 주소 뿐 → 한 개의 배열(IMAGE_EXPORT_DIRECTORY)

2. IMAGE_EXPORT_DIRECTORY(EAT의 구조체)– IMAGE_OPTIONAL_HEADER에 위치

  • NumberOfFunctions: 실제 Export 함수의 개수
  • NumberOfNames: Export 함수 중에서 이름을 가지는 함수
  • AddressOfFunctions: Export 함수 주소 배열(배열의 원소 개수 = NumberOfFunctions)
  • AddressOfNames: 함수 이름 주소 배열(배열의 원소 개수 = NumberOfNames)
  • AddressOfNamesOrdinals Ordinal(고유 번호) 배열(배열 원소 개수 = NumberOfNames)

 

3. <GetProcAddress() 작동 원리> 예시) kernel32.dll

   1)   AddressOfNames 멤버를 이용하여 함수 이름 배열로 이동

   2)   함수 이름 배열은 문자열 주소가 저장됨. 문자열 비교를 이용해서 원하는 함수의 이름을 찾음

         (Array_Index == 인덱스)

   3)   AddressOfNamesOrdinals 멤버를 이용해 Ordinal 배열로 이동

   4)   Ordinal 배열에서 Array_Index로 해당 고유번호(Ordinal) 값을 찾음

   5)   AddressOfFunctions 멤버를 이용해 함수 주소 배열(EAT)로 이동

   6)   함수 주소 배열(EAT)에서 전에 구한 Ordinal 값을 인덱스로 사용하여 원하는 함수의 시작주소를 얻음

          Ordinal == Index ordinal = 15, AddressOfFunctions[15]

          만약 Ordinal != Index라면

          AddressOfNamesOrdinals 배열의 값이 Ordinal == Index 가 아니더라도 GetProcAddress()를 사용.

          Ordinal 값을 가져오는 방식이 조금 다름

 

4. 총정리

1) IAT

  • PE 파일이 다른 DLL 파일에서 사용하는 함수를 참조할 때 사용.
  • PE 파일 내에서 참조하려는 모든 함수들의 주소로 채워짐
  • 프로그램이 해당 함수를 호출할 때 IAT에 저장된 함수 주소를 호출

 

2) EAT

  • PE 파일이 제공하는 함수를 다른 프로세스에서 사용할 수 있도록 내보내기 위해 사용
  • PE 파일이 로드될 때 EAT는 PE 파일이 내보내는 모든 함수의 주소를 저장
  • 다른 프로세스에서 PE 파일 내의 함수를 호출할 때 EAT 주소를 찾아서 호출

 

3) INT(Import Name Table)

  • PE 파일에서 참조하는 모든 DLL 파일과 함수 이름을 포함

 

5. 실행 압축

    1)   데이터 압축: 컴퓨터 공학의 주요 분야. 어떤 형태의 파일이라도 내부 바이너리로 되어 있으며 이는 적절한 압축 알                                   고리즘을 이용하여 프로그램의 크기를 줄임 → 보관과 전송을 용이하게 만들어 줌

    2)   압축의 종류

  • 비손실 압축(Lossless Data Compression): 흔히 사용하는 압축(알집 등) - 모든 파일 압축 가능
  • 손실 압축(Loss Data Compression): 파일을 손실시킨 후 데이터를 크게 압축시킴 - 모든 파일 압축 가능
  • 실행 압축(Executable Compression): 압축 해제 프로그램 없이 내부적으로 패킹을 해제시킴 - EXE 파일만 압축
    • 내부에 압축 해제 코드(decoding logic) 포함 → 취약점이 존재할 수 있음

    3)   decoding & encoding

  • 인코딩: 원본 → 다른 형태를 변환
  • 디코딩: 다른 형태 → 원본

 

6. 패커 & 프로텍터

1)   PE 패커(Packer): 실행 파일 압축기, 정확한 명칭은 Run-Time 패커로 PE파일 전문 압축기(ex. UPX, ASPACK)

  • 특징
    • 파일 크기를 작게 만듦.
    • 리버싱을 약간 어렵게 만듦
  • 단점
    • 메모리에서 디코딩 루프(언패킹)가 돌아 패킹이 풀림
    • 덤프를 뜨면 풀림

2)   프로텍터(Protector): 리버싱을 어렵게 만드는 압축기(ex. Themida, VMP)

  • 특징
    • Anti-Reversing(코드를 꼬아놓기, 루프문을 넣기, 함수명 바꾸기, 디버깅 탐지기능 넣기) → 파일의 크기가 커짐