• 문제파일 및 디버거
  • 문제분석
  • 문제풀이

 

 

 

[문제파일 및 디버거]

 

crackme5.exe
0.01MB
odbg110.zip
1.28MB

 

 

 

[문제분석]

파일을 더블 클릭해서 연후 아무 시리얼 키를 입력하고 check 버튼을 클릭했다.

 

시리얼 키가 정확하지 않다고 에러창이 뜬다.

 

올리디버거를 켜서 문제파일을 올려서 프로그램을 한번 실행시켜 봤다. 이전과 똑같이 실행됨을 알 수 있다.

 

어셈블리어를 분석해 보면 CMP를 통해 EAX와 0을 비교하여 EAX의 값이 0과 같지 않다면(ZF=0) 하나의 메모리 주소를 뛰어넘고 Error 메시지 창을 띄우는 것 같다.

 

EAX의 값이 0과 같다면 바로 다음 주소를 실행해서 00401117 메모리 주소로 뛰어넘어가 "Well Done!"이라는 메시지 창을 띄우는 것 같다. 따라서 "Well Done!" 메시지 창이 나오게 하는 게 이 문제의 핵심일 것이다.

 

 

 

[문제풀이]

해당 문제의 풀이에는 하기와 같은 3가지 접근방식이 존재한다.

 

<1. 올바른 시리얼키 찾기>

우선 시리얼키를 입력하는 창의 메모리 주소를 찾기 위해 F2로 브레이크포인트 설정을 하고 F9으로 그전단계까지 실행한 다음 F8로 한 단계씩 실행하는 방식을 사용했다. 

 

분석을 해보면 00401110 메모리 주소에서 시리얼키를 입력하는 메시지 창이 뜨며 오른쪽 주석창을 봤을 때 "L2C-5791" 문장에다 "6794-ABEX" 문장을 이어 붙이는 것을 확인했다. 그리고 마지막으로 사용자가 입력한 시리얼 값인 "1234"와 해당 " L2C-5791 6794-ABEX" 문장을 비교하고 있는 것을 알 수 있다. 즉 비교해서 일치하면 EAX가 0, 일치하지 않다면 1로 설정되는 것이다. 입력한 값가 다르기에 실행 결과 EAX의 값이 1로 설정되어 있는 것을 볼 수 있으며 입력한 값과  " L2C-5791 6794-ABEX" 문장을 비교하는 것으로 봤을 때 " L2C-5791 6794-ABEX" 이게 올바른 시리얼 값이라고 추측할 수 있다.

 

다시 시작해서 " L2C-5791 6794-ABEX"를 시리얼 값으로 넣었더니 올바른 시리얼 값을 넣었다고 뜨고 EAX가 0으로 설정된 것을 확인할 수 있다. 

 

 

< 2. 제로 플래그값 변조 우회>

시리얼 값을 "1234"로 입력 후 한 단계씩 디버깅해 가며 JE에 도달했을 때 다음으로 뛰어 넘어가기 위해 제로 플래그의 값을 더블 클릭해서 1로 바꾸고 계속 실행하면 "Well Done!" 쪽으로 뛰어넘어가 올바른 값이 입력되었다는 창이 뜬다.

 

 

<3. EAX값 변조 우회>

시리얼 값을 "1234"로 이력 후 한 단계씩 디버깅해 가며 CMP에 도달했을 때 EAX의 값을 클릭해 0으로 만들어서 EAX와 0이 일치하게 하여 다음 문장이 실행되고 결과적으로 "Well Done!" 쪽으로 뛰어넘어가 올바른 값이 입력되었다는 창이 뜬다.

+ Recent posts