CodeEngn Write Up/Basic

CodeEngn Basic RCE L04 Write Up

서원근양학계정 2021. 9. 16. 19:57

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

https://ch.codeengn.com/

 

CodeEngn.com [코드엔진]

코드엔진은 국내 리버스엔지니어링 정보공유를 위해 2007년 부터 리버스엔지니어링 컨퍼런스 및 세미나, 워크숍을 현업 실무자들과 함께 운영하고 있는 비영리 커뮤니티입니다.

ch.codeengn.com

 

일단 Ollydbg로 문제를 열어보기 전에 실행시켜보겠습니다.

약 1초에 한 번씩 정상을 출력합니다.

 

이제 Ollydbg로 이 문제를 열어보겠습니다.

F9로 실행시켜보니 정상이 아니라 디버깅 당함이 출력됩니다.

 

저는 여기서 CodeEngn Basic RCE L01문제가 떠올랐습니다.

그 문제는 GetDriveTypeA라는 함수의 리턴값에 따라서 성공과 실패가 갈리는 문제입니다.

이 프로그램을 그냥 실행시켰을 때는 정상이 출력되지만 Ollydbg로 실행시켰을 때는 디버깅 당함이 출력되는 것을 보고 디버거가 켜져 있는지를 확인하는 함수가 있고 그 함수가 리턴하는 값에 따라서 출력되는 값이 달라지는 것이라고 생각했습니다.

 

그래서 함수 검색 기능을 이용해보았습니다.

함수 검색 기능은 Code Window를 우클릭하고 Search for - All intermodular calls으로 사용할 수 있습니다.

딱 보면 의심스러운 IsDebuggerPresent라는 함수가 보입니다.

더블클릭해서 함수가 있는 위치로 가보겠습니다.

 

1초를 기다린 후에 IsDebuggerPresent함수를 호출합니다.

함수가 실행된 후의 레지스터값을 보면 EAX가 1이 되어있습니다.

 

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

IsDebuggerPresent함수는 디버거가 켜져 있으면 1을, 아니면 0을 리턴하는 함수입니다.

그리고 TEST EAX, EAX를 통해서 EAX가 0인지 1인지 확인합니다.

TEST는 AND연산을 하는 명령어로 주로 값이 0인지 확인하는 역할을 합니다.

똑같은 값을 AND연산할 때 값이 0이면 결과도 0이 되고 ZF가 1이 됩니다.

ZF가 1이면 아래에 있는 JE명령어가 작동해서 성공메시지를 출력하는 곳으로 점프하고

아니면 실패메시지를 출력하게 됩니다.

 

이제 디버거가 켜져 있는 것과 상관없이 정상을 출력하게 코드를 조작해보겠습니다.

JE명령어가 작동하면 성공메시지를 출력하는 곳으로 점프하므로 

항상 JE명령어가 작동하게 하면 됩니다.

 

TEST EAX, EAX를 CMP EAX, EAX로 바꾸면 같은 값을 비교하기 때문에 ZF는 항상 1이 되고

항상 성공메시지를 출력하는 곳으로 점프하게 됩니다.

 

아니면 ZF가 1일 때만 점프하는 명령어인 JE를 항상 점프하는 명령어인 JMP로 바꿔주면 됩니다.

 

Flag: IsDebuggerPresent

'CodeEngn Write Up > Basic' 카테고리의 다른 글

CodeEngn Basic RCE L06 Write Up  (0) 2021.09.29
CodeEngn Basic RCE L05 Write Up  (0) 2021.09.23
CodeEngn Basic RCE L03 Write Up  (0) 2021.09.16
CodeEngn Basic RCE L02 Write Up  (0) 2021.09.16
CodeEngn Basic RCE L01 Write Up  (1) 2021.09.15