도구 설치
문제를 풀기 앞서 문제를 풀기 위한 도구는 해당 사이트에서 다운받도록 합시다
1. x64dbg 설치
x64dbg는 64비트 플랫폼에서 실행되는 프로그램을 분석하고 디버깅하는 도구입니다 실제로 다운로드 받으면 x32와 x64 디버그가 설치됩니다
2. detect it easy 설치
해당 프로그램은 바이너리 파일의 분석 및 식별을 돕는 도구인데 쉽게 말해서 exe 파일이 어떤 형식으로 만들어졌는지 확인할 수 있다
abexcm1.exe
crackme 문제는 해당 사이트에서 abexcm1.exe 문제를 다운받아 주면 됩니다
다운받은 exe 파일을 실행하면 위와 같이 CD-Rom을 만들라는 메시지와 CD-Rom Drive가 아니라는 메시지 창이 순서대로 뜨는 걸 알 수 있다
die 프로그램으로 사전분석을 먼저 진행하면 32비트로 만들어진 걸 알 수 있다 그렇기에 x32dbg로 abexcm1.exe을 분석해 봅시다
dbg 구조를 간단하게 살펴보면 이런 식으로 구성되어 있다
기능(단축키) | 설명 |
F2 | Break Point(중단점 설정) |
F7 | 코드 순차 실행 (call의 경우 함수 내부 진입) |
F8 | 코드 순차 실행(call의 경우 함수 내부 진입X) |
F9 | 프로그램 실행 |
Ctrl + g | 메모리 주소 이동 |
-,+ | 이전 또는 다음 주소 이동 |
<enter> | 분기문에서 target 주소로 이동 |
<space> | 어셈블리 코드 수정 |
abexcm1.exe을 dbg에 넣고 F9를 누르면 EntryPoint가 존재하는 메인 함수까지 실행할 수 있습니다
EntryPoint : 프로그램에 시작 진입점을 뜻한다
어셈블리 코드 좌측에 문자열을 살펴보면 앞서 abexcm1.exe을 실행했을 때 나오는 메시지 문구를 확인할 수 있다
실제 1번 코드가 작동된 후 2번 코드가 작동이 되는데 여기서 2번 코드 말고 3번 코드가 작동되게 해야 한다
2번 코드 쪽 어셈블리어를 살펴보면 cmp로 eax와 esi 값을 비교하여 je 분기문을 사용하고 있다
여기서 어셈블리 코드 흐름을 알아보면 앞서 eax와 esi 레지스터 값을 확인하여 서로 같다면 je 분기문이 작동되어 "YEAH!" 부분에 메시지 창이 뜨는 코드로 점프하는 걸 알 수 있다
cmp eax, esi : eax와 esi 값을 비교하여 같으면 ZF 플래그를 1로 만드는 명령어이다
je : 이전 연산 결과가 같다면 설정된 부분으로 점프한다
그래서 실제로 eax와 esi 값을 확인하기 위해 F8를 눌러 점프 명령어까지 실행해 보니 eax와 esi값이 서로 달라 점프 구문이 작동되지 않는 걸 알 수 있다 그렇기 때문에 Error 메시지창이 나오게 됩니다
결과적으로 3번 코드 부분이 작동되기 위해서는 앞서 cmp 부분에 어셈블리 코드 수정이 필요합니다
cmp 부분에 <space>를 누르면 어셈블리 코드를 수정할 수 있게 되는데 cmp eax, eax로 바꿔주면 결국 eax와 eax 값이 서로 같기 때문에 je 분기문이 작동되어 "YEAH!" 메시지창을 확인할 수 있을 겁니다
또 다른 방식으로 je 분기문 코드를 JNE로 수정하는 방법이 있습니다
JNE : jump if Not Equal의 약어로 이전 연산의 결과가 서로 다른 경우에만 점프하는 코드입니다
앞서 eax와 esi 값은 서로 다르기 때문에 점프 구문이 작동되어 "YEAH!" 메시지창 코드가 작동되게 됩니다
코드 수정이 완료되면 dbg 상단에 반창고 아이콘을 눌러 파일 패치를 진행해 줍니다
이 파일 패치를 통해 우리가 수정한 어셈블리 코드로 프로그램을 적용시킬 수 있습니다
파일명은 자유롭게 설정하고 저장을 누르면 파일 패치가 완료됩니다
마지막으로 패치한 프로그램을 실행하면 정상적으로 YEAH! 메시지 창이 나오는 걸 알 수 있다
[ 참고 자료 ]