지난번 크랙미 1번에 이어서 2번을 풀어보자. 분석 환경은 Windows 7
가상환경을 이용하였다.
우선 프로그램을 실행해보았다.
이름과 시리얼번호를 입력할 수 있는 칸이 있다. 모두 asdf
라는 값으로 채워넣어보니 다음과 같은 결과가 출력된다.
파일의 기본정보를 PEview
를 통해 살펴보자.
파일의 이미지 베이스와 엔트리 포인트 주소 등을 볼 수 있다.
이 파일의 엔트리 포인트 주소는 0x401238
인 것으로 보인다.
실제 x64dbg
를 통해 확인한 엔트리 포인트의 주소가 일치한다.
두번째로 실행할 주소에 Main
함수로 보이는 함수를 Call
하는 것을 볼 수 있다.
해당 함수를 살펴보자.
해당 함수 안으로 step into
하여 진입했다.
한 줄씩 실행시키며 분석해보자.
step over
를 통해 한 줄씩 실행시키다보니
해당 EIP
에서 프로그램이 실행되었다. 다시 되돌려서 해당 함수를 살펴보자.
무작정 프로그램이 실행되는 함수들을 찾아서 들어가다보니 너무 깊게 깊게 들어가게 되어서 생각을 달리 해보기로 했다.
우선 BinText
로 해당 프로그램에 존재하는 문자열들을 검색한 뒤 IDA
로 프로그램을 열어서 출력되는 문자열들을 찾아보았다.
디버거에서 0x403372
로 이동해보자.
문자열을 출력하는 부분으로 잘 찾아온 것 같다.
이제 위 아래 어셈블리 코드를 살펴보면서 분기를 찾아보자.
해당 점프문에서 ax
레지스터의 값을 체크한 후 제로플래그가 set
되면 아래 분기, 즉 Wrong
을 출력하는 곳으로 분기되는 것 같다. 해당 부분의 점프문을 jne
로 변경해보자.
변경 후 실행해보자.
Congratulations!
가 나온 직후 Wrong serial!
이 연속해서 출력되었다. 프로그램 내부에서 이중으로 체크를 하는 것 같다. 다른 분기도 있는지 살펴보았는데, 그럴듯한 부분이 있었다.
이 부분도 마저 jne
로 변경해준 후 다시 실행해보자.
이후 Wrong serial!
창이 뜨지 않았다.
다른 방법의 풀이도 가능한데, 첫번째 분기 이전에 브레이크 포인트를 건 후에 스택의 값을 살펴보자.
스택에 C5C5C5C5
라는 값이 담겨있다. 해당 값을 시리얼에 입력해보자.
분기에 대한 수정을 하지 않아도 잘 풀리는 것을 확인할 수 있다.