다큐프라임(EBS)

지식채널e(EBS)

세계의 눈(EBS)

다큐 오늘(EBS)

EBS 기획특강(EBS)

EBS 인문학 특강(EBS)

세계테마기행(EBS)


해외걸작 다큐(KBS1)

글로벌 다큐멘터리(KBS1)

다큐 공감(KBS1)

KBS 스페셜(KBS1)

걸어서 세계속으로(KBS1)

명견만리(KBS1)


다큐멘터리 3일(KBS2)

세상의 모든 다큐(KBS2)


MBC 스페셜(MBC)

MBC 다큐프라임(MBC)


SBS 스페셜(SBS)

일요 특선 다큐멘터리(SBS)


JTBC 스페셜 다큐멘터리(JTBC)




KBS1

KBS2

MBC : MBC 스페셜(23:10)

SBS

EBS : 지식채널e(12:40), EBS 기획특강(13:20), 다큐 오늘(20:40), 세계테마기행(20:50), 다큐프라임(21:50)

JTBC


KBS1

KBS2

MBC

SBS

EBS : 지식채널e(12:40), EBS 기획특강(13:20), 다큐 오늘(20:40), 세계테마기행(20:50), 다큐프라임(21:50)

JTBC : JTBC 스페셜 다큐멘터리(01:50)


KBS1 : 해외걸작 다큐(00:20)

KBS2

MBC

SBS

EBS : 지식채널e(12:40), 다큐 오늘(20:40), 세계테마기행(20:50), 다큐프라임(21:50)

JTBC : JTBC 스페셜 다큐멘터리(01:50)


KBS1 : KBS 스페셜(22:00)

KBS2 : 세상의 모든 다큐(00:35)

MBC

SBS

EBS : 다큐 오늘(20:40), 세계테마기행(20:50)

JTBC : JTBC 스페셜 다큐멘터리(01:50)


KBS1 : 명견만리(22:00)

KBS2

MBC : MBC 다큐프라임(01:05)

SBS

EBS : 다큐 오늘(20:40)

JTBC : JTBC 스페셜 다큐멘터리(01:50)


KBS1 : 걸어서 세계속으로(09:40), 글로벌 다큐멘터리(20:10)

KBS2

MBC

SBS

EBS : 세계의 눈(16:45)

JTBC : JTBC 스페셜 다큐멘터리(01:50)


KBS1 : 다큐 공감(20:05)

KBS2 : 다큐멘터리 3일(22:40)

MBC

SBS : 일요 특선 다큐멘터리(07:30), SBS 스페셜(23:10)

EBS : 세계의 눈(16:45)

JTBC

블로그 이미지

SanseoLab

,

mona.py 란 corelan 팀에서 파이썬으로 만든 취약점 분석 도구이다.

원래 이뮤니티 디버거에서 사용하기 위한 용도였지만 windbg에서도 pykd를 통해 사용 가능하다.


사용법은 디버거의 명령 라인에서 

!mona [명령어]

를 사용하면 된다.




!mona modules (!mona mod)


Base | Top | Size | Rebase | SafeSEH | ASLR | NXCompat | OS Dll | Ver, Modulename, Path


주소 시작 | 주소 끝 | 크기 | DLL 재배치 | SafeSEH 사용 여부 | ASLR 사용 여부 | NXCompat 사용 여부 | OS DLL인지 여부 | 버전과 모듈 이름 그리고 경로


위와 같이 익스플로잇 방어 기법들의 사용 여부와 기본적인 정보들을 보여준다.

참고로 Rebase는 DLL에서 사용하는 것으로서 보안 보다는 DLL의 특징에 의한 것이다. 취약점 공격 시에는 ASLR이나 같다고 할 수 있다.

그리고 NXCompat은 DEP라고 생각하면 된다.




!mona rop


ROP 생성을 도와준다.

rop -m [모듈] : 지정한 모듈에서 가젯 검색

rop -n : 널바이트로 시작하는 모듈을 제외하고 로드된 모든 가젯 검색.




!mona pattern_create [숫자] (pc 숫자)


[숫자]바이트의 정해진 패턴을 출력한다.

이 글을 볼 정도면 다 알겠지만 굳이 예를 들자면, 

주로 버퍼 오버플로우 검사 시에 A를 길게 써 넣어서 EIP가 A인 41414141로 바뀐 스택 버퍼 오버플로우가 발생했다고 하자. 

이 경우에 정확히 어느 주소에 ESP가 위치해서 EIP가 저걸로 바꼈는지 찾아야 할텐데 AAA..들의 나열 대신 저 정해진 패턴을 버퍼에 입력하면,

즉 Aa0Aa1Aa2....Ab9... 이런 내용을 버퍼로 넣었다고 치면 EIP에 들어온 내용을 검색해 보면 몇 번째 문자열에서 EIP의 주소가 바뀌게 되는 지를 알 수 있다.

참고로 C:\logs\ 의 경로에 프로세스 이름 별로 pattern.txt 파일에 위의 패턴이 저장되므로 복사해서 사용할 수 있다.




!mona pattern_offset [패턴]


패턴을 검색한다. 패턴은 4바이트를 집어넣어야 한다. 

예를들면 EIP에 들어온 값이 0x41613041이라고 하자.

그럼 !mona po 41613041을 친다.

이것은 문자열로 보면 Aa0A이기 때문에 결과는 오프셋이 0 즉, 처음이라고 나오게 된다.




이외에도 많은 명령어들이 존재한다.


? / eval                | Evaluate an expression

assemble / asm     | Convert instructions to opcode. Separate multiple instructions 

                           with #

bpseh / sehbp       | Set a breakpoint on all current SEH Handler function pointers

breakfunc / bf       | Set a breakpoint on an exported function in on or more dll's

breakpoint / bp     | Set a memory breakpoint on read/write or execute of a given address

bytearray / ba       | Creates a byte array, can be used to find bad characters

calltrace / ct         | Log all CALL instructions

compare / cmp      | Compare contents of a binary file with a copy in memory

config / conf         | Manage configuration file (mona.ini)

copy / cp             | Copy bytes from one location to another

deferbp / bu         | Set a deferred breakpoint

dump                  | Dump the specified range of memory to a file

egghunter / egg     | Create egghunter code

encode / enc         | Encode a series of bytes

filecompare / fc      | Compares 2 or more files created by mona using the same output commands

find / f                  | Find bytes in memory

findmsp / findmsf    | Find cyclic pattern in memory

findwild / fw           | Find instructions in memory, accepts wildcards

fwptr / fwp             | Find Writeable Pointers that get called

geteat / eat            | Show EAT of selected module(s)

getiat / iat              | Show IAT of selected module(s)

getpc                    | Show getpc routines for specific registers

gflags / gf              | Show current GFlags settings from PEB.NtGlobalFlag

header                 | Read a binary file and convert content to a nice 'header' string

heap                     | Show heap related information

help                      | show help

hidedebug / hd       | Attempt to hide the debugger

info                   | Show information about a given address in the context of the 

                          loaded application

infodump / if          | Dumps specific parts of memory to file

jmp / j                  | Find pointers that will allow you to jump to a register

jop                       | Finds gadgets that can be used in a JOP exploit

kb / kb                  | Manage Knowledgebase data

modules / mod        | Show all loaded modules and their properties

noaslr                    | Show modules that are not aslr or rebased

nosafeseh               | Show modules that are not safeseh protected

nosafesehaslr          | Show modules that are not safeseh protected, not aslr and 

                             not rebased

offset                     | Calculate the number of bytes between two addresses

pageacl / pacl          | Show ACL associated with mapped pages

pattern_create / pc    | Create a cyclic pattern of a given size

pattern_offset / po    | Find location of 4 bytes in a cyclic pattern

peb / peb               | Show location of the PEB

rop             | Finds gadgets that can be used in a ROP exploit and do ROP magic 

                   with them

ropfunc       | Find pointers to pointers (IAT) to interesting functions that can be 

                   used in your ROP chain

seh                       | Find pointers to assist with SEH overwrite exploits

sehchain / exchain   | Show the current SEH chain

skeleton        | Create a Metasploit module skeleton with a cyclic pattern for a 

                    given type of exploit

stackpivot             | Finds stackpivots (move stackpointer to controlled area)

stacks                  | Show all stacks for all threads in the running application

string / str            | Read or write a string from/to memory

suggest                | Suggest an exploit buffer structure

teb / teb               | Show TEB related information

unicodealign / ua   | Generate venetian alignment code for unicode stack buffer 

                           overflow

update / up          | Update mona to the latest version


자세한 세부 사항은 직접 찾아보자.


https://www.corelan.be/index.php/2011/07/14/mona-py-the-manual/

블로그 이미지

SanseoLab

,

구글링을 하다 보면 퍼징과 관련된 괜찮은 자료들이 많이 나온다.


- 윈도우 멀티미디어 취약점 분석 방법론

- 주요 국산 SW 대상 신규 취약점 발굴 및 분석방법 연구

- 취약점 발굴을 위한 프로그램 입력 데이터 흐름분석 연구 최종보고서


이 외에도 교재로

- Fuzzing Brute Force Vulnerability Discovery

이게 추천된다는데 아직 안봐서 모르겠다.


여기까지 취약점을 찾기 위한 퍼징과 관련된 글이었다.


이제 취약한 부분을 찾은 후에 셸코드를 작성하고 등등 그것을 exploit해야 한다.

이것은 기본 개념들을 매우 잘 설명한 책이 있어서 책 이름을 쓰겠다.

인터넷에 나와 있는 자료는 이 책을 공부한 후에 해도 충분하다고 생각한다.


- 윈도우 시스템 해킹 가이드 버그헌팅과 익스플로잇

블로그 이미지

SanseoLab

,

여기서는 실제로 피치를 사용해 보겠다.


먼저 pit 파일(m3u.xml)을 peach 폴더에 넣는다.

그리고 명령 프롬프트를 관리자 권한으로 실행하고 (peach.exe도 관리자 권한으로 실행 설정) 피치 폴더로 간다.

이제 만든 pit 파일을 테스트해 보겠다.


> peach -t m3u.xml

이상이 없다고 나온다면 좋은거고 혹시 틀렸더라도 틀린 이유도 같이 나오기 때문에 잘 찾아가면서 고칠 수 있다.

이제 이상이 없다고 보자.


> peach -1 --debug m3u.xml

완료됬다고 떠야한다.

그럼 피치 폴더에 fuzzed.m3u라는 파일이 생길 것이다.

이걸 복사해서 다른 곳에 놓고 저 명령어를 한번 더 실행하자. fuzzed.m3u 파일이 또 생길 것이다.

이 두 개의 m3u 파일이 다르다면(DataModel 설정을 잘 못하면 가끔 변이가 안될 수 있다) 잘 된 것이므로 이제 시작한다.


> peach --debug m3u.xml

이제 피치가 퍼징을 시작한다.

(--debug 옵션은 빼도 된다.)


그럼 피치 폴더 안에 logs라는 폴더가 생길 것이고 그 안에 "m3u.xml_2016..." 등의 파일이 생긴다.

그곳에 들어가 보면 파일과 폴더들이 존재한다.

status.txt : 그냥 상태를 보여준다. 디폴트로는 언제 시작했는지와 몇 번째 반복인지(100번 마다 시간 기록해줌) 그리고 몇 번째 반복 시에 Fault가 발견되었는지가 적힌다.

Reproducing : 크래시를 발견하고 확인하는 중이다.

Faults : 분석된 크래시들. 들어가 보면 EXPLOITABLE 같은 폴더들이 생성되고 있다. 각 발견된 반복의 이름(4 같이)의 폴더가 있고 들어가 보면 MSEC을 통한 취염점 결과 리포트와 크래시를 일으킨 fuzzed.m3u 파일(1.Initial.Action.bin이라는 이름 등으로)이 존재한다.

NonReproducable : 피치가 발견된 모든 크래시를 Reproduce하고 분석할 수 있는 것은 아니며 그냥 그러려니하자.


Pit을 작성하면서 보았겠지만 피치는 크래시 발생 시 Windbg의 MSEC.dll이라는 익스텐션을 실행시켜서 이것을 통해 취약점을 분석한다.

이것은 예외가 발생했을 때 exploit 가능한지를 판단해 주고 이외의 여러 유용한 정보들을 제공한다.

왜 MSEC냐면 Microsoft Security Engineering Center에서 만든 것이기 때문.

블로그 이미지

SanseoLab

,

Peach Pit 파일은 피치 퍼저가 퍼징을 수행할 때 필요한 파일로써 xml문법을 따른다(확장자도 당연히 xml).

사실 피치 퍼저에서 Pit이 가장 중요하다. 어지간한 것들은 피치와 MSEC이 해주지만 Pit 파일은 본인이 직접 만들어야하기 때문이다.

물론 인터넷에 자료가 좀 있지만 정말 모든 것을 찾아봤다고 생각할 정도로 찾아본 결과 제대로 된 피치 3의 Pit 파일은 인터넷에 몇 정도 밖에 없다.


이곳은 피치 Pit을 작성하는데 도움을 받을 수 있는 일종의 매뉴얼 사이트이다.

Pit 문법을 공부할 수 있다. 피치 3 버전 외에도 피치 2버전의 문법도 나와있다.

http://community.peachfuzzer.com/v3/PeachPit.html


그리고 이곳은 아마 가장 많은 사람들이 읽은 것으로 여겨지는 글이다.

참고로 피치 2.3 버전에 관한 글이고 오타가 몇 개 있다. 추후에 찾아서 수정 가능하므로.

http://www.flinkd.org/2011/07/fuzzing-with-peach-part-1/

http://www.flinkd.org/2011/11/fuzzing-with-peach-part-2-fixups-2/


그 외에도 한글로도 몇몇 블로그에서 설명해놓은 것들이 존재하지만 이 모든 것들은 피치 2를 기반으로 한 것들이다.

물론 피치 2.3을 설치하면 되겠지만 나는 3을 공부하였으므로 3을 기반으로 글을 쓰겠다.

그리고 위의 글들만 보아도 기본적인 내용들은 알게될 것이고 2와 3이 약간 다르다는 것도 인지하게 될 것이다.

하지만 수많은 삽질을 하게 될 것이므로 여기서 기본적인 내용을 쓰겠다.



아래는 Pit 파일의 내용이다. 따로 xml 편집기를 사용해도 되지만 귀찮으면 그냥 메모장으로 편집해도 된다.

(xml의 주석은 저렇게 <!--과 --> 사이에 있는 글이다.)

https://www.youtube.com/watch?v=u5JB7-K3j6Y&list=PLY81Xq8dvFR6282jX47OeBFs20tbNPmGb&index=4

위의 유튜브 링크에 나온 pit이다.



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

<?xml version="1.0" encoding="utf-8"?>

<Peach version="1.0">


  <DataModel name="TheDataModel">

      <String name="header1" value="M3U\n" mutable="false"/>

      <String name="header2" value="#EXTM3U\n" mutable="false"/>

      <String name="header3" value="#EXTINF:123, Sample artist - Sample title\n" mutable="false"/>

      <String name="header4" value="C:\" mutable="false"/>

      <String name="header5" value="hello" mutable="true"/>

  </DataModel>


  

  <StateModel name="TheState" initialState="Initial">

    <State name="Initial">

      <Action type="output">

        <DataModel ref="TheDataModel"/>

        <!-- 이 ref에 위 DataModel의 name을 쓰면 된다.-->

      </Action>

      <Action type="close"/>

      <Action type="call" method="LaunchViewer" publisher="Peach.Agent"/>

    </State>

  </StateModel>


  

  <Agent name="WinAgent">

    <Monitor class="WindowsDebugger">

      <Param name="CommandLine" value="C:\Program Files\VUPlayer\VUPlayer.exe fuzzed.m3u"/>

      <!-- 여기서는 명령 프롬프트의 내용을 쓴다. 즉, 곰오디오로 저 생성된 fuzzed.m3u 파일을 실행한다는 것.-->

      <Param name="WinDbgPath" value="C:\Program Files\Debugging Tools for Windows (x86)\" />

      <!-- 여기는 당신의 Windbg 경로를 쓰면 된다.-->

      <Param name="StartOnCall" value="LaunchViewer"/>

      <Param name="CpuKill" value="ture"/>

    </Monitor>

    <Monitor class="PageHeap">

      <Param name="Executable" value="VUPlayer.exe"/>

      <!-- VUPlayer의 실행파일 명-->

      <Param name="WinDbgPath" value="C:\Program Files\Debugging Tools for Windows (x86)\" />

    </Monitor>

  </Agent>



  <Test name="Default">

    <Agent ref="WinAgent" platform="windows"/>

    <StateModel ref="TheState"/>

    <!-- StateModel의 name을 쓴다.-->

    <Publisher class="File">

      <Param name="FileName" value="fuzzed.m3u" />

      <!-- 피치가 생성한 파일 이름-->

    </Publisher>

    <Logger class="File">

      <Param name="Path" value="logs"/>

      <!-- 이러면 피치 폴더 안에 logs 파일이 생성되고 그 안에서 처리될 것이다.-->

    </Logger>

  </Test>


</Peach>

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


간단히 설명해 보겠다. 위 내용은 m3u.xml 이라는 파일로 저장하고 peach.exe가 존재하는 폴더에 넣는다.

먼저 크게 DataModel, StateModel, Agent, Test 이렇게 4 부분으로 나뉜다.

DataModel은 특정 확장자의 포맷을 위의 형태로 생성한다. m3u는 간단한 확장자이기 때문에 위 처럼 간단하게 사용할 수 있다.

StateModel은 그냥 기본적으로 저렇게 사용하면 될테고 자세한 것은 첫 번째 글의 링크들을 보면서 잘 찾아보면 된다.

Agent를 보면 알겠지만 당신이 VUPlayer를 대상으로 m3u 파일에 대한 퍼징을 수행하는 경우이다. 저렇게 경로를 쓰면 된다.

피치 폴더에는 peach.exe가 존재하며 또한 m3u.xml도 존재한다. 그리고 퍼징 시 마다 변이되서 생성되는 fuzzed.m3u라는 파일도 그 폴더에 생성된다.

대상 프로그램(VUPlayer)은 당연히 전체 경로를 써줘야 할 테고 Windbg도 마찬가지이다.

Test를 보면 아랫 부분에 logs라고 써져 있는데 이것은 피치 폴더 내에 logs라는 폴더가 생성되고 이 폴더 안에 퍼징의 결과 즉 리포트 등이 저장된다.


DataModel에 대해서 약간 더 설명이 필요한 것 같은데 header1~4까지는 mutable이 false이므로 매 fuzzed.m3u마다 이 값은 똑같지만,

마지막 header5는 mutable이 true이므로 fuzzed.m3u 파일(퍼징 수행 시마다 만들어지는) 마다 그 크기와 값이 달라진다.


추후 부터는 DataModel 부분만 퍼징할 파일에 맞춰서 설정해 주면 된다. 그리고 대상 프로그램은 경로만 설정해주면 되므로 편하다.

물론 파일 포맷을 이해하고 DataModel을 직접 만드는건 그렇게 쉬운 일은 아니다.


혹시 제대로된 프로세스를 모를까봐 다시 한 번 정리해 보겠다.

피치 폴더 안에 위의 m3u.xml 파일을 집어 넣고 피치를 실행시킨다면 피치는 xml의 DataModel에 따른 포맷을 사용해서 fuzzed.m3u이라는 파일을 만들게 되고 이후에는 저 명령 프롬프트 명령 처럼 VUPlayer로 이 fuzzed.m3u를 실행한다.

그리고 크래시가 발생한다면 내부에 존재하는 MSEC라는 크래시 분석 도구를 사용해 분석한 결과를 따로 저장한다.


사실 VUPlayer는 크래시가 기본적으로 발생할 수 밖에 없는 구조이다. 내부에서 크기 입력을 제한하지 않아서 저 header5가 많은 내용을 갖게 되면 자동으로 버퍼 오버플로우가 발생한다.

실제 사용하는 것은 다음 글에서 다루도록 하겠지만 문제는 이 부분이 가장 중요하다는 것이다.

즉, pit 파일을 만드는 것이 가장 중요한데 인터넷에는 제대로 된 글이 거의 존재하지 않는다.

물론 본인이 직접 만들어야 겠지만 연습을 위해서라도 볼 필요가 있을텐데 말이다.

다음은 인터넷을 통해 찾을 수 있는 pit 파일들이다. 물론 올릴 수는 없으므로 잘 구글링해보길 바란다. 참고로 영어로.

(그리고 DataModel만 참고한다. 아랫 부분은 대부분 피치 2.3을 위한 설정들이다.)


m3u : 이 글 윗 부분의 링크.

docx : http://stackoverflow.com/questions/36120204/peach-fuzzer-create-docx-and-fuzzing-ms-word (잘 될지 모르겠지만 수정해가면서 해보길)

gif : http://puzzor.blogspot.kr/2013/09/peach-pits-of-gif-model.html

wav : https://codegists.com/search/mplayer/1 (피치 3에서는 몇 몇 부분 때문에 오류 뜸)

mp4, zip, asf, avi, cab : www.flinkd.org/projects/peach-pits/



블로그 이미지

SanseoLab

,

피치 퍼저는 퍼징(Fuzzing) 도구들 중에서 가장 발전된 형태로 알려져 있다.

하지만 한국에서는 자료가 전무하다시피 해서 영어로 그동안 찾아왔던 자료들을 올리기로 한다.


이번 글에서는 설치에 대해서 알아본다.


먼저 피치의 다운로드 사이트는 아래와 같다.

https://sourceforge.net/projects/peachfuzz/files/Peach/


참고로 피치는 커뮤니티 버전과 상용 버전이 있는데 상용 버전은 회사에서 서비스를 제공해주는 것이며, 커뮤니티 버전은 지금 우리가 할 것들이다.


피치 이외에도 파이썬 2.7(아직 3은 지원하지 않는다고 하는데 잘 모르겠다)과 Windbg가 필요하다.

파이썬 2.7과 Windbg가 설치되어 있다고 가정하고 피치 파일을 압축 해제하면 바로 사용할 수 있는 형태가 보인다.


간단히 설명해서 이 폴더 안에 있는 Peach.exe만 사용할 것이다.

Peach.exe는 관리자 권한으로 실행을 설정해 놓는게 좋으며, 명령 프롬프트도 마찬가지로 관리자 권한으로 실행시킨다.


다음 글에서 나오겠지만 Pit 파일 즉, xml 파일을 저 폴더에 넣고 peach를 명령 프롬프트로 실행해서 사용하면 된다.



Peach Fuzzer의 공식 홈페이지는 아래와 같다.

http://www.peachfuzzer.com/

물론 볼만한 것은 없다. Pit 파일이 예전에는 제공됬었지만 이제는 유료 서비스를 위해 제공되지 않는다는 것만 알 수 있다.


다음은 Peach fuzzer 포럼으로서 괜찮은 글들이 가끔 보인다. 삽질 한창 하다가 여기서 정보를 많이 얻었지만 워낙 사용자들이 없어서 큰 도움은 되지 않았다.

https://forums.peachfuzzer.com/

그래도 관리자들이 성실하게 답글을 달아주는 것으로 보인다.

블로그 이미지

SanseoLab

,