문제 설명
Easy Crack을 실행하면 문자열을 입력받을 수 있는 창이 뜨고 확인을 누르면 문자열이 키와 맞는지 검증하는 프로그램이다.
Password가 틀렸을 경우 Incorrect Password라는 경고창을 띄운다.
flag값은 올바른 Password값이다.
문제 풀이
x64디버거를 사용하여 리버싱해보도록 하겠다.
처음에 실행하면 이런 화면이 뜬다.
f9번을 눌러 entry포인트로 진입하도록 하겠다.
라이센스 키를 검증하는 방법은 여러가지가 있지만 콜스택을 이용하여 검증부분을 찾는 방법을 선택하겠다.
첫 번째, f9번을 눌러 프로그램을 실행한 후 아무값이나 입력을 넣어서 경고창을 띄운다.
두 번째, 중지버튼을 누른다.
마지막 호출 스택에 들어간다.
호출 스택에 들어가면 최근에 불러온 easy_crackme.00401148을 확인할 수 있다.
여기 부분이 경고창을 띄우는 부분일것이라고 생각하고 더블클릭한다.
더블클릭하여 확인해보니 메시지박스 검증부분에 도달하였다. 주석을 보면 Incorrect Password와 Congratulation이라는 문자열을 확인할 수 있다.
Congratulation부분이 올바른 키값을 입력하였을 때 나오는 것을 알 수 있다.
먼저 이 함수부분의 젤 위로 들어가서 하나씩 살펴보겠다.
시작부근에 브레이크포인터를 건 후 살펴보겠다.
입력값으로 1234를 넣었다.
이 부근에서 esp+5의 값과 0x61과 비교를하고 있고 같지 않으면 실패부근으로 점프를 한다.
메모리에서 ctrl+g를 눌러 esp+5의 값을 확인하면 2가 들어있고 내가 입력한 문자열의 두번째와 0x61(a)과 비교한다.
두번째 글자가 a인것을 알아냈다.
call을 하기전에 push로 두개의 값을 입력받고 있다.
첫번째로는 5y라는 값을 입력받고 두번째 ecx의 값을 입력받고있다.
ecx값을 확인해보면 내가 입력한 문자열의 세번째인것을 알 수 있다. 따라서 세번째와 네번째 문자열이 5y라는 것을 알 수있다.
dl과 bl을 검증하고 있는데 bl의 값은 R3versing이고 dl은 다섯번째 위치인것을 확인할 수 있다.
계속실행하면 다섯번째부터 하나씩 검증을 한다. 따라서 다섯번째부터 문자열이 R3versing인 것을 알 수 있다.
우리는 아직 첫번째를 검증을 하지 않았다. 근데 이 부분은 마지막 검증 부근이기 때문에 첫번째라는 것을 예측할 수 있다.
하지만 혹시 모르니 살펴보겠다.
cmp로 esp+4의 위치의 값과 45(E)를 비교하고 있다. esp+4를 찾아보면 첫번째 부분인것을 알 수 있다.
역시 예상대로 첫번째가 맞았다.
첫번째 문자 : E
두번째 문자 : a
세네번째 문자 : 5y
다섯번째부터 마지막까지의 문자 : R3versing
다 합치면 Ea5yR3versing이다.