파일 안에 있어야 할 데이터의 HEX값을 찾아야하는 문제입니다. 아래는 파일을 그냥 실행한 경우입니다. 아무것도 없는 파일이 실행됩니다.
파일을 올리디버거를 이용해 여시면 CreateFile 함수를 통해 파일에 접근하는 핸들을 리턴한 후 ReadFile을 통해 파일의 데이터를 불러는 것을 확인할 수 있습니다.
ReadFile 부분을 자세히 보시면 HEX로 12 즉 DEC로 18byte를 읽어오도록 설정하고 있습니다. 파일 호출이 끝난 다음에도 제대로 읽어왔는지 확인하고 있습니다. 분석을 위해 파일 안에 임의의 값으로 18byte를 채워넣고 실행해보겠습니다.
(크랙된 창에서 CodeEngn! 이 나타나는 걸로 봐서 파일을 통해 입력받는 듯합니다. 그래서 CodeEngn!이 포함된 문자열로 문제를 풀어보겠습니다.)
실행해보시면 아시겠지만 함수를 호출하고 나면 입력받은 문자열들의 값이 바뀌며 호출하기전엔 아무값도 없던 4020F9 주소의 값을 12345678 과 XOR 연산을 한 후 값을 비교하고 있습니다. 아래는 비교하는 곳까지 실행한 모습입니다.
제가 입력했던 문자열 끝의 4자리수를 받아 비교하는 것을 볼 수 있습니다. HEX editor를 이용해 값을 동일하게 수정한 후 실행한 모습입니다.
크랙에는 성공하였으나 정답과는 거리가 먼 화면입니다. 수정된 문자열이 창에 출력되는 듯 합니다. 값이 0x00이면 그 뒤는 처리되지 않고 그대로 놔두고 있습니다. 게다가 메시지 창에 출력시 느낌표하나가 추가되는 걸로 봐서 수정된 문자열이 CodeEngn 이 되도록 crackme3.key 파일의 내용을 수정해야겠습니다. 먼저 문자열을 수정하는 함수 내부로 들어가 어떻게 수정하는지 확인해보겠습니다.
함수 내부 코드입니다. 자세히 풀어보자면 [ESP+4]의 주소에 저장된 값(파일을 통해 입력받은 문자열이 저장된 곳입니다.) 에 대해 0x41 부터 0x4F까지 BL의 값을 증가시키면서 XOR연산으로 문자열을 수정하고 있습니다. 이는, CodeEngn을 입력하여 수정된 문자열을 crackme3.key 파일에 입력하면 이번에는 CodeEngn이 수정된 문자열로 나오게 된다는 뜻입니다. 이제 crackme3.key 파일을 알고리즘에 맞게 수정(가운데 5자리의 쓸모 없는 부분이 있습니다. 이 부분 때문에 정답이 여러 개가 나옵니다. 저는 전부 0x00이 되도록 수정하였습니다.) 시리얼 부분도 변경되기 때문에 맞춰서 변경해주세요
수정한 후 실행하면 성공입니다.