티스토리 뷰

본 문서는 원문 저자인 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를 설치 합니다. 그 후,


  1. Python 2.7 설치 (이 때, x86 버전과 x64 버전을 각각 다른 디렉토리에 설치) - https://www.python.org/downloads/
  2. http://pykd.codeplex.com/ 에서 오른쪽에 있는 zip 패키지를 받고 vcredist_x86.exe  vcredist_x64.exe 를 실행 합니다.
  3. http://pykd.codeplex.com/ 에서 두개의 실행 파일 (x86, x64)를 받고 실행 합니다.
  4. https://github.com/corelan 에서 windbglib.py  mona.py 를 받고 windbg 디렉토리에 넣습니다.
  5. 심볼 경로를 설정합니다.
    1. File -> Symbol File Path
    2. SRV*C:\windbgsymbols*http://msdl.microsoft.com/download/symbols
    3. 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 같은 명령어가 있는 곳을 호출 하고 싶습니다.

 

위 코드에는 간접 참조가 많습니다.

 

  1. (ECX = p1) -> p2
  2. 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 에 대한 내용을 다루지 않았기 때문에 여기서는 설명하지 않겠습니다. 제가 전에 얘기했듯, 걱정하지 마시고 이 강좌가 완벽하지 않다고 생각이 드시면 다음 강좌를 보시기 바랍니다

댓글