Malware

PEB를 이용한 DLL로드

wsoh9812 2020. 8. 23. 21:05

옛날에 PEB를 공부하면서 간과했던 부분이

이제서야 중요하다는 것을 깨닫고 이렇게 정리 해본다.

 

 

SAMPLE.EXE

악성코드를 분석하던 중 위와 같이 Import 되는 라이브러리는 하나밖에 없는데

바이너리를 실행 시켜보면 kernel32.dll등 데 WinAPI를 자유자재로 사용하는 것을 볼 수 있습니다.

어떻게 이것이 가능하냐?????

[중요] 바로 PEB를 이용해 현재 로드된 모듈들을 가져와서 사용하는 것입니다.

 

[ 중요 ]

간단하게 설명하자면 

PEB구조체의 필드중에 'Ldr'이라는 포인터 변수가 있다.

Ldr_PEB_LDR_DATA라는 구조체를 가지고,

이는 현재 프로세스에서 로드한 모듈들의 정보를 담고 있다.

, Ldr은 현재 프로세스에서 로드된 모듈들의 정보를 가지고 있다.

 

 

PEB로부터 0X18떨어진 곳에 Ldr 존재

[참고] 32비트는 0xc만큼 떨어진곳에 존재하는데 64비트는 0x18떨어진 곳에 존재한다.

[참고] _PEB_LDR_DATA 구조체는 힙메모리영역에 있다.

 

 

_PEB_LDR_DATA 구조체의 내부

_PEB_LDR_DATA -> InMemoryOrderModuleList로 들어간다.

 

InMemoryOrderModuleList 구조체 (양방향 연결리스트)

여기서 부터 살짝 헷갈리기 시작한다,,,,

 

다음을 이해하자

( 출처 : https://limjunyoung.tistory.com/186 )

" _LIST_ENTRY 타입의 InLoadOrderMoudleList, InMemoryOrderModuleList, InInitializationOrderModuleList라는 세 가지 멤버를 가지고 있다. 이 멈버들은 각각 _LDR_DATA_TABLE_ENTRY 구조체의 InLoadOrderLinks, InMemoryOrderLinks, InInitializationOrderLinks 멤버의 포인터이다. 바로 이 _LDR_DATA_TABE_ENTRY 구조체가 프로세스 정보와 프로세스에 로딩되는 DLL의 정보를 가지고 있고, 이 구조체를 이용하여 로딩되는 DLL의 Base Address를 직접 구할 수 있다.

, 프로세스에 로딩되는 DLL마다 _LDR_DATA_TABLE_ENTRY 구조체가 하나씩 생성되는데,

연결 방법이 세 가지인 것이다.

첫 번째 _LDR_DATA_TABLE_ENTRY는 해당 process의 정보를,

두 번째는 ntdll.dll의 정보, 세 번째는 kernel32.dll의 정보를 가지고 있다.

프로세스에 로딩되는 순서에 따라 연결 리스크가 형성되는 것 같다. "

 

1. 프로세스에 로딩된 dll 모듈마다 _LDR_DATA_TABLE_ENTRY 구조체가 하나씩 생성 되고

이 구조체들은 _LIST_ENTRY 더블 링크

드 리스트로 연결된다.

 

2. LDR_DATA_TABLE_ENTRY에서는 LIST_ENTRY를 구조체 멤버로 사용한다.

 

 

전체적인 구조

 

드디어,,,, 퍼온 글을 어느정도 이해하였다.

[중요] "프로세스에 로딩된 dll 모듈마다 _LDR_DATA_TABLE_ENTRY 구조체가 하나씩 생성"

이 말이 중요한것 같다.

내가 확인하고 싶은것은 dll이고 dll의 위치를 확인 해주려면 

PEB_LDR_DATA 구조체가 아닌 LDR_DATA_TABLE_ENTRY를 이용해서 출력을 해주어야한다.

 

먼저,

PEB_LDR_DATA

[ 중요 ]

여기서 0x10만큼 떨어진 곳을 LDR_DATA_TABLE_ENTRY형태로 출력 해주면 첫번째 dll이 나온다.

(위의 그림에서 보면 InOrderModuleList.Fink는 다음 dll을 가리킨다.)

 

Ldr -> process -> ntdll.dll ->kernel32.dll

 

어떤사람들은 InMemoryOrderModuleList주소찍어주고 -0x10 이런식으로 해주는데 

나는 그냥 구조체 시작 주소인 InLoadOrderModuleList로 계속해서 찍어보았다.

 

 

ldr 구조체 ( PEB_LDR_DATA )
process (LDR_DATA_TABLE_ENTRY)
ntdll.dll (LDR_DATA_TABLE_ENTRY )
Kernel32.dll

 

악성코드는 이런식으로 참조해서 특정 dll의 함수를 가지고 온다.

코드는...

https://5kyc1ad.tistory.com/328

 

TIB, PEB를 이용해 로드된 DLL 정보 가져오기

 최근 악성코드를 분석해 보던 중, IAT에 Import하는 함수가 하나도 없는데 WinAPI를 자유자재로 사용하는 것을 보고 방법이 궁금해져서 공부한 내용을 작성하기로 했습니다. 여기서는 TIB, PEB를 이��

5kyc1ad.tistory.com

https://blog.naver.com/PostView.nhn?blogId=techshare&logNo=221760641225&parentCategoryNo=&categoryNo=1&viewDate=&isShowPopularPosts=false&from=postView

 

C# - PEB(Process Environment Block)를 통해 로드된 모듈 목록 열람

닷넷에서도 ProcessModule을 이용해 로드된 모듈의 목록을 구할 수 있습니다. foreach (ProcessModule ...

blog.naver.com

참고하면 될 것같다.