abex` 5th crackme Write-Up
사용 도구: 올리디버거 2.01
abex` 5th crackme(이하 원본파일)를 풀어보자.
먼저 원본파일을 실행시키면 다음과 같은 메세지 박스가 뜬다.
serial을 입력하고 Check 버튼을 클릭하면 결과를 알려주는 메시지 박스가 뜨고 원본파일이 종료된다.
올리디버거로 원본파일을 실행하면 위와 같은 루틴을 확인할 수 있다. 해당 루틴에선 [사진 1]에서 확인했던 serial을 입력하도록 하는 창을 실행한다.
코드 섹션에서 우클릭 - Search for - All referenced strings 기능을 클릭하면 위와 같이 원본파일에서 사용되는 문자열을 확인할 수 있다.
문자열을 참조하면 위와 같은 루틴이 나온다. 40106C 주소에 브레이크 포인트(이하 BP)를 설정하고 실행하면 serial 입력 창이 뜨고 serial을 입력하면 디버깅을 진행할 수 있다. 나는 serial 값으로 "TEST" 문자열을 입력하였다.
먼저 GetDlgItemTextA 함수를 실행하면 내가 입력한 serial 문자열의 길이를 반환해준다.
EAX 레지스터에 "TEST" 문자열의 길이 4가 저장된 것을 확인할 수 있다.
참고: https://jade9reen.tistory.com/33
GetDlgItemTextA Function
https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-getdlgitemtexta GetDlgItemTextA function (winuser.h) Retrieves the title or text associated with a control in a dialog box. docs..
jade9reen.tistory.com
그 다음 GetVolumeInformationA 함수가 나오는데 이 함수는 지정된 루트 디렉터리의 파일 시스템 및 볼륨에 대한 정보를 검색한다. Root가 NULL로 설정되어 있기때문에 원본파일이 위치한 C드라이브에 대해 검색할 것이다. 그리고 검색을 성공하면 1을 반환한다. EAX 레지스터에 값 1이 반환된 것을 확인할 수 있다. 또한 4010A3 주소에 "WINDOWS" 문자열이 생기는데 이는 검색한 드라이브의 이름을 나타낸다. 즉, 내 컴퓨터의 C드라이브의 이름이 "WINDOWS"로 되어있다.
그 다음 lstrcat 함수로 "WINDOWS" 문자열 뒤에 "4562-ABEX" 문자열을 붙여서 "WINDOWS4562-ABEX" 문자열을 만든다. 그리고 앞의 네 글자에 값 2를 더해 "YKPFOWS4562-ABEX" 문자열을 만든다.
그 다음 "L2C-5781" 문자열을 "YKPFOWS4562-ABEX" 문자열 앞에 붙여서 "L2C-5781YKPFOWS4562-ABEX" 문자열을 만든다. 그리고 내가 입력한 serial "TEST"와 비교한 후 같으면 성공했다는 내용의 메시지 박스 함수를 호출한다.
즉, serial은 "L2C-5781YKPFOWS4562-ABEX"이다.
*후기
api 공부를 더 해야겠다.