(1) Look about Native API

Similar documents
SSDT(System Service Descriptor Table) Hooking Written by 백구 Contack Me : 목차 가. 이문서의목적... 2 나. 유저모드와커널모드... 2 다. Windows API 흐름..

Sharing Memory Between Drivers and Applications

Deok9_Exploit Technique

No Slide Title

hlogin2

<B1E2BCFAB9AEBCAD28C0CCB5BFBCF6295F F6F6B696E672E687770>

Microsoft Word - [Windows Hook] 6.HideProcess.doc

3.20 테러 악성코드바이너리분석 손충호 (StolenByte) WOWHACKER Group 해당문서는 WOWHACKER Group 의문서이므로, 무단도용및수 정및변조는할수없습니다. 페이지 1 / 20

PCServerMgmt7

/* */

Microsoft Word - FunctionCall

INTRO Basic architecture of modern computers Basic and most used assembly instructions on x86 Installing an assembly compiler and RE tools Practice co

Microsoft PowerPoint - a8a.ppt [호환 모드]

!K_InDesginCS_NFH

CKKeyPro 적용가이드

API 매뉴얼

IDA 5.x Manual hwp

Microsoft PowerPoint - a10.ppt [호환 모드]

Microsoft Word - Heap_Spray.doc

Microsoft Word - building the win32 shellcode 01.doc

(Microsoft Word - \271\253\267\302\310\2552.doc)

<B1E2BCFAB9AEBCAD28C0CCB5BFBCF6295F F6F6B696E672E687770>

Microsoft PowerPoint - hy2-12.pptx

hlogin7

105È£4fš

FD¾ØÅÍÇÁ¶óÀÌÁî(Àå¹Ù²Þ)-ÀÛ¾÷Áß

6주차.key

본 발명은 중공코어 프리캐스트 슬래브 및 그 시공방법에 관한 것으로, 자세하게는 중공코어로 형성된 프리캐스트 슬래브 에 온돌을 일체로 구성한 슬래브 구조 및 그 시공방법에 관한 것이다. 이를 위한 온돌 일체형 중공코어 프리캐스트 슬래브는, 공장에서 제작되는 중공코어 프

=

Microsoft PowerPoint - polling.pptx

API 매뉴얼

임베디드시스템설계강의자료 6 system call 2/2 (2014 년도 1 학기 ) 김영진 아주대학교전자공학과

FMX M JPG 15MB 320x240 30fps, 160Kbps 11MB View operation,, seek seek Random Access Average Read Sequential Read 12 FMX () 2

Reusing Dynamic Linker For Exploitation Author : Date : 2012 / 05 / 13 Contact : Facebook : fb.me/kwonpwn

<4D F736F F D20B9D9C0CCB7B5B9D9C0CCB7AFBDBA5FBCF6C1A42E646F63>

내용물 시작 3 구성품 4 MDA200 기본 사항 5 액세서리 6 헤드셋 연결 7 탁상 전화기: 연결 및 통화 8 탁상 전화기(표준) 8 탁상 전화기+ HL10 거치대와 전원 공급 장치(별도 구매) 10 탁상 전화기+ EHS 케이블 12 컴퓨터: 연결 및 통화 13 컴

[ 마이크로프로세서 1] 2 주차 3 차시. 포인터와구조체 2 주차 3 차시포인터와구조체 학습목표 1. C 언어에서가장어려운포인터와구조체를설명할수있다. 2. Call By Value 와 Call By Reference 를구분할수있다. 학습내용 1 : 함수 (Functi

DE1-SoC Board

금오공대 컴퓨터공학전공 강의자료

목차 Part Ⅰ 7 월의 악성코드 통계 악성코드 통계... 3 (1) 감염 악성코드 Top (2) 카테고리별 악성코드 유형... 4 (3) 카테고리별 악성코드 비율 전월 비교... 4 (4) 월별 피해 신고 추이... 5 (5) 월별 악성

05Àå

Microsoft PowerPoint - a6.ppt [호환 모드]

DR-M140 사용 설명서

저자는 코드나 정보제공에 있어서의 모든 행동에 대해 책임을 지지 않습니다

1217 WebTrafMon II

ESP1ºÎ-04

Remote UI Guide

MPLAB C18 C

歯FDA6000COP.PDF

Microsoft PowerPoint - windbg쉤무2(맋운톬로ífl—로엸엜Callingê·œìŁ½).pptx

서현수

PRO1_09E [읽기 전용]

Microsoft Word - ASG AT90CAN128 모듈.doc

02.Create a shellcode that executes "/bin/sh" Excuse the ads! We need some help to keep our site up. List Create a shellcode that executes "/bin/sh" C

untitled

목차 1. 소개... 3 가. BOF란?... 3 나. 윈도우 BOF 개발환경및사용툴 Shellcode 작성하기... 4 가. cmd 쉘 ) 소스코드작성 ) 디스어셈블리 ) 어셈블리코드편집 간단

vm-웨어-01장

목차 006/ 008/ 009/ 011/ 012/ 013/ 014/ Part 1_ 컴퓨터가 제대로 작동하지 않을 때 문제00_ 윈도우7 복구(초기화) 방법 안내 문제01_ 컴퓨터의 전원 버튼을 눌러도 아무 반응이 없어요. 문제02_ 전원을 누르면 팬(쿨러)이 돌아가는

커널모드루트킷기술 SDT 후킹의창과방패 목차 목차... 1 저작권... 1 소개... 1 연재가이드... 1 필자소개... 2 Introduction... 2 SDT 후킹... 2 SDT 복구... 6 SDT 재배치... 7 SDT를찾는또다른방법... 7 젂용 SDT.

Sharing Memory Between Drivers and Applications

Microsoft PowerPoint - additional01.ppt [호환 모드]

Copyright 2012, Oracle and/or its affiliates. All rights reserved.,.,,,,,,,,,,,,.,...,. U.S. GOVERNMENT END USERS. Oracle programs, including any oper

Microsoft Word - Dropper.Agent D.doc

Tekla Structures 설치

목 차 1. 개요 취약점분석추진배경 취약점요약 취약점정보 취약점대상시스템목록 분석 공격기법및기본개념 시나리오 공격코드

Figure 5.01

Deok9_PE Structure

C++ Programming

_ƯÁý-½ºÆù

슬라이드 1

SSDT Hooking

ODS-FM1

UDP Flooding Attack 공격과 방어

API STORE 키발급및 API 사용가이드 Document Information 문서명 : API STORE 언어별 Client 사용가이드작성자 : 작성일 : 업무영역 : 버전 : 1 st Draft. 서브시스템 : 문서번호 : 단계 : Docum

슬라이드 1

DSP_MON 프로그램 메뉴얼

Microsoft PowerPoint - a9.ppt [호환 모드]

PRO1_04E [읽기 전용]

<BDC3B8AEBEF320B9F8C8A320C0DBBCBA20B7E7C6BEC0BB20BBCCBEC6B3BBBCAD D466F E687770>

Observational Determinism for Concurrent Program Security

(Microsoft Word - \270\256\271\366\275\314 \271\370\277\252.doc)

thesis

01.ROP(Return Oriented Programming)-x86 Excuse the ads! We need some help to keep our site up. List Return Oriented Programming(ROP) -x86 Gadgets - PO

Interstage5 SOAP서비스 설정 가이드

디지털포렌식학회 논문양식

토익S-채용사례리플렛0404

CyberLink YouCam µµ¿ò¸»

많이 이용하는 라면,햄버그,과자,탄산음료등은 무서운 병을 유발하고 비만의 원인 식품 이다. 8,등겨에 흘려 보낸 영양을 되 찾을 수 있다. 도정과정에서 등겨에 흘려 보낸 영양 많은 쌀눈과 쌀껍질의 영양을 등겨를 물에 우러나게하여 장시간 물에 담가 두어 영양을 되 찾는다

PRO1_14E [읽기 전용]

¨ìÃÊÁ¡2

ez-md+_manual01

Microsoft Word - ExecutionStack

02( ) CSTV11-22.hwp

AsProtect MUP

vm-웨어-앞부속

SSDT Hooking

제 9 도는 6제어항목의 세팅목표의 보기가 표시된 레이더 챠트(radar chart). 제 10 도는 제 6 도의 함수블럭(1C)에서 사용되는 각종 개성화 함수의 보기를 표시하는 테이블. 제 11a 도 제 11c 도까지는 각종 조건에 따라 제공되는 개성화함수의 변화의

11장 포인터

Data Structure

특허청구의 범위 청구항 1 앵커(20)를 이용한 옹벽 시공에 사용되는 옹벽패널에 있어서, 단위패널형태의 판 형태로 구성되며, 내부 중앙부가 후방 하부를 향해 기울어지도록 돌출 형성되어, 전면이 오 목하게 들어가고 후면이 돌출된 결속부(11)를 형성하되, 이 결속부(11

Transcription:

본컬럼에대한모든저작권은 DevGuru에있습니다. 컬럼을타사이트등에기재및링크또는컬럼내용을인용시반드시출처를밝히셔야합니다. 컬럼들을 CD나기타매체로배포하고자할경우 DevGuru에동의를얻으셔야합니다. c DevGuru Corporation. All rights reserved 기타자세한질문사항들은웹게시판이나 support@devguru.co.kr 으로 문의하기바랍니다. - 1 -

Attack Native API written by Kwak Taejin(bluewarz@devguru.co.kr) 1 부 Look around Native API 2 부 Hooking Native API System service API가무엇인가? System service API 의목적이무엇인가 System service API 중 ZwXXX 계열과 NtXXX 계열의함수의차이는무엇인가? User mode Application이 Kernel service를어떤경로에통해서접근하는가? 위의질문에대답할수있다면 System Programmer 로서어느정도의내공의소유자일것 이다. 위의질문에대하여답변을하나하나찾아가보자. 답을찾다보면우린최종목표인 Native API 를 Hooking 하여 System 을감시하는 Driver 의원리를파악할수있을것이다. What & Purpose 자.. 그럼첫번째와두번째질문에는무엇이라대답하겠는가? System service API에대해서잘모르는사람들은 Win32 API 의일부분또는비슷한기능을하는부분이라생각을많이할것이다. 그러나 System 쪽을공부했다면 Win32 API는 NT 계열 OS에서지원 Subsystem의중의하나인것과, 이러한 Subsystem 들이 NT Executive(Kernel) 의도움을받고자할때 System service API를이용하다는것을알것이다. 즉, system service는 user mode application(kernel mode application도일부포함 ) 들이 Kernel service를받고자할때사용되어지는함수들의모임이다. 이 API를 NT Native API 라부른다.( 이하 Native API) NT 계열 OS 에서는다른 Operation System 에서작성된 Application 의호환성을유지하기 위하여다양한 subsystem(win32, POSIX, OS/2, DOS/WoW) 들을제공해준다. 각각의 subsystem 은다른 OS 를에뮬레이션해주며 Kernel 의도움이필요할때는 Native API 를 - 2 -

이용한다. Native API 은모든 subsystem에게동일한 Interface와기능을제공하며, 이로인하여다른 OS의 Application들은 subsystem에의존하여 NT계열 OS에서실행이가능하다. 물론꼭 subsystem을이용하여 Native API를이용하라는규정은없다. 그러나그것은여러가지문제 ( security, handle managing 등 ) 가발생할수있으며, 또한 Microsoft 사에는 Native API를 end-user를위하여디자인한것이아니어서약 10% 정도만이문서화되어공개되어있으며나머지는비공개로되어있기때문에접근하기가쉽지않다. 하지만많은 system programmer들은스킬을이용하여원하는기능의 Native API를찾아서사용하고들있다. <Environment Subsystem and Subsystem DLLs> 간단히 Native API 함수를보자. NtCreateFile의 Prototype은다음과같다. 이는 ZwCreateFile과같은 Parameters를가지고있으며, ZwCreateFile은 NT DDK안에서찾아볼수있다. Native API는두가지종류가있다는것인가? 맞다. Native API는 ZwXxxx 계열과 NtXxxx 계열두가지가있다. 이둘을자세히알아보자. - 3 -

NTSTATUS NtCreateFile( OUT PHANDLE FileHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes, OUT PIO_STATUS_BLOCK IoStatusBlock, IN PLARGE_INTEGER AllocationSize OPTIONAL, IN ULONG FileAttributes, IN ULONG ShareAccess, IN ULONG CreateDisposition, IN ULONG CreateOptions, N PVOID EaBuffer OPTIONAL, IN ULONG EaLength ); 위함수는우리가자주보는 CreateFile 과크게다르게보이지않을것이다. 다만, 전달해야할 parameters 의 type들이생소하게느껴지는것이몇가지있을것이다. 사용방법및인자 type은자세히설명을하지않겠다. DDK 및참고서적을보면자세일알수있을것이다. NtXxxx 함수와 ZwXxxx의차이는이렇게정의가되어있다. NtXxxx 계열함수는보안을위하여함수의 Parameter와 access mode 유효검사를한다. 그리고 ZwXxxx는이러한부가적인검사를하지않는다. 그렇기때문에 Kernel 자신은어떤한제약도없이 resource를접근하기위하여 ZwXxxx함수들을대부분이용하고 NtXxxx함수는 UserMode 에서 service 요청시에사용되어진다. NtXxxx vs ZwXxxxx 좀더자세히 Native API 를한번파해쳐보자. 파해치다보면원리를파악할테고그원리를 가지고우리는 Native API 를공격할수있을것이다. 다음과같은 4 가지의경우를생각할수있을것이다. User Mode Application에서 NtXxxxx 함수호출 User Mode Application에서 ZwXxxxx 함수호출 Kernel Mode Application에서 NtXxxxx 함수호출 User Mode Application에서 NtXxxxx 함수호출 - 4 -

User Mode 에서의호출 User Mode application 은 kernel 의도움을받기위하여 Native API 를호출한다. 호출경로 는아마도 Application 이 subsystem 의 Native API 를호출할것이다. Subsystem 은 NTDLL.LIB 을링크하므로우리는 Ntdll.dll 을이용하여그해당코드를볼수있다. Soft-ice를이용하여 NtReadFile의코드를확인해보자. :u ntdll!ntreadfile ntdll!ntreadfile 001B:77F889DC MOV EAX,000000A1 001B:77F889E1 LEA EDX,[ESP+04] 001B:77F889E5 INT 2E 001B:77F889E7 RET 0024 위와같은코드가나올것이다. Symbol Loader 의 Load exports 이용하여 Ntdll.dll 로드해야만볼수있을것이다. ZwReadFile도확인해보자. :u ntdll!zwreadfile ntdll!ntreadfile 001B:77F889DC MOV EAX,000000A1 001B:77F889E1 LEA EDX,[ESP+04] 001B:77F889E5 INT 2E 001B:77F889E7 RET 0024 ZwReadFile은바로 NtReadFile로포워딩되어있는것을확인해볼수있다. 결국 User mode에서는 NtXxxx 계열만을이용하는것이며, 아마도부가적인검사 (parameters, security 등의검사 ) 을하기위해서일것이다. 위의형식은 EAX(001B:77F889DC) 에는함수의 index(0xa1는 NtReadFile의 index일것이다.) 가들어가며, EDX(001B:77xxxxxx) 에는현재 User mode의 stack의주소가들어간다. 한마디로함수의인자들과스택을전달하는것이다. 그리고 INT 2E가실행되어질것이고제어권은 Kernel로넘어갈것이다. INT 2E는후반부에자세히살펴보기로하자. - 5 -

Kernel Mode 에서호출 Kernel Mode에서는 Ntoskrnl.lib를이용하므로 Native API는 NTOSKRNL에있을것이다. Soft-Ice를이용하여 ZwReadFile의코드를보자. :u ntoskrnl!zwreadfile ntoskrnl!zwreadfile 0008:8042EAE4 MOV EAX,000000A1 0008:8042EAE9 LEA EDX,[ESP+04] 0008:8042EAED INT 2E 0008:8042EAEF RET 0024 앗 ~!! User Mode의 Native API들과같은코드가존재하고있다. 그럼 NtReadFile 도봐야할것같다. :u ntoskrnl!ntreadfile ntoskrnl!ntreadfile 0008:804A86BA PUSH 0008:804A86BB MOV 0008:804A86BD PUSH 0008:804A86BF PUSH 0008:804A86C4 PUSH 0008:804A86C9 MOV 0008:804A86CF PUSH EBP EBP,ESP FF 804017C0 ntoskrnl!_except_handler3 EAX,FS:[00000000] EAX 다행인지불행인지 ntoskrnl 에있는 NtReadFile 은무슨일은하는코드인지는모르지만실 제코드가있는것을볼수있다. 우린아무래도 INT 2E 라는놈의정체를밝혀야지만될것같다. 그럼 INT 2E 가무엇인가? 보호모드에서는 ( 모른다면컬럼중 What s ring을보면알것이다.) Interrupt을위하여 Interrupt Gate(Dos 시절의 Vector와비슷한기능 ) 를이용하며, Gate는 Interrupt에대한정보를가지고있는 Descriptor로이루어져있다. OS는모든인터럽트에대한 Descriptor 를 Table 형식으로가지고있다. 그것을 Interrupt Descriptor Table(IDT) 이라한다. Soft-ICE 에서 IDT를보게되면 INT 2E Handler의시작주소를알수있다. ( 명령 : IDT) - 6 -

002B IntG32 0008:80463420 DPL=3 P ntoskrnl!kireleasespinlock+0ff0 002C IntG32 0008:80463590 DPL=3 P ntoskrnl!kireleasespinlock+1160 002D IntG32 0008:BB6D3CB4 DPL=3 P DbgMsg!.text+09B4 002E IntG32 0008:80462E50 DPL=3 P ntoskrnl!kireleasespinlock+0a20 002F IntG32 0008:804664FC DPL=0 P ntoskrnl!kei386eoihelper+2bd8 0030 IntG32 0008:80462490 DPL=0 P ntoskrnl!kireleasespinlock+0060 생각해보자. User Mode에서 Kernel Mode로제어권을이양하는방법에는무엇이있을까? 아마 Fault, Interrupt, cpu 지원명령인 SYSENTER 3가지정도가 Mode 변환을일을켜주는 (ring transition) 명령일것이다. 이중에 Window2000에서는 Interrupt를선택한것같다. (XP에서는 SYSENTER를이용한다.) INT 2E 에서는 Ntdll!NtReadFile의실제수행할코드를호출해주는일을할것이다. 실제코드를함보자. 코드중에서중요부분만을거론하겠다. 실제 INT 2E 의코드 { PUSH all state 0008:80462E70 MOV ESI,[FFDFF124] ETHREAD curthread = gcurrentthread; // 0xFFDFF124-0008:80462E76 PUSH DWORD PTR [ESI+00000134] int previousmode = curtherad->previousmode; // offset 0x134-1 0008:80462EB3 ADD EDI,[ESI+000000DC] 0008:80462EB9 MOV EBX,EAX 0008:80462EBB AND EAX,00000FFF 0008:80462EC0 CMP EAX,[EDI+08] SYSTEM_SERVICE_TABLE sst = curthread->servicetable; // offset 0xDC - if( eax/* 함수인덱스 */ > sst->servicelimit ). 0008:80462EE8 INC DWORD PTR [FFDFF5DC] 0008:80462EEE MOV ESI,EDX 0008:80462EF0 MOV EBX,[EDI+0C] - 7 -

0008:80462EF3 XOR ECX,ECX 0008:80462EF5 MOV CL,[EBX+EAX] 0008:80462EF8 MOV EDI,[EDI] 0008:80462EFA MOV EBX,[EAX*4+EDI] 0008:80462EFD SUB ESP,ECX 0008:80462EFF SHR ECX,02 0008:80462F02 MOV EDI,ESP 0008:80462F04 CMP ESI,[ntoskrnl!MmUserProbeAddress] 0008:80462F0A JAE 804630F3 0008:80462F10 REPZ MOVSD 0008:80462F12 CALL EBX If( previousmode!= MmUserProbeAddress) - 2 //Vaild check call sst->kiservicetable[eax] - 3 0008:8046302D IRETD return; } 1 현재함수의 caller thread의 ETHREAD structure(teb) 의주소를가져와몇가지의정보를가져온다. TEB 에는현재 Thread에대한모든정보들을가지고있다. ( 자세한사항은 Inside2000 5장의 322 page에 structure 구조가나와있다.) 그중 servicetable을얻어온다이곳에는 system service 함수주소의배열이있다. 2 previousmode Native API를호출한이전의 Mode를말하며 OS 전역변수인 MmUserProbeAddress와비교하여검사한다. 만약 UserMode 라면 system service를처리할때반듯이 parameter 들에대해서유효검사를해야한다. 그이유는 arbitrary thread context 상에서실행되어질수도있기때문일것이다. 또한 security를위한 Access mode 권한을검사조건 ( 이조건은실제 system service에서사용되어질것이다.) 을만들것이다. 4 이곳에서 ServiceTable에서 EAX의함수 Index를이용하여실제처리코드가있는주소를찾아서, 그루틴을호출한다. 한번해당주소의코드를 Soft Ice를이용하여보자. ntoskrnl!ntreadfile 0008:804A86BA PUSH EBP 0008:804A86BB MOV EBP,ESP - 8 -

0008:804A86BD PUSH FF 0008:804A86BF PUSH 804017C0 0008:804A86C4 PUSH ntoskrnl!_except_handler3 0008:804A86C9 MOV EAX,FS:[00000000] 0008:804A86CF PUSH EAX 오 ~! ntoskrnl 안에있는 Native 함수를호출해준다. 결국 User Mode에서 Native API와 Kernel mode의 ZwXxxx 계열모두결국 NtXxxx을호출하게된다. 그러나두가지의경우는행하여지는결과는똑같겠지만 ( 당연히사용자입장에서는같은함수호출이므로 ), 몇가지차이가있다. User mode 에서 Native AP 호출 ZwXxxx 와 NtXxxxx 모두 NtXxxx 를호출한다. Previous mode 가 user 이며, valid check 가이루어진다. Kernel mode에서 NtXxxx 경우 Kernel Mode 에서 NtXxxx 호출. 직접 system service 호출한다 ( 실제 service code). Previous mode를바꾸지않는다. 그러므로 valid check 유무는 caller에의해서결정되어져온다. 그리고 previous mode 로의복구가이루어지지않는다. Kernel mode에서 ZwXxxx 경우 Kernel Mode 에서 ZwXxx 호출. INT 2E를통하여호출하기때문에여러가지처리 (INT 2E에서하는일 ) 코드가실행되며 Parameters 를 EDX를통하여받고, EAX를 index로이용하여 ServiceTable[EAX] 해당 system service를호출한다. Previous mode를 Kernel mode로두고처리한다. Kernel mode이기때문에여러유효성검사를하지않을것이다. 여기에서 attack Native API 의 looking around native API 1 부를마칠것이다. 다음 Attack Native API 2 부에서는 XP 와의차이점과지금까지우리가찾아낸내용들을 이용하여 Native API 를 Hooking 하여 OS 에서접근하는 file 들을모니터링해볼예정이다. 이컬럼을읽고 Native API 의개념과 ZwXxxx 와 NtXxxx 의차이점을이해했으면하는 바람이며조금이라도 system programmer 로서의내공이업되었으면좋겠다. - 9 -

기타질문사항은이메일을이용해주기바란다. 참고서적및사이트 Inside Windows 2000, Microsoft Press Undocumented Windows 2000 Secrets, Addison-wesley Windows NT/2000 NATIVE API REFERENCE, MTP www.osronline.com - 10 -