Never Stop Running
[CodeEngn] BASIC 04 본문
* 리버싱 공부를 위한 문제풀이로
정답을 찾는 것과는 조금 다를 수 있습니다.
[CodeEngn] BASIC 04
문제 풀이 환경 |
Windows 10 / Intel / x32dbg / HanConv |
문제 URL |
BASIC 4번 문제.
문제는 디버거를 탐지하는 함수명을 찾는 것이다.
일단 실행시키면 정상이라는 문구가 계속 나온다.
일단 저 문구가 나오는 곳을 찾아본다. 저 문자가 while문으로 계속 나타나기 때문에 어떤 함수에 딱 멈추게 된다. 그러므로 F9를 눌러서 멈추면 그 때부터 문자열이 계속 나온다.
디버깅중이기 때문에 '디버깅 당함'이라는 문구가 계속 나타난다. 그래서 이쪽에 Break Point를 걸었다.
다시 시작하여 함수를 실행시키지 말고 F7을 이용해 내부로 들어갔다.
내부 코드는 이렇게 되어있었다.
함수명 자체가 일단 IsDebuggerPresent이기 때문에 여기서 디버거를 탐지한다고 생각했다.
IsDebuggerPresent 함수 지나기 전에는 EAX가 0이더니 함수가 지나고 나서는 EAX가 1이 되었다. 그리고 JE문 전에 CMP로 EAX를 TEST하기 때문에 이 함수가 디버거를 탐지한다는 것을 확실시할 수 있었다.
EAX와 EAX를 TEST하는데 TEST는 두개의 연산자를 AND시키기 때문에 동일 값을 TEST 하면 그 값이 그대로 나타난다. 따라서 현재 EAX는 1이기 때문에 TEST한 결과도 1이고, ZF는 0으로 세팅된다.
지난번 포스팅에서 말했듯 JE는 ZF가 1일 경우 실행되므로 현재 JE가 활성화되지 않았다.
그리고 여기 CALL하여 함수를 부르기 전에 보면 431024 주소의 문자열을 스택에 넣는다.
스택에 넣는 문자열은 '디버깅 당함'이다.
같은 함수를 부르지만 다른 문자열을 넣는 코드를 확인해보았다. 43101C 주소의 문자열을 넣는다.
이것은 '정상'이라는 문자열이다. 즉, JE를 활성화 시켜 아래의 문자열이 나타나게 해야한다는 뜻이다.
이렇게 JE가 활성화되지 않을 경우 '디버깅 당함'이라는 문구가 뜨게 된다.
따라서 우리는 EAX 값을 바꾸거나, 조건문을 바꾸는 방법, 리턴값을 바꾸는 방법 등을 사용할 수 있다.
첫번째, IsDebuggerPresent 함수 지나고 1로 변한 EAX값을 다시 0으로 바꿔준다.
JE문이 활성화된다.
정상 문구가 출력되었다.
두번째, ZF를 1로 바꿔주었을 때도 JE문이 활성화되었다.
세번째, JNE로 바꿔주면 ZF가 0일 경우 점프하므로 JNE문이 활성화된다.
네번째, IsDebuggerPresent 함수 내부로 들어가보자.
IsDebuggerPresent 함수 내부코드이다.
무슨 주소를 eax에 받아오고 다시 [eax+2]의 값을 eax에 넣는다.
[eax+2]의 값은 1이고 1이 eax에 들어간다는 것을 알 수 있다.
[eax+2] = [003C5002]이고 이 주소의 값은 1인 것을 확인할 수 있다.
그래서 [003C5003]에 있는 0의 값을 eax에 넣고자 코드를 [eax+3]으로 수정하였다.
EAX에는 원하는 0의 값이 들어갔다.
JE문도 잘 활성화되었다.
'Training > Codeengn' 카테고리의 다른 글
[CodeEngn] BASIC 06 (0) | 2018.09.24 |
---|---|
[CodeEngn] BASIC 05 (0) | 2018.09.24 |
[CodeEngn] BASIC 03 (2) | 2018.09.24 |
[CodeEngn] BASIC 02 (0) | 2018.09.24 |
[CodeEngn] BASIC 01 (0) | 2018.09.24 |