#About


Author : CodeEngn


Korean :

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


English :

This program can detect debuggers. Find out the name of the debugger detecting function the program uses.




#Contents

해당 문제는 디버거를 탐지하는 함수명을 찾을 수 있는가에 대한 물음이지만 

더불어 디버거로 프로그램을 열더라도 정상이라는 문구를 출력시키는것을 목표로함




#Solution


[그림 1] - 파일을 실행했을 때 정상이라는 문구 출력


[그림 2] - 디버거로 열고 실행했을 때 디버깅 당함이라는 문구 출력


[그림 3] - All intermodular calls 옵션 사용


디버거를 탐지하는 기능을 구현한 함수를 찾기위해 Search for > All intermodular calls 옵션을 사용

[그림 4] - IsDebuggerPresent 함수 확인



검색 결과 IsDebuggerPresent() 함수는 kernel32.dll에 export되는 함수이며 디버깅을 체크하는 MS에서 공식적으로 지원하는 안티리버싱 API이다.

해당 프로세스가 디버깅을 당하고 있는지에 대한 여부를 PEB구조체의 디버깅 상태값을 확인하며 디버깅을 당하고 있다면 1을 아닐 경우 0을 리턴함 


또한 IsDebuggerPresent() 함수는 내부적으로 TEB(Thread Environment Block)와 PEB(Process Environment Block)을 이용하며

PEB내의 Begin Debugger라는 멤버의 값을 기준으로 유저모드 디버거에 의해 디버깅을 판단한다


# TEB(Thread Environment Block)

- 프로세스에서 실행되는 스레드에 대한 정보를 담고 있는 구조체

- TIB(Thread Information Block)라고도 한다

- TEB 구조체는 OS마다 달라진다 (Windows7의 경우 Windows XP SP3 보다 확장)

- 시작 주소 : FS:[0x00], FS:[0x18](유저모드)


# PEB(Process Environment Block)

- 프로세스의 정보를 저장하는 구조체

- PEB 구조체는 OS마다 달라진다 (Windows7의 경우 Windows XP SP3 보다 확장)

- 시작주소는 OS마다 다르다 (SP2미만 = 0x7FFDF000, SP2이상 = fs:[0x30], Windows7 유저모드 = fs:[0x30], fs:[0x18])


PEB와 TEB모두 커널모드에서는 존재하지 않고 모두 유저모드 프로세스 하나당, 유저모드 스레드 하나당 존재하게 됨


typedef struct _PEB {

BYTE                            Reserved1[2];

BYTE                            BeingDebugged;

BYTE                            Reserved2[1];

BYTE                            Reserved3[2];

PREB_LDR_DATA                   Ldr;

PRTL_USER_PROCESS_PARAMETERS    ProcessParameters;

BYTE                            Reserved4[104];

PVOID                           Reserved5[52];

PPS_POST_PROCESS_INIT_ROUTINE   PostProcessInitRoutine;

BYTE                            Reserved6[128];

PVOID                           Reserved7[1];

ULONG                           SessionId;

}   PEB, *PPEB;

PEB 구조체


[그림 5] - IsDebuggerPresent() 함수


[그림 6] - IsDebuggerPresent() 함수 내부 진입


해당 함수 내부로 진입하게 되면 4줄의 코드로 간단하게 구성되어 있다. TEB영역의 0x18번지를 EAX에 담고

다시 EAX기준으로 오프셋 0x30의 번지를 가져오며, 이렇게 두 줄을 실행하게 되면 PEB구조체의 처음을 가르키게 된다

다음으로 EAX+2는 PEB구조체의 오프셋 0x02에 위치하는 멤버 변수인 BeingDebugged의 값을 EAX에 담고 함수를 종료함


(출처 : c0mb.tistory.com/71)


해당 문제에서 요구하는 것은 디버거를 탐지하는 함수의 이름이지만 더 나아가 해당 함수를 우회하는

즉, 안티디버깅 우회를 해봄으로써 이해의 척도를 높여보려고 한다


[그림 7]


IsDebuggerPresent() 함수 호출 뒤에 브레이크포인트를 걸어줌으로써 함수 호출까지는 진행하며 EAX 값을 보고

 BeingDebugged에 담긴 값이 1임을 알 수 있었고 해당 값으로 인해 디버깅 당함이라는 문구가 출력됨을 확인할 수 있었다

따라서 반환 값을 1이아닌 0으로 바꿔준다면 디버깅 상태라도 정상이라는 문구가 출력됨을 생각해볼 수 있다


[그림 8] - 1 > 0으로 값 변경


[그림 9] - 안티리버싱 우회


ㅋㅋㅋ... 다시 써야할듯;

'Wargame' 카테고리의 다른 글

CodeEngn Basic 6  (0) 2017.09.13
CodeEngn Basic 5  (0) 2017.09.08
CodeEngn Basic 3  (0) 2017.09.05
CodeEngn Basic 2  (0) 2017.09.04
CodeEngn Basic 1  (0) 2017.09.04

+ Recent posts