본문 바로가기

Hacking/[System] codeengn.com

[Basic RCE] L04

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

이번 문제는 디버거를 탐지하는 프로그램이며 해당 함수의 이름을 알아내야 한다.

정상적으로 해당 프로그램을 실행하였을 때 디버거가 탐지되지 않아 정상으로 출력되는 모습이다.

IDA를 통해 해당 프로그램을 열어보았다.

먼저 loc_401048의 push 3E8h를 10진수로 바꾸면 1000이 된다. 이것을 스택에 저장 후 Sleep을 콜하여
sleep(1000)이 되며 1초마다 해당 분기를 수행하게 된다.

그리고 IsDebuggerPresent 함수의 경우 Microsoft Docs에서 확인하였을 때

프로세스가 디버거의 컨텍스트에서 실행되고 있다면 반환값은 0이 아니게 되고
프로세스가 디버거의 컨텍스트에서 실행되고 있지 않다면 반환값은 0이 된다.

따라서 test eax, eax는 0이 반환되면 참이 되는 Instruction이므로 IsDebuggerPresent의 결과 값이 eax에 저장되고, eax가 0인지 확인하여 jz를 통해 분기할 것이라 볼 수 있다.

해당 분기문을 디버거를 통해 바꿔보도록 한다.

예상대로 디버거 컨텍스트에서 실행되므로 디버깅 당함이라는 메시지가 출력된다.

jz 분기문을 jnz로 수정하여 보았다.

정상으로 바뀌어 출력된다.

코드엔진 문제인 디버거를 탐지하는 함수는 IsDebuggerPresent가 된다.

'Hacking > [System] codeengn.com' 카테고리의 다른 글

[Basic RCE] L05  (0) 2019.07.19
[Basic RCE] L04  (0) 2019.07.19
[Basic RCE] L03  (0) 2019.07.13
[Basic RCE] L02  (0) 2019.07.07
[Basic RCE] L01  (0) 2019.06.30