CTF/CodeEngn.kr

Basic RCE L04

HelloMG 2020. 2. 9. 17:25

Basic RCE L04 문제

먼저 문제를 봅시다!

디버거를 탐지하는 함수의 이름을 찾으라네요 :D

EP(Entry Point)

EP(Entry Point) 입니다!

그리고 도스 프로그램이 켜지네요 :D

[F8]을 누르면서 계속해서 내려가 봅시다!

디버깅 탐지

계속해서 내려가다보니 빨간칸으로 표시 되어있는 곳에서

갑자기 "디버깅 당함"이라는 문자열이 출력되기 시작합니다.

그리고 더이상 분석이 안되더군요!

 

그래서 저 지점을 기억한 후 [Ctrl]+[F2]를 누르고 다시 시작해서 저 함수로 들어가 봅시다 :D

함수 분석

함수를 분석해보니 Sleep 함수와 IsDebuggerPresent 함수가 보입니다.

계속가다 401074 주소의 함수에서 "디버깅 당함"이라는 문자열이 출력됩니다.

그래서 저기 함수를 분석해보니 특별히 디버깅을 탐지하는 듯한 로직은 보이지 않습니다 : (

 

계속해서 디버깅을 해보았습니다!

무한루프

여기서 무한루프가 걸립니다!

그이유는 뭘까요?

40108B 주소에서 JMP명령어로 처음으로 계속 돌아가게 됩니다.

 

즉, 저 구간이 계속해서 빙빙 돌아간다는 거죠!

그럼 디버깅을 탐지하는 함수는 무엇이냐인데..

IsDebuggerPresent 함수가 정답입니다!

 

IsDebuggerPresent 함수는 PEB 구조체의 디버깅 상태값을 확인하여

디버깅 시 1을 리턴하고 아니면 0을 리턴합니다 :D

https://docs.microsoft.com/en-us/windows/win32/api/debugapi/nf-debugapi-isdebuggerpresent

 

IsDebuggerPresent function (debugapi.h) - Win32 apps

Determines whether the calling process is being debugged by a user-mode debugger.

docs.microsoft.com

자세한 사항은 위의 microsoft 정식 홈페이지에서 확인하시면 됩니다 :D

1을 리턴

현재 Ollydbg로 디버깅 중이기 때문에

1을 리턴한다고 했죠 ?

 

위의 사진을 보다시피 EAX가 1로 반환된 것을 볼 수 있습니다 :D

 

 

그럼 이를 우회하는 방법은 없을까요!?

 

다양한 방법이 있습니다!

 

 

첫번째

IsdebuggerPresent 함수로 반환된 EAX 값을 0으로 강제로 변경해주면 되겠죠 :D ?

Modify EAX

바꿔주는 이유는 당연히 EAX를 0으로 바꾸면 디버깅하고 있지 않다는 뜻이니까요!

 

 

두번째

IsDebuggerPresent함수를 "MOV EAX, 0"로 변경하면 됩니다!

MOV EAX, 0

그럼 EAX값이 변하지 않겠죠 ㅎㅎㅎ?

 

 

세번째

PEB 구조체의 디버깅 상태값을 변경해 버리는 겁니다 :D

처음부터 차근차근해봅시다!

 

먼저 IsDebuggerPresent 함수로 들어가면 MOVZX 명령어가 나옵니다.

MOVZX 명령어를 실행 전까지 실행시키고

EAX 값에서 오른쪽 클릭하여 [Follow in Dump] 기능을 이용합니다 :D

Follow in Dump

그럼 메모리 부분 구조체로 이동하게 되고

빨간 칸으로 표시된 부분이 바로 디버깅 상태값입니다 :D

디버깅 상태 값 변경 전

저 부분을 클릭 후 [Space] 바를 눌러서 0으로 변경을 시켜줍시다!

디버깅 상태 값 변경 후

이후 실행하면 정상이라고 출력되는 것을 볼 수 있습니다 :D

IsDebuggerPresent 우회

 

이렇게 IsDebuggerPresent 함수에 대해 알아보았고 우회하는 방법까지 알아보았습니다 :D