SlideShare a Scribd company logo
1 of 16
fengfengfeng
양경석@koreanGang
문제 환경
문제 컨셉
• Directory를 해당 드라이버에 ioctl을 통해 입력하면 정돈된
directory가 ioctl을 통해 출력 됩니다.
• ex)
• in => abcdaaaa..dddd
• out => abcddddd
문제 컨셉
• 해당 드라이버의 기능은 아래와 같이 구현되어 있습니다.
• 먼저 ioctl 입력이 들어오면 792만큼 nonPagedPool을 할당합니다.
• 그리고 할당한 pool에 User buffer를 792만큼 복사합니다.
문제 컨셉
• 그 후, User buffer가 복사된 nonPagedPool에서 디렉토리 정돈
작업을 수행합니다.
• 만약, 데이터 중 ..가 있다면
• while문을 돌면서 앞에 를 찾고, 그 뒤에 ..뒤에 나온 문자열을 붙여
넣습니다.
문제 컨셉
• 위 과정에서 취약점이 발생합니다.
• ioctl input 1 => ‘a’*791 + ‘’
• ioctl input 2 => ‘a’*400 + ‘..’ + ‘abcd....’
• 위와 같이 입력하게 된다면, ioctl input 2번에서 ..를 만나 앞
를 찾는데, input2에는 해당 문자가 없으므로 계속 탐색하다가,
input1을 만나면 그 뒤에 값을 복사하여 pool overflow를 일으
킬 수 있습니다.
Exploit
• 위 취약점을 reliable 하게 exploit하기에는 문제점이 있습니다.
• 1. input2 근처에 input1이 있을 것
• 2. input1 뒤에 eip register를 control 할 수 있는 pool이 존재할 것
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
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
Exploit
• spary
• create hole
Exploit
• Timer Object Header
• Object Type Index Table
Exploit
• Timer Object Header
Exploit
• Windows 7에서는 NtAllocateVirtualMemory 함수 사용하여
Null Page mapping 가능!
사진출처 : Nikita Tarakanov
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 되도록 한다.
Reference
• CVE-2008-4250
• Hacksys Vuln Driver
감사합니당

More Related Content

What's hot

Docker introduction
Docker introductionDocker introduction
Docker introductionDaegwon Kim
 
Windows via C/C++ 06 스레드의 기본
Windows via C/C++ 06 스레드의 기본Windows via C/C++ 06 스레드의 기본
Windows via C/C++ 06 스레드의 기본ssuser0c2478
 
[1B4]안드로이드 동시성_프로그래밍
[1B4]안드로이드 동시성_프로그래밍[1B4]안드로이드 동시성_프로그래밍
[1B4]안드로이드 동시성_프로그래밍NAVER D2
 
Infiniflux vs influxdb 비교 테스트 결과 2016 12월-v2
Infiniflux vs influxdb 비교 테스트 결과 2016 12월-v2Infiniflux vs influxdb 비교 테스트 결과 2016 12월-v2
Infiniflux vs influxdb 비교 테스트 결과 2016 12월-v2Andrew Sungjin Kim
 
Apache ZooKeeper 소개
Apache ZooKeeper 소개Apache ZooKeeper 소개
Apache ZooKeeper 소개중선 곽
 
.NET에서 비동기 프로그래밍 배우기
.NET에서 비동기 프로그래밍 배우기.NET에서 비동기 프로그래밍 배우기
.NET에서 비동기 프로그래밍 배우기Seong Won Mun
 
AWS EC2 AMI seminar(KELP 2011)
AWS EC2 AMI seminar(KELP 2011)AWS EC2 AMI seminar(KELP 2011)
AWS EC2 AMI seminar(KELP 2011)Jay Park
 
공성대전 C# 사용기
공성대전 C# 사용기공성대전 C# 사용기
공성대전 C# 사용기Myoung-gyu Gang
 
Profiling - 실시간 대화식 프로파일러
Profiling - 실시간 대화식 프로파일러Profiling - 실시간 대화식 프로파일러
Profiling - 실시간 대화식 프로파일러Heungsub Lee
 
Startup JavaScript 8 - NPM, Express.JS
Startup JavaScript 8 - NPM, Express.JSStartup JavaScript 8 - NPM, Express.JS
Startup JavaScript 8 - NPM, Express.JSCirculus
 
Windws via c/c++ chapter 6
Windws via c/c++ chapter 6Windws via c/c++ chapter 6
Windws via c/c++ chapter 6SukYun Yoon
 
150625 마이크로커널 운영체제 김지은
150625 마이크로커널 운영체제 김지은150625 마이크로커널 운영체제 김지은
150625 마이크로커널 운영체제 김지은jieun kim
 
Nodejs, PhantomJS, casperJs, YSlow, expressjs
Nodejs, PhantomJS, casperJs, YSlow, expressjsNodejs, PhantomJS, casperJs, YSlow, expressjs
Nodejs, PhantomJS, casperJs, YSlow, expressjs기동 이
 
제 5회 Lisp 세미나 - 클로저 개발팀을 위한 지속적인 통합
제 5회 Lisp 세미나 - 클로저 개발팀을 위한 지속적인 통합제 5회 Lisp 세미나 - 클로저 개발팀을 위한 지속적인 통합
제 5회 Lisp 세미나 - 클로저 개발팀을 위한 지속적인 통합NAVER D2
 
Airflow를 이용한 데이터 Workflow 관리
Airflow를 이용한  데이터 Workflow 관리Airflow를 이용한  데이터 Workflow 관리
Airflow를 이용한 데이터 Workflow 관리YoungHeon (Roy) Kim
 
Windows via c/c++ ch03. 커널오브젝트
Windows via c/c++ ch03. 커널오브젝트Windows via c/c++ ch03. 커널오브젝트
Windows via c/c++ ch03. 커널오브젝트ssuser0c2478
 
[하코사세미나]미리보는 대규모 자바스크립트 어플리케이션 개발
[하코사세미나]미리보는 대규모 자바스크립트 어플리케이션 개발[하코사세미나]미리보는 대규모 자바스크립트 어플리케이션 개발
[하코사세미나]미리보는 대규모 자바스크립트 어플리케이션 개발정석 양
 
(OCI 탐험일지) 블록 볼륨 생성
(OCI 탐험일지) 블록 볼륨 생성(OCI 탐험일지) 블록 볼륨 생성
(OCI 탐험일지) 블록 볼륨 생성Jay Park
 
Dockerfile과 도커 이미지 레이어 관계
Dockerfile과 도커 이미지 레이어 관계Dockerfile과 도커 이미지 레이어 관계
Dockerfile과 도커 이미지 레이어 관계choi sungwook
 

What's hot (20)

Docker introduction
Docker introductionDocker introduction
Docker introduction
 
Windows via C/C++ 06 스레드의 기본
Windows via C/C++ 06 스레드의 기본Windows via C/C++ 06 스레드의 기본
Windows via C/C++ 06 스레드의 기본
 
[1B4]안드로이드 동시성_프로그래밍
[1B4]안드로이드 동시성_프로그래밍[1B4]안드로이드 동시성_프로그래밍
[1B4]안드로이드 동시성_프로그래밍
 
Infiniflux vs influxdb 비교 테스트 결과 2016 12월-v2
Infiniflux vs influxdb 비교 테스트 결과 2016 12월-v2Infiniflux vs influxdb 비교 테스트 결과 2016 12월-v2
Infiniflux vs influxdb 비교 테스트 결과 2016 12월-v2
 
Apache ZooKeeper 소개
Apache ZooKeeper 소개Apache ZooKeeper 소개
Apache ZooKeeper 소개
 
.NET에서 비동기 프로그래밍 배우기
.NET에서 비동기 프로그래밍 배우기.NET에서 비동기 프로그래밍 배우기
.NET에서 비동기 프로그래밍 배우기
 
AWS EC2 AMI seminar(KELP 2011)
AWS EC2 AMI seminar(KELP 2011)AWS EC2 AMI seminar(KELP 2011)
AWS EC2 AMI seminar(KELP 2011)
 
공성대전 C# 사용기
공성대전 C# 사용기공성대전 C# 사용기
공성대전 C# 사용기
 
Profiling - 실시간 대화식 프로파일러
Profiling - 실시간 대화식 프로파일러Profiling - 실시간 대화식 프로파일러
Profiling - 실시간 대화식 프로파일러
 
Startup JavaScript 8 - NPM, Express.JS
Startup JavaScript 8 - NPM, Express.JSStartup JavaScript 8 - NPM, Express.JS
Startup JavaScript 8 - NPM, Express.JS
 
Windws via c/c++ chapter 6
Windws via c/c++ chapter 6Windws via c/c++ chapter 6
Windws via c/c++ chapter 6
 
150625 마이크로커널 운영체제 김지은
150625 마이크로커널 운영체제 김지은150625 마이크로커널 운영체제 김지은
150625 마이크로커널 운영체제 김지은
 
Nodejs, PhantomJS, casperJs, YSlow, expressjs
Nodejs, PhantomJS, casperJs, YSlow, expressjsNodejs, PhantomJS, casperJs, YSlow, expressjs
Nodejs, PhantomJS, casperJs, YSlow, expressjs
 
제 5회 Lisp 세미나 - 클로저 개발팀을 위한 지속적인 통합
제 5회 Lisp 세미나 - 클로저 개발팀을 위한 지속적인 통합제 5회 Lisp 세미나 - 클로저 개발팀을 위한 지속적인 통합
제 5회 Lisp 세미나 - 클로저 개발팀을 위한 지속적인 통합
 
Zookeeper 소개
Zookeeper 소개Zookeeper 소개
Zookeeper 소개
 
Airflow를 이용한 데이터 Workflow 관리
Airflow를 이용한  데이터 Workflow 관리Airflow를 이용한  데이터 Workflow 관리
Airflow를 이용한 데이터 Workflow 관리
 
Windows via c/c++ ch03. 커널오브젝트
Windows via c/c++ ch03. 커널오브젝트Windows via c/c++ ch03. 커널오브젝트
Windows via c/c++ ch03. 커널오브젝트
 
[하코사세미나]미리보는 대규모 자바스크립트 어플리케이션 개발
[하코사세미나]미리보는 대규모 자바스크립트 어플리케이션 개발[하코사세미나]미리보는 대규모 자바스크립트 어플리케이션 개발
[하코사세미나]미리보는 대규모 자바스크립트 어플리케이션 개발
 
(OCI 탐험일지) 블록 볼륨 생성
(OCI 탐험일지) 블록 볼륨 생성(OCI 탐험일지) 블록 볼륨 생성
(OCI 탐험일지) 블록 볼륨 생성
 
Dockerfile과 도커 이미지 레이어 관계
Dockerfile과 도커 이미지 레이어 관계Dockerfile과 도커 이미지 레이어 관계
Dockerfile과 도커 이미지 레이어 관계
 

Similar to fengfengfeng

도커 이미지 레이어 구조
도커 이미지 레이어 구조도커 이미지 레이어 구조
도커 이미지 레이어 구조choi sungwook
 
[야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담
[야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담[야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담
[야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담Sumin Byeon
 
[Unite2015 박민근] 유니티 최적화 테크닉 총정리
[Unite2015 박민근] 유니티 최적화 테크닉 총정리[Unite2015 박민근] 유니티 최적화 테크닉 총정리
[Unite2015 박민근] 유니티 최적화 테크닉 총정리MinGeun Park
 
Java script의 이해
Java script의 이해Java script의 이해
Java script의 이해seungkyu park
 
[NDC 2018] 신입 개발자가 알아야 할 윈도우 메모리릭 디버깅
[NDC 2018] 신입 개발자가 알아야 할 윈도우 메모리릭 디버깅[NDC 2018] 신입 개발자가 알아야 할 윈도우 메모리릭 디버깅
[NDC 2018] 신입 개발자가 알아야 할 윈도우 메모리릭 디버깅DongMin Choi
 
I phone 2 release
I phone 2 releaseI phone 2 release
I phone 2 releaseJaehyeuk Oh
 
Effective c++ 정리 chapter 6
Effective c++ 정리 chapter 6Effective c++ 정리 chapter 6
Effective c++ 정리 chapter 6연우 김
 
[225]yarn 기반의 deep learning application cluster 구축 김제민
[225]yarn 기반의 deep learning application cluster 구축 김제민[225]yarn 기반의 deep learning application cluster 구축 김제민
[225]yarn 기반의 deep learning application cluster 구축 김제민NAVER D2
 
요람(CreateProcess)에서 무덤(ResumeThread)까지
요람(CreateProcess)에서 무덤(ResumeThread)까지요람(CreateProcess)에서 무덤(ResumeThread)까지
요람(CreateProcess)에서 무덤(ResumeThread)까지Hyoje Jo
 
Concurrency in action - chapter 7
Concurrency in action - chapter 7Concurrency in action - chapter 7
Concurrency in action - chapter 7JinWoo Lee
 
안드로이드Jni 사용설치
안드로이드Jni 사용설치안드로이드Jni 사용설치
안드로이드Jni 사용설치Byungsun Lee
 

Similar to fengfengfeng (14)

도커 이미지 레이어 구조
도커 이미지 레이어 구조도커 이미지 레이어 구조
도커 이미지 레이어 구조
 
[야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담
[야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담[야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담
[야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담
 
[Unite2015 박민근] 유니티 최적화 테크닉 총정리
[Unite2015 박민근] 유니티 최적화 테크닉 총정리[Unite2015 박민근] 유니티 최적화 테크닉 총정리
[Unite2015 박민근] 유니티 최적화 테크닉 총정리
 
Java script의 이해
Java script의 이해Java script의 이해
Java script의 이해
 
Node.js 기본
Node.js 기본Node.js 기본
Node.js 기본
 
I os 2
I os 2I os 2
I os 2
 
[NDC 2018] 신입 개발자가 알아야 할 윈도우 메모리릭 디버깅
[NDC 2018] 신입 개발자가 알아야 할 윈도우 메모리릭 디버깅[NDC 2018] 신입 개발자가 알아야 할 윈도우 메모리릭 디버깅
[NDC 2018] 신입 개발자가 알아야 할 윈도우 메모리릭 디버깅
 
I phone 2 release
I phone 2 releaseI phone 2 release
I phone 2 release
 
LLVM ARC
LLVM ARCLLVM ARC
LLVM ARC
 
Effective c++ 정리 chapter 6
Effective c++ 정리 chapter 6Effective c++ 정리 chapter 6
Effective c++ 정리 chapter 6
 
[225]yarn 기반의 deep learning application cluster 구축 김제민
[225]yarn 기반의 deep learning application cluster 구축 김제민[225]yarn 기반의 deep learning application cluster 구축 김제민
[225]yarn 기반의 deep learning application cluster 구축 김제민
 
요람(CreateProcess)에서 무덤(ResumeThread)까지
요람(CreateProcess)에서 무덤(ResumeThread)까지요람(CreateProcess)에서 무덤(ResumeThread)까지
요람(CreateProcess)에서 무덤(ResumeThread)까지
 
Concurrency in action - chapter 7
Concurrency in action - chapter 7Concurrency in action - chapter 7
Concurrency in action - chapter 7
 
안드로이드Jni 사용설치
안드로이드Jni 사용설치안드로이드Jni 사용설치
안드로이드Jni 사용설치
 

fengfengfeng

  • 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
  • 11. Exploit • Timer Object Header • Object Type Index Table
  • 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 되도록 한다.