Reversing/Reversing2017. 6. 27. 03:55

Abex’ crackme #1 분석

Crackme란 말 그대로 크랙 연습을 목적으로 작성되어 공개된 프로그램이다. 이런 Crackme들을 분석해보면 디버거와 디스어셈 코드에 익숙해질 수 있다. 그 중 Abex’ crackme는 매우 간단해서 초보자에게 알맞고, 아주 유명하기 때문에 풀이를 설명한 사이트가 매우 많다. , 자신의 풀이와 다른 사람의 풀이를 비교할 수 있다는 뜻이다.

 

디버깅을 시작하기 전에 파일을 실행시켜서 어떤 프로그램인지 확인한다.

HardDisk(HD) CD롬인 것처럼 인식시키라는 의미인 것 같다. 그냥 확인을 눌렀더니 다음과 같은 창이 떴다.

그러니까, CD롬인 것처럼 인식시키면 무언가 뜰 것 같다. OllyDbg에 로드하고 ‘Make me think your HD is a CD-Rom’ 문장이 보이는 곳까지 Step Into한다.

오른쪽에 디버거가 달아놓은 코멘트를 보면 아까 우리가 봤던 메시지들이 보인다. ‘C:\’를 스택에 PUSH 해준 후 GetDriveTypeA라는 함수를 부른다. 그 후 ESI EAX를 조금씩 조작해주고 두 레지스터 안에 있는 값을 비교해 같으면 아래로 점프, 다르면 그대로 에러 메시지를 출력하는 것을 볼 수 있다.

Step Into Step Over를 적절히 활용해주면서 레지스터의 값을 확인하면 Comment의 내용을 확인할 수 있다.

(위 사진과 비교해 달라진 Comment는 필자가 직접 달아준 것이다.)

여기서 우리가 JE문을 어떻게 우회할 지 생각해보자면, JE문을 아예 JMP문으로 바꿔버리거나, 혹은 CMP문이 나오기 전에 ESI의 값과 EAX의 값을 같도록 CMP 전에 EAX ESI의 값을 조작하는 명령을 생략해주면 된다.

먼저 JE문을 JMP문을 바꾸는 방법부터 해본다. Space JE문을 JMP로 바꿔준다.

그 후 Step Into를 실행해주면 다음과 같이 넘어가서 실행되는 것을 볼 수 있다.

두 번째 방법을 실행하기 위해서는 EAX 값을 DEC하는 명령을 생략하거나 ESI 값을 INC하는 명령을 생략한다. 이를 위해서 JMP문을 활용한다. 예시로 EAX 값을 DEC 하는 명령을 JMP로 생략해보았다.

생략하는 과정에서 일부 코드가 뭉개지는 것을 볼 수 있었는데, 적절히 수정하면 위와 같았다. 이렇게 수정한 것에 대해서도 JE를 수정했던 것과 같은 결과를 얻을 수 있었다.

이 과정에서 INC DEC에 들어가는 ESI EAX를 적절히 바꿔줘도 되겠다고 생각이 들었다. 그래서 다시 한 번 시도해보았다.

이렇게 고쳐주어도 결과는 옳게 출력되었다.

 

'Reversing > Reversing' 카테고리의 다른 글

Calling Convention (함수 호출 규약)  (0) 2017.07.02
Abex’ Crackme #2  (0) 2017.06.30
Stack Frame  (0) 2017.06.27
OllyDbg Commands & Assembly Basic & etc  (0) 2017.06.27
Hello, World! 디버깅하기  (0) 2017.06.26
Posted by BinZIP