개요
- 프로세스 인젝션을 진행하기 위해서는, OpenProcess, WriteProcessMemory, VirtualAllocEx, CreateRemoteThread 함수가 주로 사용된다.
- 실습할 샘플파일은, OpenProcess 함수를 사용하여, 현재 PC에서 동작중인 explore.exe의 PID를 찾아 핸들값을 얻는다.
- C:/Windows/system32에 위치할 것으로 예상되는 rdshost.dll 의 dll 파일명을 WriteProcessMemory 함수를 이용해 삽입한다.
1 파일 구조 확인 => PEview
샘플파일 : 6c070365264b23bd21c90b34e05e8a0
파일의 구조를 확인하기 위해 PEview를 사용해 파일을 열고, 아래와 같은 지표들을 확인한다.
1. 실행파일의 아키텍처 파악 ( 32/64 bit 판단)
IMAGE_FILE_HEADER
v Size of Optional Header : 00E0 --> 32비트, 00F0 --> 64비트
2. 엔트리포인트를 파악하기 위해, 아래 두 주소값을 확
IMAGE_OPTIONAL_HEADER
v Address of Entry Point : 프로그램 코드가 시작되는 상대 주소 ( 값 : 00002390 )
v Image Base : 메모리에 데이터를 올릴 주소 ( 값 : 00400000 )
---> 디버거에 파일을 올렸을때 EntryPoint 주소 => 00402390
2 정적분석 => IDA
*IDA : 기계어를 어셈블리어로 변환해주는 대표적인 디스어셈블러
그래프 뷰에서 텍스트뷰로 전환하여 분석 (스페이스바)
텍스트뷰 상단에서, MD5, File Format 정보 등을 확인할 수 있다.
2-1. Imports 텝에서 현재 임포트된 API목록 확인
v process injection 에 주로 사용되는 함수 4개 확인 : OpenProcess, WriteProcessMemory , VirtualAllocEx, CreateRemoteThread
v 그중, Openprocess 값을 확인해 본다.
OpenProcess : 표적프로세스의 핸들값을 얻고자 할 때 사용
ㄴ 파라미터중, 3번째값 --> 표적프로세스의 ID값 전달 --> 이 위치를 알아내면, 어떤 프로세스에 인젝션 되는지 파악할 수 있다.
v Name 을 더블클릭하여, 함수 Import 위치로 이동한다.
2-2. Import 위치에서, 함수 호출 위치로 이동 ( Ctrl + X )
v 함수명 우클릭 > List Cross references to .. (Ctrl + X )
v Push 명령을 3번 수행후, 해당 함수를 호출한다는 것을 파악한다.
메모리는 FILO 스택구조로 동작하기 때문에, 맨 위 Push가 ProcessId 값을 넣는다는 것을 이해할 수 있다.
*FILO : First In, Last Out - 가장 먼저 들어온 항목이 가장 마지막에 나가는 순서를 의미.
v OpenProcess 주소 확인 : 00401051
v imports 텝으로 이동하여, WriteProcessMemory 에 대해서도 동일하게 임포트 위치를 찾는다. : 004010B1
WriteProcessMemory 3번째 파라미터 값에, ipBuffer ( IP주소를 저장하는 버퍼 ) 용으로 EAX 값을 스택에 저장하고 있음을 파악.
ㄴ * EAX ( Extended Accumulator Register ) : 32비트용 범용레지스터로 산술연산, 함수의 반환값 저장, 시스템호출 번호를 저장할 때 사용함.
ㄴ * 버퍼 (Buffer) : 데이터를 잠시 저장해두는 임시 저장 공간
3. 동적분석 => x32dbg
x32dbg 를 열고, 샘플파일을 로드한다.
3-1 엔트리 포인트로 이동 ( F9 )
F7 | Step Into (현재 명령 실행 + 함수 내부로 들어감) |
F8 | Step Over (현재 명령 실행 + 함수는 통째로 넘어감) |
F9 | Run (브레이크포인트나 예외가 발생할 때까지 계속 실행) -->실행파일을 직접 열면, 보통 EntryPoint에서 멈춤. |
v PEView 에서 확인했던 주소 (00402390) 에서 파일이 시작됨을 알 수 있다.
3-1 OpenProcess 매개변수값 확인
v ida 에서 확인했던, OpenProcess, WriteProcess 각각 호출 주소로 이동.
Ctr + G 주소값 검색
v 해당 위치에 각각 브레이크 포인트를 걸어, 어떤값이 전달되는지 파악.
F2 키, 또는 원형아이콘 클릭 하여 브레이크 포인트 설정
v F9 로 실행 후, OpenProcess 함수부 브레이크포인트에서 전달된 매게변수값 확인
3번째 값에 0000142C 값이 전달됨을 확인 ---> 16진수 값을 10진수로 변환 : 5164
v cmd 창에서 해당 프로세스가 실행중인지 확인
ㄴ tasklist | findstr 5164
해당 Process Id 에 해당하는 파일이 explore.exe 임을 알수 있다.
악성코드는, 실행파일을 인젝션을 하기위해 explore.exe, 즉 항상 프로그램이 켜져있는 파일탐색기 프로그램을 인젝션 대상으로 삼는다는 것을 알 수 있다.
3-2 WriteProcessMemorry 매개변수값 확인
v F9 실행하여, 3번째 파라미터로 전달되는 값 확인
v 파라미터 값에서 우클릭 > 덤프에서 [19F9D8] 따라가기 클릭
* 덤프창에서 파라미터값 0019FA34 의 스텍주소값 19F9D8 으로 이동함.
v 덤프창에서 스텍주소값 19F9D8 에, ASCII 문자열 확인
C:\\WINDOWS\\system32\rdshost.dll ...
>>> dll 의 문자열 데이터를 explorer.exe.에 인젝션 하는 동작 확인.
'정보보안 > 악성코드 분석가' 카테고리의 다른 글
[PE파일 분석 실습] 악성 데이터를 리소스섹션에 임베드한 MW분 (0) | 2025.04.29 |
---|---|
윈11에서 VMWare vcpu-0 에러 (0) | 2025.04.28 |
악성코드(Malware) 주요 행위 분석 및 개념 (0) | 2025.04.06 |
PE 파일 분석 개요 (1) | 2025.03.30 |
악성코드 유형 (0) | 2025.03.16 |