code engn basic 4번 문제다.

디버거 탐지 함수를 찾아야 하는 것 같다. 파일부터 다운받아보자.

다운받아 실행해보니 정상이라는 표시가 뜬다.

올리디버거로 실행해보니 디버거를 탐지하는지 디버깅 당함이라는 메시지가 나온다.

그렇다면 이를 우회하는 함수를 찾고 실제로 우회를 할 수 있도록 코드를 바꿔버리면 될 것 같다.

오른쪽 클릭- Search for- All intermodular calls에서 함수이름들을 검색해보자.

리버싱에서는 함수이름들에 대한 감각이 중요한 것 같다. 대충 봐도 IsDebuggerPreSent란 함수가 상당

히 의심 스럽다. 더블클릭해서 실행 위치로 들어가보자.

함수에 BP를 걸고 F8로 하나씩 실행을 시켜봤다. 그랬더니 CALL 0040890 부분에서 디버깅 당함이라

는 메시지가 출력된다. 그리고 JMP SHORT 0040108B를 통해 JMP SHORT 00401048 가 호출되고

00401048 번지부터 sleep함수 후 다시 IsDebuggerPresent 함수가 실행되어 무한루프 형식으로 실행

되고 있었다.

그렇다면 직감적으로 프로그램 흐름상 실행되지 않고 있는 0040107E, 00401083, 00401088번지에

서 정상 출력값이 나올 것 같다. 그렇다면 저 곳으로 들어가야 하는데 그럼 JE SHORT 0040107E함수에

서 조건이 참이 되야 하므로 TEST EAX,EAX가 참이면 될 것 같다. TEST란 명령어를 몰라 찾아 봤더니

CMP랑 비슷한데 두 개의 Operand를 연산시키는 명령어인 것 같다. 이를 통한다면 0 0 인 경우를 알아

낼 수 있을 것이다. F8로 자세히 보니 비정상인 경우 EAX값에 1이 들어갔다. 그렇다면 이 값을 0으로 바

꿔준다면 원하는 결과를 얻을 수 있을 것 같다. 그렇다면 언제 EAX값을 0으로 넣어줄까 하면서 하나씩

돌려보니 함수호출후에 EAX값이 1로 반환된다. 아마 이 함수의 리턴 값이 정상이면 0 비정상이면 1을

출력하는 것 같다. 그렇다면 비정상일 때 함수 호출 후 반환된 EAX의 1값을 0으로 바꿔 TEST를 진행 시

키면 정상적으로 값이 출력될 것 같다.

실제로 돌려보니 JE SHORT 0040107E 에서 0040107C번지로 넘어가 CALL 00408190이 실행되어

정상적으로 우회가 가능하였다.

다 풀고 찾아보니 문제를 통해 추측했던것처럼 IsDebuggerPreSent 함수가 정상일때 0 비정상일때 1값

을 출력하는 함수가 맞았다. 처음부터 검색했으면 더 쉽게 문제는 풀었겠지만 코드하나하나 분석하면서

공부해가며 풀어 나름 시간이 걸렸던 문제였다.


'Wargame > CodeEngn' 카테고리의 다른 글

code engn basic 6번  (0) 2018.01.28
code engn basic 5번  (0) 2018.01.28
code engn basic 3번  (0) 2018.01.28
code engn basic 2번  (0) 2018.01.27
code Engn Basic 1번  (0) 2018.01.27
블로그 이미지

JeonYoungSin

메모 기록용 공간

,