파일 : quiz7_tots4youreverseMe1.exe
1. 가장 먼저 프로그램을 실행시켜 보았다. (아래 사진 참고)
- 평가기간이 만료되었다며, 새로운 라이선스를 구매하라는 창이 뜬다.
2. 디버거를 사용하여 해당 실행파일의 내용을 확인 해 보았다.
- "You really did it! Congratz !!!" 라는 문장이 나와야 문제풀이에 성공하는 듯 하다.
- 추가로 아무것도 입력하지 않으면 1 글자 이상 입력하라는 메시지도 뜬다.
- 프로그램 실행은 00401000 주소부터 시작한다.
3. 메인 창의 내용들을 보다가 문제 풀이 성공 메시지가 있는 부분으로 이동시키는 점프 주소를 확인했다.
key 파일을 비교한 뒤 맞는 키 파일이라면 위 사진의 주소로 점프가 되는 것 같다.
- EBX 와 ESI 레지스터를 각각 XOR 연산 한 실행문으로 각각 0 을 갖게 만든다.
- 그 다음 비교하는 실행문으로, 402173 에 있는 값과 0x10 을 비교한다.
(ReadFile 함수에서 pBytesRead 라는 인자로 들어간다.)
- 이후에는 반복문이 시작된다.
반복문은 XOR 연산을 해서 0 이 되어있는 EBX 에 문자열이 저장되어 있는 40211A 를 더한 주소의 값을 AL에 복사한다.
- 반복되며 EBX 를 증가시켜서 40211A + EBX 의 값을 참조해가며 문자열의 문자를 하나씩 읽게 하는 실행문이다.
- AL 과 0 을 비교해서 0 이 나오면(문자열의 끝이면) 점프로 반복문을 나가고, 아니라면 0x47(G)과 비교한다.
문자열의 N 번째 문자가 G 가 아니면 점프로 EBX 만 증가, G 면 ESI 를 1 증가 후 EBX 도 증가한다.
4. 이 부분에서 Keyfile.dat 라는 파일을 유효한 키인지 비교시키는 것 같아서, 같은 디렉터리에 해당 이름의 파일을 생성했다.
- 12345 라는 내용을 채워두었다.
5. 파일 생성 후 프로그램을 다시 실행시켜보았더니, 메시지창 내용이 바뀌었다.
6. 또 다른 비교가 있는 것 같아서 프로그램에서 사용하는 ReadFile 함수에 대해 알아보았다.
파라미터를 살펴보면 다음과 같다.
- Keyfile.datdml 파일 핸들러 주소 또는 값, 문자열을 저장할 버퍼(길이 31), 최대 읽을 문자열 수(70), 실제로 읽어진 길이를 저장할 주소(402173), NULL 을 넣는다.
004010B8 주소를 보면 생성한 파일의 크기인 5 가 저장되어있다.
- 문자열의 길이가 0x10 보다 작으면 점프하는데, 점프 시 위 메시지 창이 뜨며 프로그램이 끝난다.
키 파일에는 최소 0x10 크기 이상 들어가야 하는데 0x10 은 16 진수이고, 윈도우 상의 파일 크기는 10 진수이므로, 16 이상이어야 한다.
- Keyfile.dat 파일의 내용을 123456789ABCDEFG 값으로 수정하고 16 바이트로 맞추었다.
7. 파일 비교 부분을 다시 확인했다.
- CMP AL, 47 //AL 레지스터를 0x47(G)와 비교한다.
- JNZ SHORT quiz7_to.004010D0 //비교결과가 같지 않으면 004010D0 으로 이동한다.
- INC ESI //비교 결과가 같으면 ESI 값이 1 증가한다.(0x8 이상이어야 한다.)
//Keyfile.data 에는 G 문자가 8 바이트 이상 포함해야 한다.
8. keyfile.dat 의 내용을 12345678GGGGGGGG 로 바꾸고 프로그램을 다시 실행시켜보았다.
- 문제풀이에 성공했다는 메시지 창이 뜬다!