먼저 프로그램을 실행해보자
하드디스크를 CD-Rom으로 인식하게끔 만들라는 문구의 메시지박스가 출력된다
확인을 눌러보자
분석을 하기 위해 디버거로 Abex' crackme #1을 열어보자
원래같으면 main() 함수를 찾고, 문자열 참조를 하여 해당 주소로 분기해야하지만
EP점에 걸리자마자 엔트리포인트 근처를 보니 문자열이 나란히 존재한다
해당 프로그램의 구조를 간단히 설명하면 다음과 같다
1. 프로그램 실행 후 call <JMP.&MessageBoxA> 함수를 호출
2. call <JMP.&GetDriveTypeA> 함수 호출 후 cmp구문을 통해 eax와 esi를 비교 후 ZF(Zero Flag)값 대입
3. je 명령어로 eax와 esi 값이 같을 때 40103D 주소로 점프하고, 같지 않다면 그대로 401028주소의 push 0 을 실행
// je는 ZF가 1일때 해당 주소로 분기
처음 프로그램을 실행했을 때 Nah... This is not a CD-ROM Drive! 라는 메시지박스가 출력이 된 이유는
cmp eax, esi 를 통해 ZF 값이 0 이기 때문에 40103D를 분기하지 않고 다음 명령어로 들어가기 때문이다
크랙의 방법에는 여러가지가 있지만 본인의 입맛대로 해도 상관이 없다
우선 디버거를 다시시작 후 401026 주소에 BP를 걸고 디버깅을 해보자
BP점에서 레지스터값을 확인해보면
ZF가 0인것을 확인할 수 있다
이를 디버거 자체에서 1로 수정을 하고 디버깅을 하면
크랙에 성공한 것을 확인할 수 있다
하지만 이는 영구적인 패치가 아니기에 플래그 벨류를 수정하는 것이 아닌 점프구문을 수정하여 패치를 해보자
401026 주소의 명령어를 je에서 jne로 수정해주면 40103D 주소로 점프하게 된다 // jne는 ZF가 0일 때 점프
또는 무조건 점프인 jmp로 어셈블 해줘도 당연히 40103D를 분기하게 된다
'Reversing' 카테고리의 다른 글
PE File Format (0) | 2024.09.23 |
---|---|
Calling Convention (0) | 2024.09.23 |
Abex' crackme #2 Analysis (0) | 2024.09.20 |
Stack Frame (0) | 2024.09.13 |
Stack Operation Example (0) | 2024.09.12 |