Study/REV

[Malware_#4] About Reflective DLL Injection

90mapt4 2024. 11. 22. 19:35
DLL을 활용한 공격을 시도하면 공격 흔적을 최소화할 수 있기에 공격자들은 DLL을 즐겨 활용하곤 한다.
저번 초기분석에서 분석하고자 하는 악성파일의 type을 'injector'라고 소개했는데 이에 대한 자세한 분석에 들어가기 전에 개념을 다져보자.

DLL을 이용한 공격방식 종류
  • 직접 실행
- Rundll32.exe : Rundll32.exe를 이용해 직접 DLL 실행
  • Injection
- DLL Injection : 실행 중인 타 프로세스 공간에 강제로 DLL 삽입해 Injection함
- Reflective DLL Injection : 프로세스의 메모리에 임의의 DLL에 대한 데이터를 삽입 후 직접 매핑하여 실행
  • Hijacking
- DLL Hijacking : 합법적인 실행파일의 정상 DLL인것 처럼 실행
- DLL side-loading : Search Order Hijacking과 DLL Proxy를 이용하여 원하는 DLL 실행

 

DLL을 이용한 공격방식은 크게 위와같이 이야기 해볼 수 있는데 이번엔 Reflective DLL Injection에 대해 자세히 다뤄볼 것이다.


DLL Injection?

 

Reflective DLL Injection과 DLL Injection, 무슨 차이를 가질까? 이를 설명하기 위해 우선은 DLL Injection의 개념에 대해 다뤄보아야 한다. 

 

위에서 간단히 설명하기는 했지만 다시 이에 대해 설명해보자면, DLL Injection은 실행중인 타 프로그램에 강제로 DLL을 삽입해 Injection하는 방식이다.

 

1. 가장 먼저 OpenProcess를 이용해 대상 프로세스의 핸들을 구한다.

2. VirtualAlloc로 대상 프로세스의 메모리 공간을 확보한다.

3. WriteProcessMemory로 대상 프로세스의 메모리에 Injection 할 DLL의 경로를 입력한다.

4. LoadLibray API의 주소를 구하기 (GetModuleHandle, GetProcAddress)

5. CreateRemoteThread로 대상 프로세스의 Injection 된 데이터를 실행한다.

 

위 과정처럼 비교적 간단히 DLL Injection이 가능하기에 악성코드에서 많이 사용되었으나 CreateRRemoteThread로 DLL 실행시 'IpStartAddress'라는 인자로 인해 쉽게 탐지되어 DLL Injection을 막을 수 있게 된다.

 

Reflective DLL Injection?

 

위에서 다룬 기존의 DLL Injection과 달리 실행중인 프로세스의 메모리에 임의의 DLL에 대한 데이터를 삽입 후 집접 매핑하여 실행시는 방식으로 작동한다.

 

이런 공격 방식으로 악성 행위를 하는 DLL은 백그라운드에 존재하지 않게 되어 탐지하기가 매우 어렵다. 그렇기에 Fileless악성코드에 많이 사용되고 있다.

 

과정은 DLL Injection과 3번까지는 같지만 3번 이후로는 다음과 같다.

 

4. VirtualAlloc()을 통해 메모리에 실행권한(RWX) 부여

5. 메모리에 DLL 매핑

6. Import Table 새로 생성

7. 이미지가 충돌없이 메모리에 로드되도록 Relocation

8. CreateRemoteThread로 대상 프로세스의 Injection 된 데이터를 실행

 

(출처 : giac.org)

차이점?

 

설명을 통해 한번 다루긴 하였지만 다시한번 다뤄보면 다음과 같다.

 

  • 인젝션
  DLL Injection Reflective DLL Injection
방법 인젝션 하고자 하는 DLL 경로 직접 삽입 인젝션 하고자 하는 데이터 메모리에 직접 삽입 후 메모리에 매핑
실행 Thread Thread
  • 탐지방법
  DLL Injection Reflective DLL Injection
탐지방법 - 레지스트리(AppInIt_DLLs)값을 체크
- 스레드 함수 내부 인자의 값 체크
- 정상 동작에서 벗어나는 메모리 영역의 권한 체크
(RWX권한 부여)