외로운 Nova의 작업실
리버싱 입문 - 3(crackme3.exe) 본문
안녕하세요. 이번시간에는 crackme3.exe 파일을 크랙해보도록 하겠습니다. 아래 파일을 올려두겠습니다.
- 문제 인식
한번 실행시켜보겠습니다.
뭔가 keyfile을 체크해본다고 합니다. 확인을 눌러보겠습니다.
파일을 찾을 수 없다고 뜹니다. 이번 문제는 파일 인증에 관한 문제인 것 같습니다. 일단 먼저 파일을 어떻게 인증하는지 리버싱을 통해 알아보고 분기문을 우회하여 크랙판을 만들어보겠습니다.
- 리버싱
먼저 step over로 call 함수를 기준으로 코드의 흐름을 분석해보겠습니다.
0040100E call 함수 : user32.messageboxA 함수로 첫번째 메시지 박스를 출력해냅니다.
004010EA call 함수 : kernel32.createfileA 함수로 파일의 유무를 파악합니다. 아래 관련 자료입니다. 마지막으로 push한 인자가 abex.lc2 문자열의 주소인것으로보아 찾을 파일의 이름이 abex.lc2임을 알 수 있습니다. 또한 3번째로 push 한 인자가 3인것으로 보아 파일이 있는 경우에만 파일을 여는 설정을 한것을 알 수 있습니다. 만약 파일이 없다면 이 함수는 INVALID_HANDLE_VALUE 값을 return 하게되는데 이 값은 -1입니다. 그리고 리턴값은 eax로 들어가게됩니다. 이후 eax값을 비교해서 만약 파일이 없다면 분기하게 됩니다.
https://learn.microsoft.com/ko-kr/windows/win32/api/fileapi/nf-fileapi-createfilea
00401041 call 함수 : kernel32.getfilesize 함수로 file의 키파일이 유효한지 확인하는 것 같습니다. 이 함수는 파일의 크기를 반환하는 함수로 파일의 크기를 eax에 전달합니다. 이후 cmp eax, 12라는 명령을 이용해 파일의 크기가 12라면 정상적인 파일임을 인증하고 만약 아니라면 정상적이지 않은 파일로 인증을 실패하게됩니다. 이때 12는 16진수의 12로 10진수로하면 18바이트의 크기임을 알 수 있습니다.
https://learn.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-getfilesize
00401088 call 함수 : kernel32.exitprocess 함수로 해당 프로세스를 종료합니다.
위에서 알아낸 사항을 통해 한번 파일을 abex.l2c로 만들고 크기를 18바이트로 맞춰보겠습니다.
파일을 만들고
18바이트를 위해 숫자로 18개를 써줍니다.
18바이트인지 한번 확인해주고 이제 crackme3.exe 파일을 실행시켜보겠습니다.
정상적으로 키파일이 인증되었습니다.
- crack
이제 크랙판을 만들어보겠습니다.
파일을 찾고 없다면 cmp eax, -1을 하여 JE(같으면 점프 = 제로플래그가 1일때)구문을 통해 분기하고 있습니다. 이를 우회하기위해 cmp eax,1 부분을 TEST eax,eax로 변경해줍니다. createfileA의 리턴값이 0이 되지않기에 제로플래그는 항상 0이되며 분기되지 않을겁니다.
이제 파일의 유효성 검사하는 부분을 우회해보겠습니다.
CMP eax, 12를 통해 JNE(같지않으면 점프, 제로플래그가 0이면 점프)로 분기하고 있습니다. 이를 우회하기위해 CMP EAX, EAX으로 항상 같게 만들어줍니다.
이제 크랙판을 추출해줍니다.
abex.l2c 파일을 없애고 해당 크랙판을 실행시켜보겠습니다.
인증 우회를 잘 하는것을 확인할 수 있습니다.
'Computer App Penetesting > Reversing' 카테고리의 다른 글
리버싱 입문 - 6(rena 15강) (0) | 2022.12.16 |
---|---|
리버싱 입문 - 5(crackme5.exe) (0) | 2022.12.14 |
리버싱 입문 - 4(crackme4.exe) (0) | 2022.12.10 |
리버싱 입문 - 2(crackme2.exe) (0) | 2022.12.07 |
리버싱 입문 - 1(crackme1.exe) (0) | 2022.11.30 |