발자취
악성코드 Pre-Lab4. Code Injection 본문
Code Injection이란?
Dll Injection의 연장선으로, Dll보다 작은 코드들을 인젝션하는 것이다.
Dll Injection과 비교했을 때, Code Injection의 장점은? (코드 인젝션의 사용 이유)
1. Dll Injection에 비해 메모리를 적게 차지한다.
2. Dll Injection에 비해 탐지 가능성이 낮다. (Dll 인젝션은 인젝션 후 이젝션 전까지는 메모리 공간을 비교적 많이 차지하므로 탐지 가능성이 큰데, 코드 인젝션은 메모리 상에서 흔적을 남기는 게 비교적 작기 때문이다)
3. Code Injector만 있으면 다 된다.
1. 실습
사용 코드는 다음과 같다.
https://github.com/reversecore/book
(소스코드\03_DLL_Injection\27_Code_Injection\src\CodeInjection\CodeInjection.cpp)
1. 준비 - 소스코드 수정
실습에 있어 불필요한 코드를 주석 처리하고, 필요한 코드를 새롭게 추가할 것이다.
1. 코드 추가
dwSize = (DWORD)InjectCode - (DWORD)ThreadProc;
106번 라인의 코드이다. 이 바로 다음 라인에
dwSize = (DWORD)abs((int)dwSize);
를 추가한다.
2. 코드 주석처리
208, 209번 라인을 주석처리한다. (이 라인은 위 코드를 추가하기 전 기준으로, 추가한 후에는 209, 210 라인의 코드를 주석처리 해야한다.)
=> 모든 수정이 끝났으면 Release 모드로 변경 후 빌드한다.
2. 실습 시작

CodeInjection.exe 파일이 만들어졌다.

notepad를 실행한 후, procexp를 통해 PID를 확인한다.

powershell에 ./CodeInjection [notepad의 PID]를 입력하면 된다.

이렇게 하면 원래 대화상자가 생성되어야 하는데, 내가 실습을 진행중인 Windows 10 가상머신 이미지는 64비트, 코드는 32비트 전용이라 에러가 뜬다.
추후에 32비트 가상머신 이미지를 사용하여 다시 재시도해볼 예정이다.

2. 코드 분석
실습이 완벽하게 성공했다면 좋았겠지만.. 안된건 우선 넘기고 더 중요한 코드 분석을 진행해보겠다.


우선 main 함수부터 살펴보겠다.
[202] 받은 인자가 2개인지 확인하고, 2개가 아니라면 에러메시지를 출력한다.
[213] PID를 입력하면 PID가 문자로 인식되기 때문에 숫자를 바꿔주는 작업을 한다.
[214] 이렇게 숫자로 변환한 PID를 가지고 InjectCode 함수를 실행한다.

다음은 InjectCode 함수의 일부이다.
[64] kernel32.dll을 가져오고, hMod가 이 dll을 가리킨다. 이 dll에 정의된 API를 사용하겠다는 소리이다.
[66] 인젝션할 정보를 THREAD_PARAM이라는 구조체의 값으로 넣는다. 파라미터와 스레드 프로시저를 따로 인식한다.
THREAD_PARAM은 참고로 [8]번 라인에서 정의하고 있고, FARPROC 두가지 함수의 주소를 쓰기 위해서 정의했다.
[69] 파라미터 안의 각각의 정보들을 복사해서 넣어주고 있다. 필요한 파라미터 정보들을 세팅해주는 과정이다.
[75] dwPID에 해당되는 프로세스(=notepad)를 오픈한다. 인젝션을 해야하기 때문이다.
[84] VirtualAllocEx로 THREAD_PARAM의 가상 공간을 할당한다.
hProcess = notepad.exe
MEM_COMMIT: 단순히 공간을 예약만 하는 게 아니라 할당까지 받음.
READWRITE: 읽고 쓸 수 있는 권한 부여

[95] hProcess, pRemoteBuf은 파라미터들이 쓰여질 버퍼이다. dwSize만큼 파라미터를 적어준다. 파라미터 공간을 할당받아 파라미터를 적어준 것이다.
[106] ThreadProc을 빼주는 이유: 코드 상에서 ThreadProc은 InjectCode보다 먼저 선언되었기 때문에 InjectCode라는 함수의 시작 주소에서 ThreadProc 함수의 시작 주소를 빼줘서 ThreadProc이라는 함수의 내용이 들어가 있는 공간을 계산하는 것이다. 즉, ThreadProc의 함수 내용 공간의 넓이를 구한 것이다.
[108] 앞과 같은 방식으로 공간을 할당
[118] 방금 할당받은 공간에 ThreadProc의 내용을 적음
=> 노트패드라는 실행프로그램 안에 파라미터와 프로시저가 들어간 상태.

[128] 마지막으로 노트패드 프로세스 안에서 ThreadProc가 실행되도록 만든다. 이 ThreadProc가 이제 코드 인젝션을 하는 것이다.

[40] ThreadProc가 LoadLibrary 함수를 호출한다.
dll 인젝션과 다르게 파라미터와 프로시저를 넣어줘서 파라미터를 따라가면서 인젝션 한다.
[45] GetProcAddress라는 함수를 호출해서 user32.dll 안에 있는 MessageBoxA라는 함수를 가져온다.
메시지 박스를 가져와 대화상자를 띄워주는 함수이다.
[50] 메시지 박스를 실제로 실행해준다.
3. 생각해보기
1. DLL 인젝션에 비해 코드 인젝션이 갖는 장점은 무엇인가?
위에서 말했듯, 내용을 적기 때문에 메모리를 적게 차지하여 탐지 가능성이 낮다. 코드 인젝터만 있으면 된다.
2. 공격자가 코드 인젝션 기법을 악성코드 삽입에 사용한다면, 이에 대한 방어로서 어떠한 기법들이 있을지 서술하시오.
코드 인젝션을 하면 동작에 필요한 파라미터, 프로시저가 메모리에 들어간다는 특징이 있다.따라서 실제 동작하는 메모리 자체를 보고 어떠한 악성행위를 하는 프로시저가 있는지 분석하는 방식으로 방어할 수 있다.
또한, 디버거를 이용하여 동적 분석을 하면서 실제로 어떤 악성행위를 하는지 보고 탐지하는 방식도 있다.
후자의 방식이 좀 더 나은 방식이다!

Code Injection 실습 끝!
'3-2 > 악성코드' 카테고리의 다른 글
| 악성코드 Pre-Lab6. 스텔스 프로세스 (0) | 2024.01.17 |
|---|---|
| 악성코드 Pre-Lab5. 계산기 후킹 (0) | 2024.01.09 |
| 악성코드 Pre-Lab3. PE 패치를 이용한 DLL 로딩 (0) | 2023.12.16 |
| 악성코드 Pre-Lab2. DLL Injection, DLL Ejection (0) | 2023.10.13 |
| 악성코드 Pre-Lab1. 윈도우즈 메시지 후킹 (0) | 2023.09.29 |