문제 확인


이번문제도 시리얼이 주어지고 이에 해당하는 Name을 구하는 것이 문제이다. 이제 14번 이전까지 문제를 풀었던 사람들이라면 충분히 손쉽게 문제를 풀 수가 있는 문제이다.



분석


우선 성공분기점을 찾는다. 아래와 같이 IDA를 통해서 봤을 때 LStrCmp()를 통하여 성공의 분기를 결정하는 것을 확인 할 수가 있다. 그렇다면 저 부분을 기준으로 이전의 명령어들을 살펴보자.


우선 프로그램을 디버거로 열어보면 아래의 지점으로 EIP가 구성이 된다. 그리고 총 5개의 호출함수가 보인다. 여기서 우리가 알아야할 것은 바로 4번쨰에 있는 함수로써 프로그램의 버튼을 클릭하였을 경우 이루어질 동작에 대해 정의된 곳이다.

그 이전의 부분들은 GUI를 구성하는 작업을 하는 것이므로 굳이 힘들게 분석할 필요는 없는 것 같다.


Run() 함수로 진입하여 살펴보다보면 아래와 같이 내가 입력한 Name과 Serial들을 가지고 확인작업을 하는 것을 볼 수가 있다. 설명은 주석으로 달아놓았지만 그래도 모든 부분을 다 포함하기에는 너무나 길기 떄문에 IDA-Hexray로 대체하겠다.


밑에 보는 것과 같이 특정한 자리에 특정한 값이 오는지를 확인하기도 한다. 이러한 중간에 하나라도 조건에 부합하지 않는다면 바로 실패구문으로 넘어가게 된다. 그리고 이러한 구문을 모두 거친 뒤에서야 비교문이 나오게 된다.



풀이


위의 많은 조건들을 통과하면 아래와 같이 Create_Serial()을 호출하는 부분을 발견할 수가 있다. 이 부분에서 바로 Name에 따른 Key 값이 형성이 된다.


우선 Name을 1111로 입력하였을 경우 Name이 총 16글자로 맞추어 지는 것을 확인 할 수가 있다. 그렇게 형성된 16글자를 가지고 "NH KeyGenMe6"와 함께 한 글자씩 ADD 연산을 통하여 연산을 진행한 후에 생기는 값들을 통하여 최종적으로 키 값을 형성한다.


이러한 루프를 모두 거치면 아래와 같이 007F0079...등 많은 숫자들이 있다. 하지만 여기서 키 값에 사용되는 것은 바로 앞의 12글자이다. 따라서 우리가 필요한 글자는 3글자이며 나머지는 모두 무시된다는 것을 확인할 수가 있다.

하지만 그렇다해서 Name을 3자리만 입력하라는 것은 아니다. Create_Serial()로 오기 이전의 조건문에 의하여 name의 수는 4의 배수여야하는 것 같다.


아래는 Name 을 1234로 했을 경우에 구하는 소스이다. 이제 이렇게 구했으므로 우리는 역으로 뺄셈을 통하여 쉽게 답을 찾을 수가 있다.


Create_Serial()을 통과한 후에 lStrCmp()를 통하여 내가 입력한 시리얼과 Name에 따른 KEY값이 비교되는 것을 확인 할 수가 있다.



따라서 우리는 3글자만 알면되기에 아래와 같이 3글자를 채워주고 마지막 한글자는 아무거나로 채우면 성공문을 확인 할 수가 있을 것이다.


'Reversing > CodeEngn' 카테고리의 다른 글

CodeEngn Advance 02  (0) 2015.07.30
CodeEngn Advance 15  (0) 2015.07.30
CodeEngn Advance 12  (1) 2015.07.22
CodeEngn Advance 11  (0) 2015.07.17
CodeEngn Advance 10  (0) 2015.07.13