본문 바로가기

공부/콤퓨타

DLL 인젝션 개념

728x90
반응형

DLL(Dynamic Link Library, 동적 링크 라이브러리)


* DLL 은 MS 윈도우에 구현된 동적 라이브러리

* DLL 내부에는 다른 프로그램이 호출하여 사용할 수 있는 다양한 함수들이 존재

*DLL 은 다수의 실행 파일에 공유될 수 있기 때문에 디스크 용량이나 메모리 절약 가능


묵시적 링킹(Implicit linking)

* 실행 파일 자체에 어떤 DLL의 어떤 함수를 사용하겠다는 정보를 포함시키고, 운영체제가 프로그램 실행시 해당 함수들을 호출하여 초기화한 후 사용


명시적 링킹 (Explicit linking)

* 프로그램이 실행 중일때 API를 이용하여 DLL 파일이 있는지 검사하고 동적으로 원하는 함수만을 불러와서 사용


ex) LoadLibrary(), GetProcAddress(), FreeLibrary() 함수를 사용해서 명시적 링킹 구현


단점?

프로그램 코드 자체가 길어짐, 스트링 구조 파악이 어려움 (그래서 악성코드에 주로 이용)



DLL 인젝션 


* 다른 프로세스에 특정 DLL 라이브러리를 강제로 삽입시키는 것

* 공격자가 원하는 DLL 파일을 프로세스 메모리 상에 강제로 Loding 시키는 것이 주 목적

* 프로세스에 로딩 된 DLL 라이브러리는 메모리에 대한 접근 권한이 생기므로 원하는 어떤 행동이라도 수행 가능


DLL 인젝션 공격은 보통 3가지 방식 이용

-> 레지스트리 이용, API를 이용, PE헤더 이용


 

레지스트리와 API를 이용하는 행위 샘플

 

 

먼저 레지스트리 이용 방법


아래 경로에 악성.dll 파일 경로 추가로 실행 가능

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows "Applnit_DLLs"


* 참고사항

User32.dll 영향

* 시스템 라이브러리 중 하나, Win32 GUI 와 관련된 API 함수 내장

AppInit_DLLs 레지스트에 등록된 DLL 로딩


* Vista 이상 OS 부터는 LoadAppInit_DLLs 레지스트리를 통해 User32.dll 라이르러리가 불러오는 기능을 활성화/비활성화 할 수 있음

LoadAppInit_DLLs 값 0 : User32.dll Appinit_dlls 라이브러리 참조 비활성화 (1은 활성화)

-> 보안이지만 값을 1로 바꾸면 우회 가능

 

 

이미 만들어 둔 appinit.dll 사용으로 확인





notepad 실행 -> User32.dll 사용되어 "Applnit_DLLs" 동작되어 appinit.dll 이 실행 확인





두번째로 API를 이용


CreateRemoteThread

* 특정 프로세스의 핸들값을 이용하여 새로운 스레드를 생성하는 API

* DLL 인젝션 시 LoadLibrary() API를 호출하기 위해 스레드를 생성


시나리오

1) 프로세스의 핸들을 구함, OpenProcess() API 사용

2) 대상 프로세스에 특정 크기만큼 메모리 할당, VirtualAllocEX() API 사용

3) 할당 받은 메모리 공간에 넣고자 하는 DLL 파일 경로 삽입, WriteProcessMemory() API 사용

4) LoadLibrary() 의 API 주소를 구함 -> CreateRemoteThread()를 이용하여 LoadLibrary() 실행


 


 

tra.exe


IDA 에서 tra.exe 확인


Open subviews - Imports 에서 CreateRemoteThread API 확인





CreateRemoteThread 함수로 이동 (2번 사용)





첫번째 주소 sub_4026F0+24 서브루틴이 끝나 버림

두번째 주소 sub_402D40+14Ep -> 빙고





상단에 OpenProcess 함수 확인, 00402DF7





OllyDbg 확인, 00402DF7

 

0012FBC8   0000002A  |Access = CREATE_THREAD|VM_OPERATION|VM_WRITE
0012FBCC   00000000  |Inheritable = FALSE
0012FBD0   00000238  \ProcessId = 238 (10진수 변환 = 568, explorer.exe PID로 확인 )

 

 


 

 

00402E27 VirtualAllocEx ()

00402E48 WriteProcessMemory ()

00402E6E GetProcAddress ()

-> EAX 7C801D77 -> LoadLibrary 주소

00402E82 CreateRemoteThread ()

-> memsys.dll 이 explorer.exe 에 로드 확인

 

* VirtualAllocEx 프로세스 메모리 공간에 버퍼를 할당하는 API

* VirtualAllocEx() -> 공간할당 -> WriteProcessMemory() * follow dump -> 문자열 삽입(memsys.dll)

 

 

 

 

 

IDA 에서 DllMain 확인, 10001000

올리 확인 (10001000, F2)

 

 

 




- DLL 개념 되새기기 -



728x90
반응형

'공부 > 콤퓨타' 카테고리의 다른 글

ISO 27001  (0) 2015.11.14
파밍 악성코드  (0) 2015.11.06
Packing and UnPacking  (1) 2015.10.30
malware(fping.exe)  (0) 2015.10.28
악성 도메인 구별법  (0) 2015.10.28