실제 악성코드을 분석하며 적용된 방법으로 PEB의 LDR값을 참조하여 Kernel32.dll의 ImageBase를 획득하는 과정을 정리할게요~!!
※LDR이란?
- PEB구조체 내부의 구성 변수로 MSDN에서는 다음과 같이 설명합니다.
A pointer to a PEB_LDR_DATA structure that contains information about the loaded modules for the process.
즉, 프로세스에 로드된 모듈에 대한 정보를 담고있는 구조체(_LDR_TABLE_ENTRY)를 가리키는 포인터이다.
※악성코드에서 Kernel32.dll의 ImageBase를 가져오는 방법.
- 다음은 악성코드에서 사용되는 코드입니다.
-코드설명 : 라인바이라인으로...
① MOV EAX,DWORD PTR FS:[0x30] : fs레지스터는 TEB를 가리키며 TEB의 0x30번째인 PEB의 값을 가져옵니다.
( PEB구조는 http://jeep-shoes.tistory.com/37?category=758592 참고)
② MOV EAX,DWORD PTR DS:[EAX+0xC] : PEB의 0xC번째 오프셋에 있는 LDR의 주소를 가져옵니다.
③MOV EAX,DWORD PTR DS:[EAX+0x1C]
: LDR의 InittializeationOrderModuleList를 참조합니다. InittializeationOrderModuleList의 의미는 프로세스로드시 초기화된 순서를 의미합니다.
- 각 모듈에 대한 정보가 담긴 _LDR_TABLE_ENTRY는 리스트로 연결되어 있습니다.
④ MOV EAX,DWORD PTR DS:[EAX]
: Windows XP기준으로 초기화 순서는 ntdll.dll -> Kernel32.dll로 되기 때문에 두번째 _LDR_TABLE_ENTRY구조체 참조시 Kernel32.dll의 주소를 알아낼 수 있습니다. ( Windows7경우, ntdll.dll ->KernelBase.dll -> Kernel32.dll 순으로 초기화 됨 )
⑤ MOV EAX,DWORD PTR DS:[EAX+0x8]
: offset +0x8번째 위치하는 해당 모듈의 Base주소를 가져옵니다.
이상으로 악성코드에서 Kernel32.dll의 주소를 가져오는 방식이었습니다. 끝으로이러한 방법을 사용하는 이유는 코드인젝션이 되었을 경우 악성행위를 하기위한 API주소를 모르기때문에 Target 프로세스에 로드된 dll의 export함수를 가져오기 위함으로 보입니다.
'Security > Reversing' 카테고리의 다른 글
※디버그레지스터란? (0) | 2018.03.07 |
---|---|
[Anti-VM] - 어셈블리 STR편 (0) | 2018.01.14 |
Zw API와 Nt API의 차이 (0) | 2017.05.11 |
[AntiVM 탐지 우회] (0) | 2017.03.27 |
※함수호출규약 (0) | 2017.03.15 |
댓글