시작은 크랙미부터
글을 써보기 위해서 이래저래 크랙미 버전들을 찾아봤는데
적당한 난이도의 크랙미들도 많더군요. 기존에 썼던 내용들을 최대한
써가면서 풀어보는 게 실력 쌓는 데에 도움이 많이 될 거라 생각합니다.
* Ollydbg(올리디버거)를 사용해도 되지 않나요? 대체로 크랙미 글들을 보면 Ollydbg로 한 게 많던데요?
이 부분에 대한 대답은 당장 보안이 약한 프로그램은 Ollydbg를 쓰든 Cheat Engine을 쓰든 큰 상관없습니다.
그런데 대체로 최소한의 보안인 패킹이 들어가게 되면 Ollydbg로는 그 패킹을 풀어야 프로그램이 실행되는데
언패킹이라는 과정을 거쳐야 합니다.
즉 Ollydbg는 프로그램이 실행된 상태가 아닌 정적인 상태에서 프로그램을 보는 것이고
Cheat Engine은 프로그램이 실행돼서 패킹이 풀리고 동적인 상태에서 프로그램을 보는 것이라
패킹된 프로그램을 직접적으로 볼 수 있는 장점이 있습니다.
그래서 필자는 웬만하면 Cheat Engine과 다른 프로그램의 조합으로 보는 편입니다.
IDA Pro 같은 경우는 정품이 매우 비싼 편이라 초보자에게 권장되는 프로그램은 아니라고
생각해서 당분간은 패스할 예정입니다.
약간 서론이 길어졌는데 시작해 보겠습니다.
항상 프로그램 동작 현상을 살펴보자
그냥 빈칸에 잠금 해제코드를 입력하라고 합니다.
옛날에 스타크래프트 CD키 넣는 거 크랙 하는 느낌이네요.. ㅋㅋㅋㅋ
우선 그냥 아무 숫자나 넣고 체크 눌러봅시다.
무슨 문구가 떴습니다.
코드가 틀렸으니까 다시 시도를 하라는 뜻인 거 같네요.
이게 수준이 쪼금 있는 크랙미라면 이 메시지박스 확인 누르면 프로그램을 종료시킨다던가
이런 식으로 기본적인 리버싱을 방해할 텐데 그런 건 없는 거 같습니다.
"You've entered an invalid unlock code. Please try again!" 이 문구 자체를
한 번 String으로 스캔을 해봅시다.
바로 나오네요. 그러면 이걸 이전글 때처럼 Assembly Scan을 통해서
이 주소를 사용하는 명령어가 어딨는지 찾아봅시다.
만약 처음 보시거나 잊으신 분은 밑의 이전글 한번 읽어보시면 방법이 있습니다.
한 번 명령어들을 쭉 살펴봅시다.
우선 eax가 0일 때 점프를 하는 거 봐서는 0이 틀렸다는 결괏값인 거 같습니다.
그러면 이 부분에서 살짝 위를 보면 결괏값을 도출해 내는 함수나 계산이 있을 걸로 보입니다.
검은색 박스로 친 곳이 call due-cm1.exe+11C1 이 부분에서 프로그램 제작자가 원하는
값을 넣었는지 안 넣었는지 검사를 하는 함수인 것으로 추측을 할 수 있습니다.
빨간색 박스로 친 박스는 이 함수 검사에 필요한 재료들로 생각을 하시면 되고요.
물론 cmp eax,00 밑의 je 조건문을 바꿔도 되고 call due-cm1.exe+11c1을 mov eax,1
이런 식으로 바꿔도 해결은 완료가 될 거예요.
하지만 이렇게만 보고 끝내기보다는 정확한 답까지 찾아보면 완벽하게 이 프로그램을
정복했다고 볼 수 있을 것입니다. 정확한 답까지 찾아보죠.
위 검사하는 함수 주소인 due-cm1.exe+11c1 쪽에 디버깅을 걸어봤습니다.
밑의 조건에 따라 eax가 1이냐 0이냐로 바뀌는데 1이면 정확한 답을 썼다고 볼 수 있겠네요.
그러면 이 repe cmpsb가 뭔 명령어인지를 알아야 하겠죠.
repe라 함은 repeat equal, ZF가 0이거나 ecx가 0이라면 멈추라는 의미예요.
그러니까 지네가 만들어놓은 문구가 있을 텐데 그 문구의 문자열 1개씩 비교해 가면서
같은지를 검사한다 정도로 이해하시면 될 거 같아요.
근데 숫자로 하나씩 체크 눌러가면서 체인지 스캔 하시다 보면 004020F7의 주소를 발견하게 되실 겁니다.
이 주소는 아까 위의 스샷에서 빨간색 박스를 보시면 똑같은 걸 알 수 있습니다.
due-cm1.exe+114E - 68 D3204000 - push due-cm1.exe+20D3 { ("{aexdm&kzikcem&<&fmjam{&jq&l}mda{|") } < 이게 정답
due-cm1.exe+1153 - 68 F7204000 - push due-cm1.exe+20F7 { (60) } < 이 주소가 내가 입력한걸 넣는 곳
due-cm1.exe+1158 - E8 64000000 - call due-cm1.exe+11C1
이러면 이제 대충 감이 오실겁니다.
표시한대로 정답과 내가 입력한걸 비교한다 < 이렇게 해석을 하면 제일 자연스럽겠죠?
근데 문구가 뭔가 이상합니다. 뭔 거지같은 문구로 되있는데 저걸 복사해서 넣어도 정답은 아니에요.
즉 이 문구를 암호화 시켜놨다는겁니다.
문구 암호화는 리버서를 방해하는 요소 중 하나로 자주 등장하기 때문에 잘 체크 하는게 좋습니다.
그러면 이 부분에 디버깅을 걸고 아무 숫자 쓰고 체크를 눌러보죠.
내가 입력하는 곳에다가 디버깅을 걸었을 때(Data BreakPoint) API가 나옵니다.
GetWindowTextA는 내가 입력한 문자를 보내고 있는 함수로 보면 되겠죠.
Return Address 쪽에 보시면 due-cm1.exe+110C가 있습니다. 이를 눌러봅시다.
제가 눌러놓은 xor eax,eax 위가 GetWindowTextA 쪽을 호출하는 곳이고
밑 부분을 보면 xor 하면서 뭔가 장난질을 하고 있습니다. 이게 이 프로그램에서
문구를 암호화 하는 방식인거죠.
입력값 xor 43 xor 1E xor 55 이 식인데 xor은 동일한 연산을 하게 되면
다시 원래의 값으로 돌아오는 특징이 있습니다. 이를 이용해서 역산 해주면 됩니다.
7B 61 65 78 64 6D 26 6B 7A 69 6B 63 65 6D 26 3C 26 66 6D 7F 6A 61 6D 7B 26 6A 71 26 6C 7D 6D 64 61 7B 7C 00 39 00 3B 00 63 28 65 6D 28 3C 28 66 6D 7F 6A 61 6D 7B 28 6A 71 28 6C 7D 6D 64 61 7B 7C 00 65 6C 69 73 74
즉 첫 시작인 7B가 암호화된 상태니까 역으로 7B xor 55 xor 1E xor 43
이런식으로 계산기에 두들기면서 진행 해보면 답이 나옵니다. 이 노가다가 싫다면
코딩으로 하든 이전글에서 스크립트로 진행을 하든 하면 답을 도출해낼 수 있습니다.
저희는 스크립트로 한 번 진행을 해보도록 하죠.
우선 이 정답이 접근하는 어셈은 이 주소쪽입니다. 그러면 이 주소쪽에다가 스크립트를 박아서
다른곳에다가 역산하는 식으로 만들어보면 될거 같습니다.
이런식으로 간단하게 역산하는 식을 짰습니다.
이 경우 암호화 된 문구가 있는 이 주소에다가 덮어씌우는 식으로 진행을 하였습니다.
due-cm1.exe+114E - 68 D3204000 - push due-cm1.exe+20D3 { ("{aexdm&kzikcem&<&fmjam{&jq&l}mda{|") } <<
그러면 저 스크립트를 적용하고 난 뒤에 어떤 결과가 나왔는지 볼까요?
다음과 같이 역산이 되어서 정상적인 단어가 나온 것을 볼 수 있습니다.
simple.crackme.4.newbies.by.duelist.9 < 이 문구가 정답이라고 나옵니다.
그러면 이 문구를 넣어서 정답인지 확인을 해보죠.
성공했다고 하네요.
뭐 해결을 했으면 이메일 보내달라 이런 뜻인지는 모르겠는데 아무튼 끝났습니다.
한 번 천천히 해보실 분들은 한 번 도전해보시기 바랍니다.
밑에 파일 첨부 해놨습니다.
'Reversing & Cheat Engine' 카테고리의 다른 글
11. 크랙미 두 번째 (0) | 2024.02.25 |
---|---|
10. 리버싱의 꽃 후킹(Hooking) (0) | 2024.02.24 |
8. API 함수를 통한 리버싱 & 크랙 (0) | 2024.02.22 |
7. 치엔 게임 튜토리얼 Step 3 (0) | 2024.02.20 |
6. 어셈 명령어 (0) | 2024.02.19 |