3. 문제 컨셉
• Directory를 해당 드라이버에 ioctl을 통해 입력하면 정돈된
directory가 ioctl을 통해 출력 됩니다.
• ex)
• in => abcdaaaa..dddd
• out => abcddddd
4. 문제 컨셉
• 해당 드라이버의 기능은 아래와 같이 구현되어 있습니다.
• 먼저 ioctl 입력이 들어오면 792만큼 nonPagedPool을 할당합니다.
• 그리고 할당한 pool에 User buffer를 792만큼 복사합니다.
5. 문제 컨셉
• 그 후, User buffer가 복사된 nonPagedPool에서 디렉토리 정돈
작업을 수행합니다.
• 만약, 데이터 중 ..가 있다면
• while문을 돌면서 앞에 를 찾고, 그 뒤에 ..뒤에 나온 문자열을 붙여
넣습니다.
6. 문제 컨셉
• 위 과정에서 취약점이 발생합니다.
• ioctl input 1 => ‘a’*791 + ‘’
• ioctl input 2 => ‘a’*400 + ‘..’ + ‘abcd....’
• 위와 같이 입력하게 된다면, ioctl input 2번에서 ..를 만나 앞
를 찾는데, input2에는 해당 문자가 없으므로 계속 탐색하다가,
input1을 만나면 그 뒤에 값을 복사하여 pool overflow를 일으
킬 수 있습니다.
7. Exploit
• 위 취약점을 reliable 하게 exploit하기에는 문제점이 있습니다.
• 1. input2 근처에 input1이 있을 것
• 2. input1 뒤에 eip register를 control 할 수 있는 pool이 존재할 것
8. Exploit
• 따라서 아래 그림과 같이 pool fengshui를 진행하는 과정이 필
요합니다.
• 1. overwrite할 target object spray
• 2. create hole
kernel object kernel object kernel object
kernel object
kernel object
kernel object free kernel object
free
kernel object
9. Exploit
• 1. aaa 형식의 ioctl 할당
• 2. aaa..bbb 형식의 ioctl 할당
• 이후 ioctl2에서 directory 정돈 작업을 수행하면 ioctl1 뒤에 있는 kernel object의
내용을 최대 789개만큼 overwrite 가능.
kernel object ioctl1 kernel object
free
kernel object
kernel object ioctl1 kernel object
ioctl2
kernel object
13. Exploit
• Windows 7에서는 NtAllocateVirtualMemory 함수 사용하여
Null Page mapping 가능!
사진출처 : Nikita Tarakanov
14. Exploit
• Pool Fengshui를 통해 내가 할당할 pool 뒤에 Timer Object가
위치하도록 만든다.
• null page를 할당하고, 0x00000060 위치에 user mode의 쉘코
드 주소를 넣어준다.
• pool overflow를 통해 CreateWaitableTimer API의
ObTypeIndexTable의 값을 0으로 바꾸어 내가 할당한 null page
를 참조하도록 만든다.
• 할당해 놓았던 모든 Timer Object를 free하여 close procedure
과정에서 user mode의 쉘코드를 호출하여 LPE 되도록 한다.