맨위로

이 글은 코드엔진(http://codeengn.com/) 에서 제공하는 리버스 엔지니어링 관련 다양한 문제들을 풀어보면서 리버스 엔지니어링을 공부하는 목적으로 작성되었습니다. 이글을 작성하는 필자도 리버스 엔지니어링에 흥미를 가지고 공부하는 입장이므로 잘못된 내용이 있을수도 있습니다. 잘못된 내용이 있다면 댓글이나 방명록에 알려주세요 :)

Challenges : Basic 04


Author : CodeEngn

Korean : 

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

English : 

This program can detect debuggers. Find out the name of the debugger detecting function the program uses. 

문제를 확인해보니 안티디버깅(리버스 엔지니어링이나 디버깅을 방지하는 소프트웨어 기술)을 하는 함수의 이름을 찾으라는거 같군요. 일단 프로그램을 다운로드 한후 실행해보도록 하겠습니다. (참조 - http://stih.tistory.com/10)

프로그램을 보니 주기적으로 정상이라는 메시지를 출력하고 있습니다. 프로그램을 실행시켜봤으니 이제 올리디버거를 통해 열어보도록 하겠습니다.

올리디버거를 통해서 실행하니 "디버깅 당함" 이라는 메시지를 주기적으로 출력합니다. 프로그램을 확인했으니 올리디버거를 통해 코드 내용을 확인해보도록 하겠습니다. 모든 코드를 살펴본다는것을 불가능하니 핵심부분만 찾아서 흐름을 살펴보도록 하겠습니다.

먼저 올리디버거로 열어서 ctrl - f8 을이용해서 프로그램을 실행해보면 00408454 에서 멈추면서 "디버깅 당함" 을 출력하는것을 알수있습니다. 

이 흐름을 분석해보면 자세한 정보를 얻을수 있을테니 위의 주소에 BP(Break Point)를 설정하고 엔터키를 눌러서 더안으로 들어가 보도록하겠습니다.

안으로 들어와서 보니 0040104F ~ 0040108B를 반복적으로 실행하며 "디버깅 당함" 을 출력하는것을 알수있습니다. 즉 위의 반복 루틴이 디버깅을 탐지하는 중요한 부분이라는것을 알수있다. 여기서 호출하는 함수가 눈에 보이는것은 2개가 있는데 이중 하나인 Sleep 함수는 프로그램이 주기적으로 "디버깅 당함"을 1초마다 출력하는데 쓰이는 함수라는것을 알수있으니 다른 한 함수인 IsDebuggerPresent 함수가 디버깅을 탐지하는 함수라는것을 알수있다.(이름만 보아도 디버거관련 함수라는것을 알수있을것이다.)

이제 디버거를 탐지하는 함수를 알았으니 한번 이함수를 우회회해보기로하자. 일단 우회하기전에 이함수가 어떤식으로 작동하는지 알필요가있다. 다음이 IsDebuggerPresent 관련 정보이다.

여기서 살펴봐야 할것은 리턴값이다. 이함수는 디버깅 당하는 중일때 0이아닌수를 반환하고 디버깅 당하지않을때 0을 반환한다는것이다. 즉우리는 IsDebuggerPresent가 반환하는값을 0으로 수정하면 안티디버깅을 우회할수 있을것이다. 그러면 일단 IsDebuggerPresent가 반환하는 값이 무엇이지 확인해보자.

확인을 하기위해서 IsDebuggerPresent 함수(0040105E) 와 그아래 주소(00401064)에 BP를 설정하고 실행해보자. 실행결과 EAX 값이 변화는것을 알수 있었다.

EAX 값이 리턴값이라는것을 확인했으니 EAX 값을 0으로 바꾸면 안티디버깅이 우회되는것을 확인할수 있다.


EAX값을 직접 수정하는 방법외에도 코드를 수정하는 방법도 있으므로 한번 해보시는것도 좋을것같습니다.



Posted by STIH

댓글을 달아 주세요