Wargame/CodeEngn

[CodeEngn] Basic RCE L04

핏디 2021. 7. 22. 03:33
SMALL

[문제]

04.exe
0.23MB


[풀이]

프로그램을 실행시키면 정상이라는 문자열이 출력된다. 이외에는 특별한 것이 없으므로 ollydbg를 실행시켜보았다.

 

ollydbg에서 프로그램을 실행해보니(F9) 디버깅 당함이라는 문자열이 출력되는 것을 보아 안티디버깅이 적용되어 있는 것을 알 수 있다. 이에 한 줄씩 코드를 실행(F8)해보며 어떠한 과정을 거칠 때 디버깅 당함이라는 문자열이 출력되는지 확인해보았다.

 

프로그램을 실행하다보니 GetCommandLineA 라는 함수를 지나니 안티디버깅이 적용됨을 확인할 수 있었다. 이에 해당 함수 내부를 보기 위해 SetIn 과정을 수행하였다.

 

GetCommandLineA 함수 내부에서 코드를 실행해보니 CALL 04. 0040100F 호출 후 안티디버깅이 적용됨을 알 수 있었다. 이에 StepIn을 해보았다.

CALL 04. 0040100F 내부를 살펴보니 IsDebuggerPresent 함수가 실행되는 것을 알 수 있었다. 

-> 안티디버깅 함수

 

401048 에서부터 40107c에 도달하면 40108b로 jmp 하며 하나의 루프를 완성한다. 해당 과정을 무한히 반복하는 코드라고 할 수 있다. 

 

안티디버깅 코드를 예상해보면 다음과 같다.

while(1){
    sleep(1000);
    if (IsDebuggerPresent())
    	printf("디버깅 당함\n");
    else
        printf("정상\n");
}

또한, JMP 분기문을 기점으로 있는 Arg1 의 값들을 확인해보면 정상, 디버깅 당함이라는 문자열을 확인할 수 있다.

따라서 401048부터 40108b까지가 하나의 반복문 과정임을 알 수 있고, 해당 과정을 거칠 때 마다 디버깅 당함이라는 문자열이 출력됨을 확인할 수 있다.

 


* IsDebuggerPresent 안티디버깅 우회

1. IsDebuggerPresent함수 실행 후 EAX 값 변경

IsDebuggerPresent 함수를 호출하고 나면 EAX의 값이 1로 변해있다. (디버깅 당하고 있으면 1로 출력, 정상이면 0을 출력하기 때문!) 따라서 이 값을 0으로 변경해주면 정상으로 인식할 것!

Ollydbg에서 실행했을 경우 40106D로 이동하여 디버깅 당함이 출력되었는데, EAX 값을 0으로 바꾸니 40107E로 이동해 정상을 출력하고 있는 것을 확인할 수 있다.

 

2. TEST EAX, EAX -> CMP EAX, EAX

IsDebuggerPresent 함수를 호출 후에는 TEST EAX, EAX 연산을 통해 Zero Flag가 1이면 정상으로 인식하게 되는데,

현재 디버깅이 감지 되었기 때문에 ZF가 0이 되어있다. 

따라서 이 값을 1로 변경하기 위해서는 TEST 명령대신 CMP를 사용해주면 된다.

*CMP 는 두 피연산자의 값이 같을 경우 0이 되고 ZF가 1로 설정된다. 반대로 값이 다르다면 ZF가 0으로 설정된다.

 

EAX와 EAX를 비교하는 것은 항상 같은 값을 나타내기 때문에 CMP로 변경하게 되면 ZF의 값이 1로 출력될 것이다.

이후 프로그램을 다시 실행해보면 정상이라는 문구가 출력된다.

 


[핵심]

안티디버깅 -  IsDebuggerPresent

 

: 해당 프로세스가 디버깅을 당하고있는지의 여부를 PEB구조체의 디버깅 상태값을 확인하며 파악함.

(디버깅 당할때 리턴 값 = 1, 아닐경우 리턴 값 = 0)

-  커널모드의 디버거는 탐지하지 못하고, 유저모드의 디버거만 탐지가 가능.

- kernel32.dll에서 export되는 함수, 보통 프로그램의 보호차원에서 쓰이지만 우회방법이 많음.


[출처]

https://zrungee.tistory.com/56 [zrungee library]

 


 

LIST

'Wargame > CodeEngn' 카테고리의 다른 글

[CodeEngn] Basic RCE L09  (0) 2021.08.11
[CodeEngn] Basic RCE L08  (0) 2021.08.04
[CodeEngn] Basic RCE L07  (0) 2021.07.30
[CodeEngn] Basic RCE L05  (0) 2021.07.29
[CodeEngn] Basic RCE L03  (0) 2021.07.22