이번문제 역시 시리얼 값을 찾는것이다.
시리얼값을 입력하지 않고 check 를 했을때 뜨는 메세지 박스를 통해 back to user 모드로 텍스트 박스의 위치로 가보자.
성공했을때 출력되는 문장이 보이는대 이 메세지박스를 출력하려면 다음의 분기문을 모두 통과 해야 한다.
중간에 있는 분기문들은
EDI 에 있는값들을 하나씩 불러서 그것을 정해진 값들과 AND 연산을 하는대
AND의 결과값이 0일때 ZF 가 1로 세워지므로 그것을 이용하여 JNZ 를 모두 통과해야 한다.
각각 숫자들은
0AD
9A
97
0BF
5FC5
0D6
6개 가 있다.
내가 입력한 값들의 AL과 AND 연산을 하는대
AL은 8비트만 신경쓴다.
먼저 EDI는 내가 입력한 시리얼들인대 한글자 씩 불러와 비교를 한다.
첫번째 시리얼은
0AD 와 비교되는대
이것은 이진수로 바꾸면
1010 1101 이다.
이 수와 AND 연산했을때 0이 나오려면
0100 0010 과 같은 수를 연산해야 한다.
0100 0010 은 아스키코드 표를 참조해서 보면
B를 입력했을때 AND의 결과가 0으로 세워질 것을 알 수 있다.
두번째 9A는
1001 1010 인대
0100 0101 을 입력한다면 AND의 결과로 0을 얻을 수 있다.
이는 아스키 코드값으로 E 이다.
세번째는 97이다.
1001 0111 인대
0100 1000 을 입력하면 AND 결과로 0을 얻을 수 있다.
이는 H 이다.
네번째는 0BF 인대
1011 1111 이다
0100 0000 을 입력한다면 AND 결과로 0을 얻을 수 있다.
40의 아스키 코드 값은 @ 이다.
다섯번째 부터는 EAX로 AND 연산을 하는대 어짜피 아스키 값은
127 이하이므로 뒤의 값은 신경을 쓰지 않아도된다.
다섯번째는 5FC5 이다.
이는 0000 0000 0000 0000 0101 1111 1100 0101 이다.
이지만 실재로는 1100 0101 만 신경 쓰면된다.
1100 0101 과 AND 연산했 을때 0이 나오려면
0011 1010 을 입력하면 된다.
이는 아스키코드값으로 : 이다.
여섯번째는 0D6이다.
이것은 1101 0110 이다.
그럼 0010 1001 을 입력하면 0을 얻을 수 있다.
이것은 아스키 코드 값으로
) 이다.
마지막 분기문의 CMP ECX 6 의 ECX 는 처음에 내가 입력한 시리얼의 길이 인대 그 길이가 6일때 점프한다고 한다.
이 부분에서 ECX에 내가 입력한 시리얼의 길이가 들어간다.
그럼 BEH@:)
를 입력하면 성공의 메세지를 볼 수 있다.
중간 분기문을 통과할때 지금 입력한 값뿐만 아니라 정해진 값과 AND 연산했을때 0이 나올수 있는 모든 아스키 코드 값을 입력하면
이번 문제를 해결할 수 있다.
다음 아스키코드표를 참조해 해결했다.
댓글