문제확인





확인




Name에 따른 시리얼이 형성되는 부분은 쉽게 찾을 수가 있다. 내가 입력한 name은 0000 serial은 11111111로 입력하였을때 아래와 같이 시러일이 비교되는 부분이 있다. 그리고 그 위에 이러한 키 값이 형성되는 부분이 존재 한다. 



위에 있는 덤프창에 드래그 해 놓은 부분이 바로 키 값 형성에서 if 문을 결정짓게 해주는 요소들이다. 그리고 아래의 사진은 수많은 if문들이 존재한다. 실제로는 16~20개의 if 문이 존재한다. 하지만 여기서부터 문제가 시작되었다. 

이번문제의 가장 큰 시사점은 작은 그림이 아니라 큰 그림을 보아야 한다는 것이다. 저러한 if문들을 계속 하나하나 따라가다보면 정말 미궁으로 빠져버린다. 본인은 미궁에서 2일을 소비했다...

바로 위의 if문을 보는 것이 아니라 아래와 같이 Dump를 지속적으로 확인해주어야 한다. 402538의 부분을 보면서 계속 진행을 하다보면 아래와 같이 3B10  31  6D  64  38 이 존재하고 있는 것을 확인 할 수가 있다. 여기서 31은 내가 입력한 serial인 ('1111')의 한 글자이다. 


위와 같이 셋팅이 된후에는 바로 연산이 진행된다. 3B10  +  31*(64+38)과 같은 식으로 진행이 된다. 그렇게 나온 값이 Sum = CF1BC이다. 이제 이와같이 이러한 연산이 key[]에 있는 모든 배열들을 순차적으로 더할 때까지 반복이 된다.

그렇게 해서 나온 값이 바로 sum = 3315C0이다. 이제 이 값을 가지고 다른 연산이 진행이 된다. 바로 F로 나누는 것이다.


F로 나눈 후에 3315C0 / F = 367D9 ... 9가 남는다.

이제 이 9에 0x30을 더 해준 후에 키 값으로 올려버린다.

그리고 남아있던 367D9에는 2를 곱하여 준다.

이렇게 더이상 F로 나누어 질 수 없을 때 까지 반복이 된다.

하지만 계속 반복이 되는 중에 만약 나머지가 0x3A~0x40일 경 밑에 2번쨰 처럼 '0~9,A~Z'가 아닌 특수문자가 나오게 되는데 이를 방지하기 위하여 A~E가 나머지로 나올 경우 +8을 해준다.


이렇게 계속 반복을 하다가 더이상 F로 나눌 수 없는 값이 될때까지 반복을 한 후에 마지막 나머지 또한 key값으로 보낸다.

위에 말이 너무 복잡하게 설명이 되어있는데 코드로 본다면 아래와 같이 간결하게 나열이 된다.




풀이


위에서 구한 방법을 통하여 94E7DB1B를 뒤에서 부터 다시 올라오면 된다. 그렇게 되면 D2A734이 나오는데 이는 맨 처음의 SUM 값인 0X3B10이 더해져있는 값이다. 따라서 KEY[]를 구하는 방법은 KEY[] = (D2A734 - 3B10) / 426C 이다. 이제 이렇게 나온 값은 0x32B이며 KEY[]의 모든 ASCII의 조합이 이렇게 나오면 된다는 것이다.

정답은 많은 경우의 수가 존재하므로 그 중에서 하나를 골라서 게시판에 비공개로 올리면 정답으로 처리가 될 것이다.


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

CodeEngn Advance 14  (0) 2015.07.24
CodeEngn Advance 12  (1) 2015.07.22
CodeEngn Advance 10  (0) 2015.07.13
CodeEngn Advance 09  (0) 2015.07.12
CodeEngn Advance 08  (50) 2015.07.01