[Fuzzer] Debugger with VEH for Themida

Posted by push0ebp
2015. 6. 27. 17:43 Project

이전글

[Fuzzer] SeulFuzzer (for Themida)

이 퍼저의 디버거는 pydbg가 아닌 VEH을 이용한 방법을 사용한다.

PVOID WINAPI AddVectoredExceptionHandler( _In_ ULONG                       FirstHandler, _In_ PVECTORED_EXCEPTION_HANDLER VectoredHandler );


이 함수는 예외가 발생 할 때 처리해주는 핸들러(ExceptiinHandler)를 등록 한다.

프로그램에서 try except로 예외 처리를 해도 가장 먼저 등록한 핸들러로 넘어가기 때문에 모든 exception

을 컨트롤 할 수 있다.

그리고 웬만한 Anti-Debugging에 탐지 되지 않는다.


그런데 ExceptionHandler에도 우선순위가 있다.

스택구조와 같은데 가장 최근에 등록한 핸들러가 가장 먼저 처리된다.


예를 들면

ExceptionFilter1

ExceptionFilter2

ExceptionFilter3

이렇게 등록했을때


ExceptionFilter3

ExceptionFilter2

ExceptionFilter1

순으로 처리 된다.


그래서 내가 등록한 후에 다른 핸들러가 등록되지 못하도록

xor eax, eax

ret 8 로


이렇게 무력화 시켰다.


보통 C로 디버거를 구현할때 DebugActiveProcess() 등 window api를 여러게 쓰면서 코딩하곤 한데

이 디버거 코드는 이 몇 줄이 끝이다.

dll injection을 이용하면 같은 프로세스 안에 상주하기때문에 정보도 얻기 쉽고 디버거도 짜기쉽다.

그리고 저 핸들러내에서 minidumpwritedump 함수를 사용하여 덤프파일을 쉽게 생성 할 수 있다.


-단점

1. 데이터 공유가 어렵다. (python <> dll)

2. 불필요한 exception까지 잡힌다.

- 인젝션 한 모듈에서 exception이 일어나면 등록한 handler로 넘어간다. 그래서 내 바이너리 .text에서 발생한

exception인지 판별해야한다.

하지만 이 방법은 버그로 인해 저 범위내로 eip가 변조되면 제외되기 때문에 리포팅하지않아 유실되는 문제

가 발생할수있다. 그게 exploitable한 취약점이였다면 더 큰 문제...

(임시방편으로 해둔건데 다른 방법을 생각해봐야겠다....)



저는 이 방식이 편해서 사용한거니 꼭 VEH를 사용할 필요는 없습니다.
Anti-Debugging api hook 하셔도되고 편한 방법을 찾으시길 바랍니다.



'Project' 카테고리의 다른 글

[Django] Shodan 커스터마이징(?)  (0) 2015.11.30
[Fuzzer] SeulFuzzer (for Themida)  (1) 2015.06.27