실행파일을 실행해보니
패스워드를 입력해야하는 창이 떴다.
올리디버거로 열어보았다.
함수들을 살펴보았다.
MessageBoxA를 두 개 발견했고
MessageBoxA가 호출된 곳으로 이동해보니
성공한 경우와 실패한 경우에 대한 코드가 있었다.
패스워드가 틀렸을 경우 출력되는 MessageBox로 JMP하도록 하는 분기문을 찾아보았다.
00401135 주소를 확인해보면 총 4개의 분기문에서 패스워드를 검사한다는 것을 알 수 있다.
-> 004010B5, 004010CD, 0040110B, 00401112
004010B5부터 보면
ESP+5와 61을 비교한다.
004010B0에 breakpoint를 걸고 실행한 다음
abcd를 넣어보았다.
ESP+5가 62('b')인 것을 알 수 있고 내가 입력한 패스워드의 두 번째 자리를 의미한다는 것을 확인할 수 있다.
ESP+5와 61을 비교하기 때문에 패스워드의 두 번째 자리가 'a'여야 한다는 것을 알 수 있다. (0x61=97이고 아스키코드 97은 'a')
두 번째 자리에 a를 넣고 다시 실행해보았다.
xabcd를 넣어주었다.
한 줄씩 코드를 실행해보면
인자로 "5y"와 ECX를 넣고 호출하는 함수를 하나 발견할 수 있다.
ECX 값을 살펴보면
내가 넣었던 패스워드 'xabcd'중 'bcd'라는 것을 확인할 수 있다.
대충 bcd자리에 5y가 들어가야 될 것 같다고 유추해볼 수 있지만
함수안으로 들어가보았다.
이런 함수였다.
'b'와 '5'를 비교하는 것을 볼 수 있다.
다시 실행하여 이번에는
xa5yqwerty를 넣어주었다.
두 번째 분기문까지 통과할 수 있었다.
세 번째 분기문에서는 "R3versing"과 내가 입력한 패스워드에서 "5y" 뒷부분인 "qwerty"를 비교한다.
따라서 _a5yR3versing을 패스워드로 넣어야한다.
첫 글자에는 x를 넣어 패스워드로 입력해보았다.
세 번째 분기문까지 통과했다.
마지막 분기문에서 ESP+4와 45를 비교하는데 ESP+4가 x인 것을 보아 내가 입력한 패스워드의 첫 글자임을 알 수 있었다.
0x45 = 69이고 아스키코드 69는 'E'이므로 첫 글자로 E가 들어가야한다.
따라서 패스워드는