CodeEngn Basic04 풀이
Wargame | CTF/Reversing

CodeEngn Basic04 풀이

흠.. 벌써4단계군요.. 문제를 봐서는 전혀 감이 안옵니다. 디버거를 키면 어떤함수가 감지를 한다는거군요. 프로그램을 한번 실행시켜 보겠습니다. 

프로그램을 그냥 실행해보면 정상이라고 뜨네요 1초간격으로요. 음 그럼이제 올리디버거를 이용하여 프로그램을 열어보겠습니다.

올리디버거로 열고 Run을 하니 디버깅툴을 감지하네요. 자 이제 찬찬히 알아보도록 하겠습니다. 

생각으로는 시나 시쁠쁠로 작성된 코드같고 어떤 함수를 이용해 디버깅툴이 감지되면 문자열 출력함수를 이용하여 화면에 문자를 띄우는것같네요. 문자열을 출력하는 함수를 한번 찾아보겠습니다.

일단 메인함수 같은곳에 들어왔습니다. 비쥬얼스튜디오로 컴파일한 파일에서 흔히볼수있는 CCCCCCCCC로 초기화 하는 코드가 보입니다. 잘찾아 왔군요. 디버거를 찾는함수는 IsDebuggerPresent 인것 같네요.

함수를 지나서 TEST EAX,EAX 라는 코드가 보이실겁니다. TEST AND를하고 CMP는 뺄셈을 한다는 점에서 다릅니다. TEST는 플래그 비트만 바꿉니다. 제로플래그가 세트 되려면 EAX값이 0이 되야 됩니다. 현재는 디버거를 탐지하고 리턴값이 EAX에 저장된값인 1입니다. 

그래서 JE 코드가 실행되어 출력함수를 이용해 "디버깅탐지"라는 문자열이화면에 나타나게 됩니다. 코드엔진의 문제의 정답은 IsDebuggerPresent입니다. 함수가 어떻게 디버거를 탐지하는지 한번알아보겠습니다.

생각보다 코드가 엄청 짧네요. DWORD PTR FS:[30] 는 PEB(Process Environment Block) 구조체의 포인터를 가르킵니다. PEB구조체의 3번째 인자에 BeingDebugged가 위치해 있습니다.  이 인자의 주소는 FS:[30] +0x02 입니다. 디버깅 되고있을시 1로 세트됩니다. 그리고 리턴하여 함수를 끝냅니다. 음 디버깅하는걸 알지못하게 하는방법들을 생각해봅시다.

1. 디버깅함수를 거치지 않게한다.

2. 디버깅함수를 거친후에 EAX값을 0으로 바꿔주어 디버깅당하지 않는것처럼 한다.

3. 화면에 출력되는 문자열을 정상으로 바꾼다.

등이 있겠습니다. 

문제풀이 끝!



'Wargame | CTF > Reversing' 카테고리의 다른 글

CodeEngn Basic06 풀이  (0) 2017.08.21
CodeEngn Basic05 풀이  (0) 2017.08.16
CodeEngn Basic03 풀이  (0) 2017.08.09
CodeEngn Basic02 풀이  (0) 2017.08.09
CodeEngn Basic01 풀이  (0) 2017.08.09