-榮-

[CodeEngn] Basic RCE L04 (+α IsDebuggerPresent 우회) 본문

CodeEngn/Basic

[CodeEngn] Basic RCE L04 (+α IsDebuggerPresent 우회)

xii.xxv 2021. 3. 21. 02:25

 

● CodeEngn Basic RCE L04 문제

 

CodeEngn Basic RCE L04

 

디버거를 탐지하는 함수의 이름은 구글링을 통해 쉽게 찾을 수 있지만

주어진 파일을 분석하여 파일에서 사용된 디버거 탐지 함수를 찾아봅시다.

 

 

◎ 파일 실행 화면

 

[그림 1] 일반 실행 화면 / 디버거에서의 실행화면

 

 

◎ 패킹 및 난독화 여부 확인

 

[그림 2] PEiD


 

● CodeEngn Basic RCE L04 분석 및 풀이

 

[그림 3] 디버거 - OllyDbg / 디버기 - 04.exe (Basic RCE L04 실행파일)

 

디버거를 탐지하는 함수를 찾기 위해 [Animate Step Over(Ctrl + F8)] 명령을 진행하다 보면 중간에 멈추고, CMD화면에 '디버깅 당함'을 출력합니다.

 

[그림 4] [00408454]에서 멈춤

 

CALL 0040100F에 [Step Into(F7)]하여 진행하다보면 IsDebuggerPresent 함수를 발견하게 됩니다.

(함수 이름으로 IsDebuggerPresent 함수가 디버거를 탐지하는 함수라는 것을 알 수 있습니다.)

 

[그림 5] IsDebuggerPresent 함수 발견

 

[Step Over(F8)]로 진행하면, 00401074의 CALL 함수에서 '디버깅 당함'을 출력하는 것을 볼 수 있습니다.

 

[그림 6] 디버깅 당함 출력

 

[그림 6]을 보면 [0040106D]는 분기점이며, [CALL 00408190]은 CMD창에 출력하는 함수로 예상됩니다.

또한 00431024에는 '디버깅당함', 0043101C에는 '정상'이 있을 것으로 예상됩니다.

 

Dump window에서 확인해 보면 해당 ASCII를 확인할 수 있습니다.

[그림 7] '디버깅 당함' 확인
[그림 8] '정상' 확인

 

따라서, 분기점 위의 [00408210] 와 IsDebuggerPresent 중에 디버거를 탐지하는 함수가 있다는 것을 추측 가능합니다.

 


◎ CALL 00408210

 

[그림 9] RETN

[CALL 00408210]에서는 바로 RETN 되어서 나오는 것이 확인됩다.

 

 

◎ IsDebuggerPresent

[그림 10] IsDebuggerPresent의 반환 값 1

IsDebuggerPresent의 반환 값은 1은 디버거에서 실행 중을 의미하고, 0은 디버거에서 실행 중이 아님을 의미합니다.

 

[그림 11] IsDebuggerPresent 함수의 반환 값 {출처:MSDN)

 


+α IsDebuggerPresent 우회

 

IsDebuggerPresent 우회하는 2가지 방법

  1. 반환 값을 0으로 변경
  2. IsDebuggerPresent 함수를 MOV EAX, 0으로 패치

 

1. 리턴 값을 0 으로 변경

 

[그림 12] IsDebuggerPresent의 반환 값을 0으로 변경한 경우

 

매번 변경해 주어야 되기 때문에 L04 문제처럼 반복해서 IsDebuggerPresent 함수에 접근하는 경우, 다른 방법을 추천합니다.

 

 

2. IsDebuggerPresent 함수를 MOV EAX, 0으로 패치

 

[그림 13] MOV EAX, 0으로 패치한 경우

 

기존의 IsDebuggerPresent Code가 6Byte이었기에, 1Byte가 NOP으로 대체됩니다.

 

[그림 14] 패치 후 정상 확인