Bug Hunting

activex 메소드 확인하는 법


당연히 progid 또는 clsid 는 알고 있어야 한다. 일반적으로 웹 소스 상에서 바로 보는 것은 clsid



1) com/ole viewer 로 확인



2) com raider 로 확인(사실 이제 가장 깔끔한듯. 매뉴얼 퍼징 용도로는..)



3) 프로그래밍


- c 언어로 하면 쉽게 할  수 있으나, python 을 좋아하므로...powershell 을 이용해서 python 으로 하는법(?)



# powershell #


PS C:\Users\hyunmini> $clsid = New-Object Guid 'DC2D84BD-498D-48B1-808C-60236E7FE0C8'

PS C:\Users\hyunmini> $type = [Type]::GetTypeFromCLSID($clsid)

PS C:\Users\hyunmini> $object = [Activator]::CreateInstance($type)

PS C:\Users\hyunmini> $object | get-member



   TypeName: System.__ComObject#{684c87de-557e-4a17-aea5-036ff1eeca95}


Name                MemberType            Definition

----                ----------            ----------

AddFile             Method                void AddFile (string, string)

AddTempFile         Method                void AddTempFile (string, uint, st...

AppendDragDrop      Method                void AppendDragDrop (Variant, string)

AppendFilter        Method                void AppendFilter (Variant, Variant)

AppendPostData      Method                void AppendPostData (Variant, Vari...

ClearDragDrop       Method                void ClearDragDrop ()

ClearFilter         Method                void ClearFilter ()

ClearPostData       Method                void ClearPostData () 

                                ...



# python (-_-;;)


p = subprocess.Popen(

[

"powershell.exe", 

"-command",

"&{ $clsid = New-Object Guid '%s';$type = [Type]::GetTypeFromCLSID($clsid);$object= [Activator]::CreateInstance($type);get-member -inputObject $object; }" % clsid

], stdout=subprocess.PIPE)

p_result, err = p.communicate()


까페에는 소식을 자주 올렸었는데...블로그에도 공개할 때가 된 듯 하다.


시스템 해킹이 진입 장벽이 높다고 느껴서(실제론 그렇게 높지 않지만)  공부해볼 시도조차 못했던 경우가 많았을 것이다.


혹은, 기초적인 시스템 해킹 공부는 했으나 중급 이상으로 넘어가기 위해 어떤 공부를 해야 할지 가이드가 부족한


경우도 있었을 것이다. 이러한 연유로, 시스템 해킹 초-중급자를 위한 집필을 마음먹고 시작한지 어언 1년..


드디어 윈도우 시스템 해킹 서적이 드디어 인쇄작업에 들어갔다!!







=================================================================================================

I. 개요
1. PC내부구조
1.1 컴퓨어의 언어
1.2 CPU와 레지스터
1.3 메모리구조
1.4 스택과 힙
1.5 함수 호출과 리턴
2. 어셈블리어 기본
2.1 어셈블리어 기초
2.2 어셈블리어 실습
3. 디스어셈블러와 디버거
3.1 디스어셈블러
3.2 디버거
4. 윈도우 실행파일 구조
4.1 PE파일 
4.2 DOS Header 
4.3 PE Header
4.4 Image Optional Header
4.5 Section Header
 
II. 취약점과 공격
1. 소프트웨어 취약점
1.1 취약점
1.2 취약점의 발견과 패치
2. 취약점분류
2.1 Memory Corruption 취약점분류
3. Exploit 분류
3.1 파일포맷 Exploit 
3.2 리모트(원격) Exploit
 
III. 쉘코드 원리와 작성
1. 쉘코드작성
2. 널바이트 제거
3. Universial 쉘코드
4. 포트바인딩쉘코드작성
5. 리버스 쉘코드작성
6. 쉘코드 인코딩
 
IV. Exploit 작성
1. 스택버퍼오버플로우 Exploit
1.1 Direct EIP Overwrite
1.2 Trampoline
1.3 SEH Overwrite
2. 힙 버퍼오버플로우 Exploit
2.1 함수포인터 Overwrite
2.2 Vtable Overwrite
3. 정수오버플로우 Exploit
3.1. 정수 오버플로우
3.2. 정수 오버플로우 Exploit 
4. Use-After-Free Exploit
4.1. Use-After-Free
4.2. HeapSpray
4.3. Use-After-Free Exploit
5. Exploit 작성 자동화
5.1 Metasploit 모듈 작성
5.2 mona 를 이용한 Exploit 작성
 
V. 방어와 우회기법
1. SafeSEH 기법
1.1 SafeSEH
1.2. Non SafeSEH 모듈 이용
1.3. 모듈이 로드되지 않은 메모리 영역 이용 
2. DEP 기법
2.1. DEP
2.2. RTL
2.3. Chaining RTL
2.4. ROP
2.5. ROP 자동화
3. ASLR 기법
3.1. ASLR 소개
3.2. BruteForce
3.3. Non ASLR 모듈 우회
3.4. 부분 Overwrite 
3.5. Info Leak
 
VI. 버그헌팅
1. 기본방법론
1.1 블랙박스 VS 화이트박스
1.2 버그 식별 및 평가
2. 소스코드 분석
2.1 소스코드 리뷰
2.2 소스코드 점검툴
3. 퍼징(Fuzzing)
3.1 Dumb 퍼징
3.2 Smart 퍼징
3.3 파일 퍼저 구현
4. 리버싱(Reversing)
4.1 고급 디버깅 기술
4.2 리버싱을 이용한 버그 헌팅
4.3 바이너리 디핑


=============================================================================
  내용 발췌
=============================================================================

# 바이너리 디핑을 이용한 버그헌팅














# IDA Python 을 이용한 취약점 분석 자동화





# 파일 포맷  퍼징 툴 구현




# 소스코드 오디팅




# Universal 쉘코드







First-chance Exception / Second(last)-chance Exception



 프로그램에서 예외가 발생했을 때 디버거에 붙인 상태에서 보면 First chance Exception 이 발생하고, 

그 상태에서 한번 더 진행을 하면 Second chance Exception 이 발생한다. 디버깅 중인 상태에서는 

디버거가 예외에 대한 감지를 먼저 하게 되는데, 이로 인해 프로그램이 아닌 디버거가 발견한 예외 상태를 

First chance Exception 이라 한다. 

 간혹 퍼징을 하다 First chance Exception 이 발생한 것을 보고 디버거 없이 해당 파일을 실행해보면 

실제로는 예외가 발생하지 않는  경우가 있는데, 이러한 경우는 Second chance Exception 이 발생했을 때 

프로그램이 예외 처리(SEH)를 수행하고 있다는 뜻이다. 


 즉 퍼징을 할 때에도 디버깅 상태이므로 First chance Exception 은 넘어가는 것이 좋다는 것. 

조금 더 자세한 사례를 알아볼 필요가 있을 듯 하다.










# Bug Hunting (1) - Exploitable 취약점 분류



취약점에는 다양한 종류가 있다. 


똑같은 crash 가 발생하더라도, 해당 버그는 Exploit 할수도, 불가능 할수도 있다. 


여기서 Exploit 이라 함은 코드 실행 흐름을 변경하여 원하는 코드를 실행할 수 있는, 즉 Code Execution 이 가능한가이다.


간단한 설명과 함께 분류해 보았다.





1. Memory Corruption


 - 대표적인 Exploit 유형으로, 주로 잘못된 함수 사용 등에 의해 발생




 1.1. Stack Buffer Overflow

  

    - 스택상의 메모리 영역을 침범하여 덮어쓰는 유형의 버그


    - 공격기법 : Direct EIP Overwrite, SEH Overwrite, ECX one byte Overflow, RTL(Return To Library), Fake EBP, Fake ESP, ROP


    - 방어기법 : Stack Guard, Stack Cookie, DEP/NX, ASLR



 1.2. Heap Buffer Overflow


    - 힙 메모리 영역을 침범하여 덮어쓰는 유형의 버그


    - 공격기법 : VFT Overwrite(Virtual Function Table Overwrite), Function Pointer Overwrite




 1.3. Format String Bug


    - 포맷 스트링을 사용하지 않은 잘못된 함수 사용으로 인하여 %n 등으로 특정 주소값을 덮어씌우는 공격기법


    - 공격기법 : dtors Ovewrite, Got Overwrite, RET Overwrite 




 1.4. Use-After-Free


    - Free 로 해제된 객체, 포인터를 사용하는 경우 발생하는 버그로, 최근 많이 발견되는 유형 중 한가지이다.(특히 웹브라우저)

   

    - 공격기법 : Heap Spray -> 정밀 Heap Spray, DEPS(엘리멘탈 속성 spray), JIT Spray 등



 1.5. Double Free


    - free() 로 이미 해제된 메모리를 한번 더 해제하려 할때 발생하는 버그




 1.6. Integer Overflow


    - 자료형마다의 경계값(최대,최소값) 차이점 등에 의해 발생하는 버그












+ Recent posts