파일 : quiz6_Crack me by hackereh@!.exe
1. 가장 먼저 프로그램을 실행시켜 보았다. (아래 사진 참고)
- 시리얼 번호를 입력하라는 창이 떴다.
2. 아무 내용이나 입력 후 Check 버튼을 눌러보니 다음과 같은 화면이 나왔다.
- 오른쪽은 혹시나 하고 첨부한 중간 About 버튼을 클릭한 화면이다.
3. 디버거를 사용하여 해당 실행파일의 내용을 확인 해 보았다.
- "Yup, you did it! now make a tutorial:)!" 이라는 문장이 나와야 문제풀이에 성공하는 듯 하다.
- 추가로 아무것도 입력하지 않으면 1 글자 이상 입력하라는 메시지도 뜬다.
- 프로그램 실행은 00401000 주소부터 시작되었다.
4. 메인 창에서 실패문장이 뜨는 부분으로 가보았더니 아래와 같이 적혀있다.
- Jumps from 00401199, 004011A1, 004011A9, 004011B1, 004011BC, 004011C7, 004011CC
- 위 주소들로부터 점프해서 온다.
0040118F 주소에서는 EDI 에 내가 입력한 시리얼 값을 넣고있다. 한 글자씩 불러와서 비교를 하는 문장이다.
아래 사진처럼 총 7 개의 구간으로 나누어 검사를 한다.
- AND 연산은 1 과 1 을 비교해야 1 이고, 1 과 0 이면 0 이다.
- JNZ 는 비교 값이 0 이 아닌 경우 해당 주소로 이동한다.
ㄴ 즉, AND 연산한 값이 JNZ 를 통해 점프가 되지 않도록 0 을 만들면 된다.
문제풀이에 성공하기 위해서는 004011F1 으로 점프해야 한다.
5. 위의 과정을 풀어보았다.
JNZ 구간 검사 정리 (해당 값들을 2 진수로 바꾸고 NOT 연산 후 해당 값의 문자열 사용)
- AL 은 8 비트만 신경쓴다.
1. AND AL, 0AD //1010 1101 → NOT → 52 R
2. AND AL, 9A //1001 1010 → NOT → 65 e
3. AND AL, 97 //1001 0111 → NOT → 68 h
4. AND AL, 0BF //1011 1111 → NOT → 40 @
5, AND AL, 5FC5 //0101 1111 1100 0101 → NOT → A03A :
6. AND EAX, 0D6 //1101 0110 → NOT → 29 )
7. CMP ECX, 6 //ECX 는 공격자가 입력한 시리얼의 길이, 길이가 6 일 때 점프
6. 위에서 알아낸 값들을 연결하여 시리얼 값을 입력했다.
- Reh@:)
성공했다!