6. DLL Injection
1) 프로세스 실행흐름
▣ DLL Injection?
- 시스템 해킹 시간때는 코드를 주입하고 RET 정보를 수정해줘야 실행이 됐음.
- DLL Injection은 dll 주입만 하면 dll 자체가 PE 구조라 알아서 E.P 참조해서 EIP 정해서 코드 실행까지 됨.
- 편하지만 알아서 실행되기 때문에 굉장히 위험할 수 있음.
▣ 가상 메모리 공간
- 가상 메모리 공간이 생김으로써 각각의 프로세스들이 서로 다른 프로세스의 메모리 공간에 접근을 못하게 됨.
- 보안 상 이유로 생겨남.
- 그러나 DLL Injection은 해당 사고를 파괴시킴. (한 프로세스의 가상메모리 상에 올라가서 동작을 함)
▣ 프로세스
- DLL Injection은 원래 프로그램이 정상동작을 해야하는 경우가 많기 때문에 주의해야한다.
☞ 시스템 해킹 시간에는 /bin/sh 실행 후 그 뒤의 상황은 처리하지 않았으나 DLL Injection은 주의해야함.
- 쓰레드를 새로 추가하여 해당하는 새로운 쓰레드에서 DLL 코드가 실행되도록 함.
☞ Thread Injection
2) DLL (Dynamic Linked Library)
▣ DLL 이란?
- 프로그램 실행 후 동적으로 로드되는 라이브러리.
- 별도의 파일로 존재.
- 이미 실행중인 프로세스의 메모리 공간에 침투.
▣ DLL 장점
- 실행 파일의 크기를 줄임.
- 기능의 모듈화가 가능.
- 패치, 기능 개선의 효율성
▣ DLL 만들기
- Visual -> Win32 Dynamic Link Library -> simple DLL project -> dll파일 이외의 파일 지우기.
- Project setting -> c/c++ -> category : Precompile... Not using체크
#include <windows.h> BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { switch(ul_reason_for_call) { case DLL_PROCESS_ATTACH: MessageBox(NULL, "DLL ATTACH!!!", "ATTACH", MB_OK); break; case DLL_PROCESS_DETACH: MessageBox(NULL, "DLL DETACH!!!", "DETACH", MB_OK); break; case DLL_THREAD_ATTACH: break; case DLL_THREAD_DETACH: break; } return TRUE; }
- DLLMain 인자값
☞ HANDLE hModule : 모듈 핸들. 메모리상 올라와있는 PE이미지 하나하나(=모듈) 구분하는 핸들.
--> 주소는 겹칠일이 없으니까 DLL 파일의 Image Base값을 핸들값으로 사용함.
☞ DWORD ul_reason_for_call : 로딩형식, 상태값.
--> DLLMain은 4번 실행될 수 있음. 위의 case별로.
☞ LPVOID lpReserved : 호출방식 (로딩방식)
--> 명시적 : 프로그램 실행(IMPORT) / 암시적 : 실행중에 DLL 넣기 (필요에 의해 로딩)
▣ DLL 파일 로드하기
- 가상 메모리 공간에서 LoadLibrary를 하면 하드에서 원하는 DLL 파일을 읽음.
- 해당 DLL 파일이 Mapping 되면 가상메모리 공간에 추가됨.
- LoadLibrary 함수는 Kernel32.DLL에 있음. (고로 Kernel32.DLL이 내가 넣고자하는 원본프로그램에 존재해야함)
☞ Kernel32.DLL : 파일I/O, 메모리, 객체, 프로세스, 쓰레드 관리.
i2sec 대구지점 23기 수료생.
'해킹&보안 > 리버싱' 카테고리의 다른 글
[D+14] 악성코드 분석 (0) | 2017.04.21 |
---|---|
[D+13] DLL Injection (2) (0) | 2017.04.20 |
[D+11] 안티 디버깅 (0) | 2017.04.17 |
[D+10] 패킹&언패킹 (2) (0) | 2017.04.12 |
[D+9] 패킹&언패킹 (1) (0) | 2017.04.11 |