NOTICE



“코드엔진_Challenges : Basic 04” 풀이입니다.


어떤 분이 질문하셔서 알려드리는 차에 다른 분들도 참고하십사 정리합니다.

 


 문제들이 올라와있는 주소도 같이 남기겠습니다.




 먼저 파일을 다운로드 받고 실행시켜봤습니다. “정상”이라는 문자열이 반복 출력됩니다.


 

 디버거를 사용해서 실행해보니 “디버깅 당함”이라고 출력되네요. 아마도 이 문제를 해결하는게 과제인듯 합니다.


 

 문제 파일의 Stub 코드를 살펴보면 메인함수 호출지점을 확인할 수 있습니다. 


 

 메인함수 코드입니다. 전체적인 흐름은 다음과 같습니다.

 


 하나씩 살펴보겠습니다. 먼저 Sleep( )을 호출해서 일정 시간 딜레이를 걸고 IsDebuggerPresent( )를 호출합니다. 



 

 IsDebuggerPresent( )는 프로세스의 디버깅 여부를 확인할 수 있는 함수입니다. 호출 리턴 값으로 파악할 수 있습니다.



 함수 호출에 대한 리턴 값은 EAX 레지스트리에 저장됩니다. 다음은 EAX 값을 확인하고 그 결과에 따라 조건 점프하는 코드입니다. 그 결과 커멘드창에 출력되는 값이 달라집니다.



① Debugged

 디버깅 당한다고 판단되면 실행되는 코드입니다. printf( )를 호출하네요. 출력되는 문자열은 “디버깅 당함”입니다.



 

 Non Debugged

 디버깅 당하지 않는다고 판단되면 다음 코드가 실행됩니다. 이 또한 역시 printf( ) 호출입니다. 출력되는 문자열은 “정상”입니다.



 

 문자열이 출력되고 나면 점프코드에 의해 코드 흐름이 Sleep() 호출 이전으로 이동됩니다. 그 결과 문자열이 반복 출력됩니다.



※ 디버깅 여부에 상관없이 “정상” 문자열을 출력하고 싶다면?

 코드 흐름을 변경하는 방법은 다양합니다. 그 중에서 한가지 방법은 조건 점프 명령을 적절히 수정하는 것입니다. 이 파일의 경우 “JE"를 JMP” 명령으로 변경하면 간단하게 해결됩니다.




 이상으로 "[17.10.11] 코드엔진_Challenges : Basic 04 풀이"를 마치겠습니다.