CodeEngn [코드엔진] 사이트에서 초급단계로 분류되어 있는 문제다.
HDD를 CD-Rom으로 인식시키기 위해서는 GetDriveTypeA의 리턴값이 무엇이 되어야 하는지를 묻고있다.
우선 프로그램을 실행시켜보자.
프로그램 실행 모습
메세지박스 두개로 이루어져 있는 모습을 볼 수 있다.
CD-ROM이 아니라고 호소한다.
메모리를 보기 위해 다양한 디버거들이 존재 하지만, CheatEngine [치트엔진]을 사용해 크랙을 해보자
DarkByte 형님 생일이시군요 ?
치트엔진을 켰더니 제작자인 DarkByte 의 생일이라고 한다. (사진 캡쳐당시 7월 1일)
happy birthday darkbyte !
뜯어볼까
GetDriveTypeA 함수를 볼 수 있으며, 밑의 cmp eax, esi 를 통해 비교 후 je를 통해 성공메시지로 점프한다.
1) CMP : compare
값을 비교해서 같으면 zf flag를 1로 바꾼다. cmp 명령어의 경우 결과값을 eax에 다시 저장하지 않는다.
2) JE : Jump if Equal
값이 같다면 Jump 하는 명령어로, 파라미터로는 주소값만 가지므로 사용전에 값을 비교하는 명령어를 사용한다.
우선 GetDriveTypaA를 자세히 살펴보기 위해 msdn으로 들어가보자
각 반환값에 대한 설명을 볼 수 있다.
브레이크 포인트를 걸고 레지스터를 살펴보니 cmp 구문에 와서 eax는 3으로 바뀐다.
eax와 esi 값이 같지 않으니 당연히 JE 명령어가 실행되지 않을 것이다.
그렇다면 eax와 esi 의 값을 같게 만들어 주거나
JE 명령어를 다르게 패치한다면 크랙이 될 것이다.
방법 1. JE구문 패치
JE는 위에서 설명 했다시피 값이 같다면 점프하는 명령어다. 그렇다면 반대의 역할을 하는
JNE 명령어를 사용해보자
1. JNE : Jump if Not Equal
값이 다르다면 Jump하는 명령어로 JE 명령어와 반대의 역할을 한다.
74 JE 를 75 JNE로 변경해주자 그렇담 값이 달라도 성공 메시지박스로 점프할 것이다.
성공 메시지를 띄우는 모습을 볼 수 있다.
방법 2. 코드케이브 이용
코드케이브란 위와 같이 아무런 동작도 하지않는 빈 공간을 의미하는데
이러한 사용되지 않는 코드 영역에 어셈블리를 입력하고 수정할 부분에는
새롭게 입력한 어셈블리코드로 점프하도록 하는 방법이다.
그렇담 비어있는 이 공간에 어셈블리 코드를 작성해보자
왼쪽사진은 치트엔진의 오토어셈블리를 이용해 스크립트를 작성한 모습이다.
"CrackMe1.exe" + 1069 [ 00401069 ] 위치에
xor eax, eax
xor esi, esi
jmp CrackMe1.exe+1024
코드를 작성했다.
xor 명령어는 따로 설명하지 않겠다, 모두가 알고 있는 논리연산자이므로...
xor eax, eax 는 mov eax, 0과 같이 레지스터를 0으로 만들도록 동일한 명령을 수행한다.
그럼에도 xor 을 사용한 이유는 결과적으로 명령어의 크기도 짧을뿐더러 더 빠르다는 말이 있는데...
지금의 컴퓨터에서는 더 빠르다는 건 의미없거나 매우 미미하다고 한다.
xor eax, eax 31 C0 2Byte
mov eax, 0 B8 00000000 5Byte
xor의 경우 2바이트로, 명령어의 크기가 5바이트인 mov에 비해 크기가 작은 걸 알 수 있다.
0으로 초기화 할 일 있으면 그냥 xor 쓰면 된다.
eax와 esi를 0으로 변경해준 후, 비교구문으로 다시 돌아가도록 jmp 해주었다.
또한 cmp 구문전에 위에서 작성해둔 코드공간으로 점프하도록 변경한다.
EB 45 jmp CrackMe1.exe+1069
jmp 명령어의 경우 short jmp 인 EB와
5바이트의 E9 xxxxxxxx long jmp가 존재한다.
성공메시지를 띄우는 모습을 볼 수 있다.
'Reverse Engineering > [CodeEngn] Basic RCE' 카테고리의 다른 글
[Reversing] CodeEngn - Basic RCE L07 (0) | 2024.07.02 |
---|---|
[Reversing] CodeEngn - Basic RCE L06 (0) | 2024.07.02 |
[Reversing] CodeEngn - Basic RCE L05 (0) | 2024.07.02 |
[Reversing] CodeEngn - Basic RCE L04 (0) | 2024.07.02 |
[Reversing] CodeEngn - Basic RCE L03 풀이 (0) | 2024.07.02 |