프로그램은 무난하게 생겨있습니다.
Ollydbg로 까봅시다.
입력받는 부분, 그리고 맞았는지 틀렸는지 확인하는 부분을 쉽게 찾을 수 있습니다. 이제 값이 어디에 입력되는지, 맞았는지 틀렸는지를 어떻게 판단하는지 천천히 확인하면 되겠네요.
여기서의 입력은 19FE14번지부터 들어가게 됩니다.
그리고 키를 입력하기 전 수상한 루프가 하나 생기는데, 이 부분에서는 매 루프마다 ESI가 0 1 2 0 1 2 0 1 2... 이렇게 바뀌어가고 이 값에 따라 ECX에는 10 20 30 이 반복해서 들어갑니다. 그리고 EDX에는 EBP가 1씩 증가해서 내가 입력한 input이 한 글자씩 차례로 들어갑니다. 그러고나서 ECX에 EDX값을 XOR하더니 ECX와 EAX(=19FE7C라는 주소)를 스택에 넣고 ECX에 19FE7C를 넣고 다시 스택에 넣습니다. 느낌상 저 함수는 sprintf이고 19FE7C번지에 %s%02X로 인자를 주는데, %s 되는 부분은 자기자신이고 %02X는 ECX와 EDX의 XOR 값입니다. 즉 name의 한 글자씩을 떼서 10 / 20 / 30을 차례로 XOR시켜 19FE7C에 기록하네요.
Serial key는 19FE18번지에 저장됩니다.
이제 ESI에 19FE7C번지(이름과 10 20 30을 XOR해서 얻어진 값이 저장된 곳)를 두고 EAX에 19FE18번지(serial이 저장된 곳)를 둡니다. 그리고 ESI가 가리키는 곳(CL), EAX가 가리키는 곳(DL)이 0이 될 때 까지 ESI와 EAX가 같은지 비교하며 값을 증가시킵니다. 만약 전부 같다면 EAX가 0인 채로 401113번지로 점프, 같지 않은 곳이 있다면 EAX는 1이 되어 401113에 도달합니다. 이후 TEST EAX, EAX에서 EAX는 1인 경우 Wrong으로 가고, 0인 경우 Correct가 됩니다.
즉 19FE7C번지와 19FE18번지의 값이 같은지를 확인하는 명령이었네요. 그러면 최종적으로 답은 시리얼 5B134977135E7D13에 차례대로 10 20 30을 XOR한 값이 되겠습니다. 파이썬으로 대충 짜면 아래와 같습니다.(Python 3)
serial = '5B134977135E7D13' val = [0x10,0x20,0x30] for i in range(len(serial)//2): print(chr(int(serial[2*i:2*i+2], 16) ^ val[i%3]), end = '')
'워게임 > Reversing.kr' 카테고리의 다른 글
[Reversing.kr] Position (0) | 2017.12.30 |
---|---|
[Reversing.kr] ImagePrc (0) | 2017.12.29 |
[Reversing.kr] Replace (0) | 2017.12.29 |
[Reversing.kr] Music Player (0) | 2017.12.29 |
[Reversing.kr] Easy Unpack (0) | 2017.12.29 |
[Reversing.kr] Easy Crack (0) | 2017.12.29 |