이전까지 이름을 넣었을 때 이름을 넣은 것을 어떤 루틴을 통해 시리얼 값으로 변해 메모리에 저장되고, 그 값과 시리얼을 정확히 맞추면 풀린다는 것을 깨달았다. 게싱과 실험이 난무한 풀이였지만 일단 작성해 보도록 하겠다. 이름에 1234를 넣었을 때의 시리얼 값은 21120324였다. 어떠한 규칙이 있을 지 일단 이름을 1111을 넣고 다시 실행시켜 보자. 시리얼까지 입력받고 난 뒤의 실행문이다. 시리얼이 저장되는 위치는 따로 바뀌지 않았으며, esp + 74의 위치를 덤프창을 통해 본 결과 0019FE7C 32 31 31 31 30 31 32 31 00 00 00 00 00 00 00 00 21110121........ 시리얼 값은 "21110121"인 것을 볼 수 있다. 아직 어떠한 규칙인지 잘 모르겠을 수 있다. 1111을 넣고 다시 실행하여 시리얼을 입력받기 전, 반복문을 한 번 돌려보았다. 시리얼 값이 들어가는 주소에 32 31, 즉 "21"이 들어가 있는 모습을 볼 수 있다. 단순 추측으로 한 문자당 두 문자로 바뀐다면, 시리얼의 길이는 문자열의 길이 * 2일 것이다. 루틴 부분을 좀 크게 봐보자. ecx와 edx를 사용해 시리얼을 만드는 연산을 하는 것 같고, 반복문에서 문자열의 위치 인덱스를 증가시키는 것을 esi와 esp를 사용하는 것으로 보인다. 그리고 xor연산을 통해 ecx, edx를 xor을 하고 ecx의 값을 스택에 넣은 뒤 어떤 함수를 호출한다. ecx가 가진 카운터와 ebp를 비교해 jl인 동안 반복문을 실행한다. 레지스터 창을 보면 ebp의 값은 1인 것을 볼 수 있다. ebp의 원래 값을 백업해 두고 카운터로 사용하는 것을 볼 수 있다. 추측으로, '1'을 반복문을 한 번 거치고 나서 '21'이 되었다고 하자. 1을 어떻게 연산해서 연산 결과를 그대로 두 바이트로 쪼개...
댓글
댓글 쓰기