티스토리 뷰
본 문서는 원문 저자인 Massimiliano Tomassoli의 허락 하에 번역이 되었으며, 원문과 관련된 모든 저작물에 대한 저작권은 원문 저자인 Massimiliano Tomassoli에 있음을 밝힙니다.
http://expdev-kiuhnm.rhcloud.com
최신 윈도우즈 익스플로잇 개발 02. Mona 2
hackability.kr (김태범)
hackability_at_naver.com or ktb88_at_korea.ac.kr
2016.07.19
Mona 2
Mona2는 Corelan Team 에서 개발한 굉장히 유용한 툴 입니다. 원래는 Immunity Debugger 를 위해 개발 되었지만 지금은 WinDbg 에서도 사용이 가능합니다.
WinDbg에 설치
먼저 WinDbg x86과 x64를 설치 합니다. 그 후,
- Python 2.7 설치 (이 때, x86 버전과 x64 버전을 각각 다른 디렉토리에 설치) - https://www.python.org/downloads/
- http://pykd.codeplex.com/ 에서 오른쪽에 있는 zip 패키지를 받고 vcredist_x86.exe 와 vcredist_x64.exe 를 실행 합니다.
- http://pykd.codeplex.com/ 에서 두개의 실행 파일 (x86, x64)를 받고 실행 합니다.
- https://github.com/corelan 에서 windbglib.py 와 mona.py 를 받고 windbg 디렉토리에 넣습니다.
- 심볼 경로를 설정합니다.
- File -> Symbol File Path
- SRV*C:\windbgsymbols*http://msdl.microsoft.com/download/symbols
- File -> Save Workspace 를 이용하여 저장
WinDbg에서 mona.py 실행
WinDbg에서 mona를 실행하는 것은 간단합니다.
1. 다음 명령어를 이용하여 pykd를 불러 옵니다.
.load pykd.pyd
2. 그리고 mona 를 실행합니다.
!py mona
Mona 를 업데이트 하기 위해서는 다음과 같이 입력합니다.
!py mona update
설정
작업 디렉토리
Mona 에서 제공되는 다양한 함수들은 덤프 파일을 mona 작업 디렉토리에 생성합니다. 작업 디렉토리는 프로세스 이름과 아이디에 따라 지정할 수 있습니다. (%p : 프로세스 이름, %i : 프로세스 아이디)
예를들어 다음과 같습니다.
!py mona config -set workingfolder "C:\mona_files\%p_%i"
제외 모듈
검색 시 특정 모듈들을 제외 시킬 수 있습니다.
!mona config -set excluded_modules "module1.dll,module2.dll"
!mona config -add excluded_modules "module3.dll,module4.dll"
저자
Author 옵션으로 저자를 설정할 수 있습니다.
!mona config -set author Kiuhnm
이 정보는 metasploit 에서 사용 될 수 있습니다.
중요
만약 WinDbg와 mona 사용시 문제가 생긴다면 WinDbg를 관리자 권한으로 실행하세요.
Mona 설명서
Mona 설명서는 https://www.corelan.be/index.php/2011/07/14/mona-py-the-manual/ 에서 확인 할 수 있습니다.
예제
다음 예제는 Mona 설명서에 있는 예제 입니다.
우리가 다음 코드에서 ECX 값을 다룰 수 있다고 가정합니다.
1 2 | MOV EAX, [ECX] CALL [EAX+58h] | cs |
이 코드를 이용하여 ESP+4 위치에 있는 우리의 쉘 코드가 있는 곳으로 뛰고 싶습니다. 그러면 우리는 ADD ESP, 4 | RET 같은 명령어가 있는 곳을 호출 하고 싶습니다.
위 코드에는 간접 참조가 많습니다.
- (ECX = p1) -> p2
- P2 + 58h -> p3 -> “ADD ESP, 4 | RET"
첫 번째로 우리는 p3을 찾아야 합니다.
!py mona config -set workingfolder c:\logs
!py mona stackpivot -distance 4,4
Stackpivot 함수는 –distance min, max 를 지정하여 min max 사이에 있는 값 X 중에 “ADD ESP, X | RET” 과 동일한 역할을 하는 코드를 찾습니다. 찾은 결과는 C:\logs\stackpivot.txt 에 저장됩니다. 이제 p3를 찾았으니 이제 p1을 찾아야 합니다.
!py mona find -type file -s "c:\logs\stackpivot.txt" -x * -offset 58 -level 2 -offsetlevel 2
옵션의 의미를 살펴 보면 다음과 같습니다.
- “-x *” 의 뜻은 페이지 접근 레벨을 의미합니다. 만약 –x X 로 되어 있다면 실행 가능한 페이지의 주소만 가능하게 됩니다.
- “-level 2”은 간접 참조의 레벨을 의미합니다. Mona 에서는 pointer p3을 가리키는 pointer p2를 가리키는 pointer p1을 찾게 됩니다.
- 처음 두개 옵션 (-type 과 –s)는 파일에서 p3 이 반듯이 포인터 임을 명시 합니다.
- “-offsetlevel 2” 와 “-offset 58”은 포인터 p2에서 58h 증가된 값이 포인터 p3을 가리킴을 의미합니다.
만약 위 예가 명확하지 않아도 걱정하지 마세요. 이 예제는 Mona가 어떤 것을 할 수 잇는지 보여주는 예제 이고 저 역시 위 명령어가 직관적이 않은 문법이라 생각합니다.
예제
findwild 명령어는 특정 형식에 적합한 명령어 chains 을 찾아 줍니다. 다음 예를 살펴 보면,
!mona findwild -s "push r32 # * # pop eax # inc eax # * # retn"
옵션 “-s” 는 chain의 shape 를 지정합니다.
- 명령어는 ‘#’으로 구분합니다.
- r32 는 아무 32-bit 레지스터를 의미합니다.
- * 은 아무 명령어의 순서를 의미합니다.
선택적으로 지원되는 인자는 다음과 같습니다.
- depth <nr>: chain의 최대 크기
- -b <address>: 검색의 기본 주소
- -t <address>: 검색의 최상단 주소
- -all: “나쁜” 명령어가 포함된 chain들도 반환합니다. 예로 이런 나쁜 명령어는 점프나, 호출 등에 의해 chain이 깨질 수 있습니다.
ROP Chains
Mona는 ROP 가젯을 찾거나 ROP Chains을 만들어 주긴 하지만 아직 ROP 에 대한 내용을 다루지 않았기 때문에 여기서는 설명하지 않겠습니다. 제가 전에 얘기했듯, 걱정하지 마시고 이 강좌가 완벽하지 않다고 생각이 드시면 다음 강좌를 보시기 바랍니다.
'Projects > Exploit Development' 카테고리의 다른 글
[익스플로잇 개발] 05. 윈도우즈 기초 (0) | 2016.07.19 |
---|---|
[익스플로잇 개발] 04. 힙 (Heap) (0) | 2016.07.19 |
[익스플로잇 개발] 03. 구조적 예외 처리 (SEH) (0) | 2016.07.19 |
[익스플로잇 개발] 01. WinDbg (1) | 2016.07.18 |
[익스플로잇 개발] 00. 서문 (4) | 2016.07.18 |
- Total
- Today
- Yesterday
- IE 11 UAF
- UAF
- expdev 번역
- School CTF Writeup
- 2014 SU CTF Write UP
- Use after free
- IE 10 God Mode
- TenDollar CTF
- TenDollar
- IE 10 Exploit Development
- shellcode writing
- 힙 스프레잉
- IE 11 exploit development
- heap spraying
- 쉘 코드
- shellcode
- School CTF Write up
- data mining
- IE 10 리버싱
- 윈도우즈 익스플로잇 개발
- Windows Exploit Development
- IE 10 익스플로잇
- IE UAF
- Mona 2
- 2015 School CTF
- CTF Write up
- WinDbg
- 쉘 코드 작성
- 데이터 마이닝
- IE 11 exploit
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |