물먹는산세베리아

DLL Injection 본문

Waregame & CTF/Reversing

DLL Injection

suntall 2021. 11. 13. 21:33

DLL 인젝션이란?

실행 중인 다른 프로세스에 특정 DLL 파일을 강제로 삽입하는 것이다. 다른 프로세스에게 LoadLibrary() API를 스스로 호출하도록 명령하여 사용자가 원하는 DLL을 로딩한다. 일반적인 DLL로딩과 달리 로딩 대상이 되는 프로세스가 자기 자신이다.

 

강제로 dll을 프로세스에 로딩시키면 해당 실행파일의 프로세스 메모레에 대한 접근 권한을 가질 수 있고, 사용자가 원하는 모든 일을 수행할 수 있다.

 

DLL 인젝션 과정

https://malwareforensics1.blogspot.com/2016/04/dll-injection-attack.html

 

 

 

아래는 myhack.dll을 notepad.exe 프로세스에 인젝션해주는 프로그램 소스코드이다.

 

1. 대상 프로세스 핸들 구하기

// #1.dwPID를 이용하여 대상 프로세스(notepad.exe)의 HANDLE을 구한다.
if(!(hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwPID))){
    _tprintf(L"OpenProcess(%d) failed!! [%d]\n", dwPID,GetLastError());
    return FALSE;
}

OpenProcess() API로 PROCESS_ALL_ACCESS 권한의 notepad.exe 프로세스 핸들을 구한다. 해당 권한을 얻으면 프로세스 핸들(hProcess)을 이용해서 프로세스(notepad.exe)를 제어할 수 있다.

 

2. 대상 프로세스 메모리에 인젝션할 DLL 경로 적기

//#2. 대상 프로세스(notepad.exe) 메모리에 szDllName 크기만큼 메모리를 할당한다.
pRemoteBuf = VirtualAllocEx(hProcess, NULL, dwBufSize, MEM_COMMIT, PAGE_READWRITE);

//#3. 할당 받은 메모리에 myhack.dll 경로("c:\\myhack.dll")를 쓴다.
WriteProcessMemory(hProcess, pRemoteBuf, (LPVOID)szDllPath, dwBufSize, NULL);

VirtualAllocEx() API를 이용하여 상대 프로세스(notepad.exe) 메모리 공간에 버퍼를 할당하고 로딩할 DLL 파일의 경로(문자열)를 알려준다.

WriteProcessMemory() API을 이용해 할당받은 버퍼 주소(pRemoteBuf)에 DLL 경로 문자열을 넣어 상대방 프로세스(notepad.exe) 메모리 공간에 인젝션할 DLL 경로를 써준다.

 

3. LoadLibraryW() API 주소를 구하기

//#4. LoadLibraryW() API주소를 구한다.
hMod = GetMokduleHandle(L"kernel32.dll");
pThreadProc = (LPTHREAD_START_ROUTINE)GetProcAddress(hMod, "LoadLibraryW");

LoadLibrary() API를 호출하려면 주소가 필요한데 위 코드를 InjectDll.exe 프로세스에 로딩된 kernel32.dll의 LoadLibraryW() API의 시작 주소를 얻어낸다. 만약 notepad.exe에 로딩된 kernel32.dll의 주소가 동일하면 문제가 없으나 kernel32.dll이 프로세스마다 서로 다른 주소에 로딩되면 메모리 참조 오류가 발생한다.

 

4. 대상 프로세스에 원격 스레드(Remote Thread)를 실행함

//#5. notepad.exe 프로세스에 스레드 실행
hThread = CreateRemoteThread(hProcess, //hzptocress
    NULL, //IpThreadAttributes
    0, //dwStackSize
    pThreadProc, //lpStackSize
    pRemoteBuf, //lpParameter
    0, //dwCreationFlags
    NULL);//IpThreadId

이제 LoadLibraryW() API를 호출하도록 명령을 내리면 되는메 Windows에는 이런 API를 제공하지 않기 떄문에 대신 CreateRemoteThread() API를 사용한다. (다른 프로세스에게 스레드를 실행시켜주는 함수)

 

출처: 리버싱 핵심 원리 (이승원 저)

 

전체코드

 

 

GitHub - oo7-0310/SWING_reversing_study

Contribute to oo7-0310/SWING_reversing_study development by creating an account on GitHub.

github.com

 

DLL Ejection

https://oo7-0310.tistory.com/143

 

DLL Ejection

DLL 이젝션(DLL Ejection)이란? 프로세스에 강제로 삽입한 DLL을 빼내는 기법으로, DLL 인젝션의 동작 원리와 기본 동작 원리는 같다. 대상 프로세스로 하여금 FreeLibrary() API를 호출하도록 만든다. * DLL

oo7-0310.tistory.com

 

'Waregame & CTF > Reversing' 카테고리의 다른 글

[dream.io]rev 7, 8  (0) 2021.11.13
DLL Ejection  (0) 2021.11.13
패킹, UPX, notepad 언패킹  (0) 2021.10.06
[dreamhack.io] rev-basic-3  (0) 2021.10.06
[dreamhack.io] rev-basic-2  (0) 2021.10.06