본문 바로가기
System

Universal Shellcode (1) (dll 시작주소 알기)

by k0o9 2020. 7. 18.

이 글은 윈도우 시스템 해킹가이드 버그헌팅과 익스플로잇을 보고 정리한 글입니다.


자 이번에는 Universal Shellcode를 다뤄보도록 하겠습니다. 자 그럼 먼저 왜 앞전에 배운 형식의 쉘코드를 사용하지 않고 범용 쉘코드(Universal Shellcode)를 사용할까요? 앞전에 사용한 쉘코드를 잘 살펴보면 2가지가 필요로 했어요. WinExec함수의 주소와 ExitProcess함수의 주소가 필요했었죠. 앞전 쉘코드는 저 두개의 주소값을 모두 알고 있는채로 하드코딩하여 작성하였습니다. 하지만 윈도우 7버전 이후부터는 재부팅 할때마다 윈도우의 kernel base address가 달라집니다. 이러한 보안 기법을 ASLR이라고 해요. ASLR이란 메모리상의 공격을 어렵게 하기 위해 컴퓨터가 시작될때마다 주소값을 바꾸는 기법이에요. 그래서 쉘코드를 컴퓨터를 껏다킬때마다 하드코딩하지 않고 쭉 사용할 수 있는 범용 쉘코드를 필요로 하게되는거죠. 

 

프로세스에서 함수의 주소 값을 구할려면 DLL의 시작주소와 함수까지의 offset을 알아야 합니다. 우리는 소스코드로 이러한 값들을 동적으로 구하는게 목표입니다. 

 

범용 쉘코드를 알려면 우선적으로 PEB,TEB,FS,PE Header,Exprot Table ,Name Table 과 같은 것들을 사전에 알아야 합니다. 

 

1.TEB(Thread Environment Block)

:현재 실행되고 있는 쓰레드에 대한 정보를 담고 있는 구조체.

자 TEB에서 중요한거는 딱 두개에요.

1)teb는 특수한 레지스터인 FS레지스터에 주소값이 저장되어 있으면 TEB에 접근하고자 할때 FS레지스터를 사용할 수 있다는 점

2)teb구조체 내부에서 PEB주소가 있다는 점

TEB 구조체

2.PEB(Process Environment Block)

:현재 실행되고 있는 프로세스에 대한 정보를 담고 있는 구조체.

peb에 관한 요점을 정리해볼게요. teb랑 같이 2개만 알고 넘어가시면 되요

1)TEB구조체 주소 +0x30주소값에 위치한다는 점

2)프로세스에 로드된 PE Image에 대한 정보를 기록하고 있다는 점 

우리는 위의 2)을 통해 LDR_DATA_TABLE로 가는게 목적이에요

PEB 구조체

자 이제 구조를 보시면 +0x00c에 Ldr이 보이시죠? 우리는 이정보를 통해 LDR_DATA_TABLE로 갈거에요. 

이 LDR에는 _PEB_LDR_DATA를 가르키고 있는 포인터가 저장되어있습니다.

 

3.PEB_LDR_DATA

PEB_LDR_DATA구조체

자 이구조체에서 +0x014 InMemoryOrderModuleList를 보시면요. 프로세스의 PE Image가 저장되어 있는 Ldr_data_entry 구조체의 주소가 더블링크드 리스트 형식으로 저장되어 있습니다. 우리는 이값을 이용해 LDR_DATA_ENTRY로 가야합니다.

 

4.LDR_DATA_ENTRY

:로드된 모듈에 대한 정보들을 저장하고 있다.

우리는 이곳에서 Kernel32.dll 정보를 볼 수 있습니다. 아까전에 우리가 함수 주소를 알려면 우선 어떤것을 알아야 한다고 했죠? dll의 시작주소와 offset이엇죠? 우리가 필요로 하는거는 WinExec와 ExitProcess의 함수 주소이니 이들을 사용하는 dll즉 kernel32.dll에 접근 했습니다. 그러면 여기서 dll의 시작주소를 알아야겟죠?

LDR_DATA_ENTRY구조체

자 여기 구조체를 보면 +0x18에 DLL BASE 가 잇네요. 자 이렇게 우리는 우리가 원하던 2 개중 하나의 DLL의 시작주소를 알았습니다. 자 그러면 이제 남은 하나인 Offset만 알면되겟죠? 

 

'System' 카테고리의 다른 글

Universal Shellcode(4)-실습  (0) 2020.07.20
Universal Shellcode(3) -실습  (0) 2020.07.18
Universal Shellcode(2) - offset 구하기  (0) 2020.07.18
쉘코드-널바이트 제거  (0) 2020.07.18
쉘코드 작성(cmd호출, Poc형식)  (0) 2020.07.17