블로그 이전했습니다. https://jeongzero.oopy.io/
[CodeEngn] Basic RCE L04
본문 바로가기
워게임/CodeEngn

[CodeEngn] Basic RCE L04

728x90

문제 4. 

이 프로그램은 디버거 프로그램을 탐지하는 기능을 갖고 있다. 디버거를 탐지하는 함수의 이름은 무엇인가 

 

해당 프로그램은 디버거 프로그램을 탐지하는 기능을 가지고 있다고 한다.

 

올리디버거가 아닌 그냥 프로그램을 실행시키면 다음과 같이 동작한다.

 

 

화면에 정상이라는 문자열이 지속적으로 출력이 된다.

 

그렇다면 올리디버거로 해당 프로그램을 열어 동작시키면 어떻게 될까?

 

 

 

올리디버거로 프로그램을 연뒤 F9를 눌러 바로 실행시키면 위 사진과 같이 디버깅을 당했다고 뜬다.

 

 

나는 해당 문제를 다음과 같은 흐름으로 접근하였다.

 

1. API 모듈 목록을 확인하여 디버깅을 막는 함수를 찾는다(이름으로..)

 

2. 만약 해당 모듈이 찾아지면 해당 코드가 실행되는 위치로 가서 조작을 통해 디버깅이 가능하게 끔 조작한다.

 

 

 

 

 

문제풀이

 

 

마우스 우클릭 -> Serach for -> all intermoduler calls

 

를 통해 해당 프로그램이 참조하는 WINAPI를 확인 할 수 있다. 자세히 보다보면 중간쯤에 DebugBreak라는 API가 보인다.

 

해당 함수가 아마 디버깅을 체크하는 모듈로 판단되기때문에 더블클릭을 통해 함수가 실행되는 부분으로 들어가 보자.

 

 

더블 클릭을 하면 위 사진과 같이 나오게 된다. 사실 여기서 저 DebugBreak라는 모듈이 디버그를 체크하는 함수인줄 알저 위치에 브레이크 포인트를 걸고 실행시키면 다음과 같이 나온다.

 

 

 

IsDebuggerPresent 함수의 설명은 다음과 같다.

 

1. IsDebuggerPresent()을 이용한 감지 방법

윈도우에서는 기본적으로 디버거를 감지하기 위한 API를 제공합니다.

그 API는 IsDebuggerPresent()라는 이름의 API로, 아래와 같은 프로토타입을 갖습니다.

BOOL WINAPI IsDebuggerPresent(void);
반환값은 디버거의 존재 여부입니다.아래와 같이 코딩하면 디버거 발견시 프로그램이 꺼지게 할 수 있을것 입니다.Sysinternals에서 개발한 대부분의 프로그램에서는 아래와 같은 코드가 들어있었습니다.:

if(IsDebuggerPresent()){ExitProcess(1);}
이 방법의 장점은 OS에서 제공하는 메커니즘이므로 안전하다는 장점이 있지만, 단점으로는 너무 유명해서 대부분의 디버거의 플러그인에 의해 막힌다는 단점이 있습니다.

출처 : https://jinmo123.tistory.com/entry/Windows-어플리케이션-보안에-대해-알아보자-나는-내-프로그램이-크랙되는-것을-원치-않는다 [내 블로그]

 

 

2. IsDebuggerPresent() 원리

 

IsDebuggerPresent() 함수는 PEB 구조체의 BeingDebugged 값을 체크함으로써 현재 프로세스가 디버그 되고 있는지를 판단한다.

 

*PEB
- PEB(Process Environment Block)는 프로세스에 대한 정보를 담고 있는 구조체

 

PEB 구조체

 

 

이러한 디버그를 방지하는 방법을 안티 디버깅이라 한다.

 

 

안티 디버깅이란?

안티 디버깅이란 디버깅을 방지하고 분석을 하지 못하도록 하는 기술이다.

 

만약 리버싱을 통하여 프로그램이 정상적인 입력이 아니거나, 비밀번호 크랙 같은 방법으로 프로그램을 조작할 수 있을 것이다.

 

따라서 이러한 것을 막기 위하여 만약 프로그램이 디버깅을 당한다면 해당 디버그 프로그램을 종료시키거나 에러를 발생시키는 방법 등 다양한 방법을 사용하여 분석을 하지 못하게 한다.

 

안티 디버깅에는 static 과 dynamic 의 종류가 있는데 이는 차후에 깊게 공부해서 다시 정리를 할 생각이다.

 

 

 

결론 

 

결론은 IsDebuggerPresent() 함수의 리턴값을 적절히 조절하면 된다.

 

 

 

EAX값을 0으로 바꿔주면

 

 

 

 

정상으로 나오게 된다.

 

 

728x90

'워게임 > CodeEngn' 카테고리의 다른 글

[CodeEngn] Basic RCE L07  (0) 2020.12.28
[CodeEngn] Basic RCE L05  (0) 2019.05.17
[CodeEngn] Basic RCE L03  (0) 2019.05.16
[CodeEngn] Basic RCE L02  (0) 2019.05.16
[CodeEngn] Basic RCE L01  (0) 2019.05.16