리버스엔지니어링 문제 Advance 10

2015. 5. 3. 10:21Security ★ Development/Reversing

반응형

http://codeengn.com/challenges/advance/10


Problem : Find the Name when the Serial is WWWCCCJJJRRR 

Hint 1 : Name is 4 letters 
Hint 2 : Among the multiple solutions, find the one that comes first in alphabnumeric order. 

성공, 실패 문자열을 찾아보면 분기점을 발견할 수 있습니다.  

EBP-0A5와 0의 값을 비교함으로서 분기가 되는데 EBP-0A5는 바로 위 함수가 아니라

여기서 마지막으로 건드리게 됩니다.  그럼 바로 위의 CALL을 살펴보겠습니다.

리턴하는 부분입니다.  EAX의 값을 거슬러 올라가다 보면 CMP EAX, 5를 거친 후 00401B61 위치에서 0을 넣고 있습니다.  처음 EBP-69의 값은 1이고 여러번 루프를 하는데 한번이라도 저기에 들어가게 되면 EBP-0A5의 값은 0이 되어서 실패 메시지를 출력합니다.  EAX는 5보다 작거나같아야 저기로 빠지지 않습니다.  


EAX는 그 바로 위에서 결정됩니다.


BP를 건 부분이 -7C와 -78이 결정되는 부분입니다.  두 부분 모두 같은 곳을 호출합니다.

이 안에서 다시 한번 더 들어가면 루프문이 있습니다.

00414ADF부분에서 같은 문자를 찾습니다.


전체적인 구조를 보면 -7C와 -78을 결정하는 부분에서는 문자의 거리를 구합니다.  CALL 00414B10을 두번 호출하는데 이는 문자열에서 해당 문제가 나오는 2번째 위치를 구하기 위함입니다.

이 문자열이 구하는데 사용됩니다.

Name은 4글자, Serial은 12글자를 넣었는데 Name 첫글자와 Serial 1~4번째 글자의 거리차이, Name 2번째 글자와 Serial 5~8번째 글자와의 거리차이 등을 구합니다.  이 거리차가 6이상이 되면 안되는겁니다.

Name의 각 위치의 2번째 글자, Serial의 각 범위의 2번째 글자의 차이가 5이하여야합니다.

즉, Serial에서 W, C, J, R 옆 5범위 내에 있더라도 그 글자가 2번째로 나온 것이어야 한다는 겁니다.  그리고 그렇게 만들어진 Name이 알파벳 순으로 제일 앞에 올 수 있어야 합니다.


조건에 맞게 필요한 값을 구해보면 문제에 제시된 (0~9, a~z, A~Z) 순으로 31A6이란 값이 나옵니다.


다른 값들도 프로그램은 Good job 메시지를 띄울 순 있지만 문제에서 요구하는 답은 31A6이 되겠습니다.