문제확인


이번문제는 참 오래걸렸다. VB 특성상 MSVBVM60.DLL에 의하여 동작이 되기 때문에 개인적으로 다른 것에 비하여 분석하기가 까다로웠다. 





풀이


우선 시작부터 너무나 많이 왔다갔다하기때문에 중요한 부분만 사진으로 보겠다. 아래의 사진을 보면 ABCD를 입력하였을 경우 그에 해당하는 10진수의 값을 하나하나 주소에 적는 과정을 나타내고 있다. 이렇게 입력한 Name에 따라서 기록이 된다.


그렇게 입력된 값을 가지고 우리는 Value[5:9] 의 값이 밑에 rtcMidCharBstr에 의하여 4글자만 가지고 올 수 있게 된다. 밑에선 65666768에서 6768이 바로 그 값이 된다. 이 값은 나중에 시리얼에서 가운데 부분을 구성하게 된다.


위에서 나온 값을 가지고 아래의 부분에서 Loop가 진행이 된다. 한글자씩 가지고 연산을 하는 것이다. 이에 대한 설명은 예를 들어서 4949 일경우에 python으로 코드가 출력되게 한것이다.

자세히 보면 Loop후에 NEG EDX가 나오는데 이로 인하여 0-value를 하므로 인하여 우리가 원하는 값을 얻을 수가 있다.


그리고 이 밑에 부분이 가장 중요한 부분이라고 할 수 있다. 실제로 분석을 하다보면 너무 많은 분기문으로 인하여 지치게 된다. 그래서 저도 정말 많이 포기하고 싶었습니다.. 그래서 치트엔진, VB Decompiler, IDA 까지 동원하여 최대한 찾기위해 노력하였습니다. 

항상 어떤 중요한 변동이 있을떄마다 바로 이 부분을 지났기때문이다. 주석 또한 정말 위에도 강조하고 아래에서도 강조하게 된것은 한번만이 아니라 저 부분에서 핵심적으로 동작이 이루어지기 떄문이다.


이제 계속 실행을 하다보면 레지스터에 아래와 같이 정렬이 되며 E590는 위에서 연산을 통해 나온 가운데 시리얼 값이다.  추가적으로 실행하다보면 두번쨰 사진과 같이 한 글자가 사라지기도 하고 계속 이런식으로 변동이 이루어진다.


그리고 이 밑에 부분은 시리얼의 맨 앞자리 값을 결정 짓게해주는 부분이다. 어찌보면 가장 중요한 부분인데 fld fcom 등등 모르는 부분이 너무 많았다... 확실한 것은 저 부분에 들어가기 전에 모든 ECX에 5가 존재하고 그 5에 30을 더하여 EAX로 옮기는 것 같다. 


위를 통하여 14라는 숫자가 나온다. 거기에 6768-E590에서 맨 앞자리를 지우고 14를 앞에 붙여준다. 이렇게 해서 첫번째 시리얼 부분이 형성이 된 것이다. 참고로 여기서 5번째 글자를 없애면 된다.

그리고 마지막 부분의 시리얼 값은 맨 앞자리의 '1'의 10진수 값인 '49'가 나온다.

그리고 그 뒤에 0을 붙이고 맨 마지막 자리는 Len(name)+5의 값으로 형성이 된다.

이렇게 해서 ABCD일 경우의 Serial은 아래와 같다.

아래의 사진은 AAAA로 했을 경우의 성공문이다.



느낀점


이번 문제를 풀면서 정말 많은 자괴감에 빠져버렸다. 아무리 찾아도 찾아도 나오지가 않기에 리버싱이 내 적성이 아닌가 싶기도 느낄 정도였다. 이번문제의 답을 구하긴 했지만 이것도 완벽한 분석으로 구한 것이 아니다. 가운데 시리얼을 통해서 'od'라는 글자가 나왔을때 왠지 CodeEngn일거 같아서 한건데 성공해버렸다. 

그래서 다른 블로그를 참고하면서까지 이번문제를 풀었다. 정말 문제를 풀었으면 보통 기뻐야하는데 기분이 찝찝하다...다음엔 더 열공해서 풀 수 있길..ㅠㅠ


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

CodeEngn Advance 15  (0) 2015.07.30
CodeEngn Advance 14  (0) 2015.07.24
CodeEngn Advance 11  (0) 2015.07.17
CodeEngn Advance 10  (0) 2015.07.13
CodeEngn Advance 09  (0) 2015.07.12