티스토리 뷰

level15번 문제는 14번 문제와 비슷한 유형으로, Serial을 구하는 문제입니다.


실행해본 결과 name에 CodeEngn을 주고 Serial에 문자를 주었더니 integer 오류가 납니다.


숫자로 했더니 그냥 평범한 메시지박스 오류가 나오네요. 숫자를 입력해야 한다는 뜻이고, 저번과 비슷하게 계산기로 16진수를 10진수로 바꿔서 답을 입력해야 한다는 것을 예상할 수가 있습니다. 


Exeinfo PE로 본 결과 패킹이 안 되어 있고, Delphi로 작성이 되어 있습니다. 


실행한 메인 화면입니다.


문자열을 봤더니, 힌트가 되는 곳이 있네요. 저 부분을 타고 들어가서 진행을 하겠습니다.


문자열이 있는 루틴입니다. 저 안에 name과 serial을 받고 비교하는 부분이 있을 겁니다.


이 부분은 프로시저 부분을 진행하고, 맨 밑에 있는 00458760 함수 안으로 들어가겠습니다.


00458760 함수 안에서 name을 가져오는 값입니다. 004255C0 함수는 name으로 입력한 문자열 길이를 리턴하고 그 밑에는 name으로 입력한 codeengn이 EDX로 복사 됩니다.


EDI에 있는 값을 EAX에 복사합니다. EAX에는 name이 저장됩니다.

  


위의 00403A64는 입력한 문자의 글자 수를 출력합니다. 8글자를 출력합니다.



아래의 루틴에서 SHL EDX,3 까지 실행한 것을 보면 아래와 같습니다. EDI와 ESI는 비었기 때문에 0값을 EDX와 ECX에 저장하고, MOVZX로 EDX에 [EDX+ECX-1] 값을 넣습니다. 넣는 값은 name에 입력한 문자의 첫 글자입니다. 즉 C(43) 입니다. 

  


EDI 부분을 EAX에 넣으면 name으로 입력한 값이 저장이 됩니다.

 




004587C0 줄을 실행하면 EDX 값에 3을 SHL이 실행되어서 EDX는 218이 됩니다.

 




바로 밑줄 004587C3을 실행하면 EBX안의 값과 EDX값을 더합니다. EBX 값의 0045B844 주소에는 0이 저장되어 있습니다.


 



아래 그림은 EBX에 있는 값입니다. 218이 리틀엔디안으로 18 02로 들어갑니다.

 


바로 밑줄 004587C5를 실행하면 0045B844에 있는 값이 1 증가합니다. 즉, 한 문자가 진행 될 때마다 값이 증가합니다.

 


004587C7 줄이 실행이 되면 EAX값이 감소가 됩니다. 즉, 문자열이 8문자에서 7문자로 감소가 됩니다.


루틴이 돌 때마다 EDX의 값과 계속 더해줍니다. 0045B844 에는 더한 값이 계속 들어갑니다.

 


루틴을 모두 돌고나서 확인을 하면 0045B844 안에는 18 18 00 00 이 저장되어 있고 그 옆에는 09가 널 값까지 포함해서 적혀 있습니다. 결과를 요약하자만, 모두 더한 EDX값을 0045B844에 저장하고 모든 글자와 널 값을 실행한 횟수를 0045B848에 적어서 저장합니다.

 


004587CA를 실행하면 아래와 같이 EAX에 name값이 저장이 됩니다.



004587CC를 실행하면 EAX 값에 문자열 길이를 가져옵니다. 

길이를 가져오게 되는데 EAX에 '8'을 가져오게 됩니다. 다음 줄로 [SHL EAX, 3]을 하게 되면 EAX가 40이 되고 004587D4를 실행하면 EAX의 값 '40'을 EBX[0045B844]와 더해줍니다.

 


더해주게 되면 58 18 00 00 이 됩니다.


004587D6을 실행하게 되면 EBX에 있는 58 18 00 00이 빅엔디안으로 EAX에 복사가 됩니다. 

 


004587D8줄을 실행하면 [SHL EAX,2]가 되어서 EAX는 00006160이 됩니다.



004587D8줄을 보시면 EAX에서 다시 EBX[0045B844]에 값을 넣어줍니다. 이 값이 바로 아이디를 'CodeEngn'을 가지고 시리얼 키를 생성한 것을 확인 가능합니다.



00458760 함수를 빠져나와서 00458829값을 실행하면 EAX에 [LOCAL.1]을 넣고 EAX 레지스터에는 1234 값이 들어있는 주소가 들어갑니다.

 



아래 함수 00407774를 실행하면 입력한 1234의 16진수 값 4D2를 반환합니다.



00458831줄이 CMP 부분이네요. 14번 문제와 다르게 답을 화면에서 알려주지 않고 주소 값 안에 숨겨놨네요. 저 주소 부분의 값과 아까 입력한 1234(4D2)를 비교하여 동일하면 크랙이 성공하는 분기점 입니다.



45B844를 검색해서 들어가보면 60 61 00 00 으로 나와있네요. 아까 name값을 이용해서 시리얼 값을 생성할 때 봤었죠? 이 문자열을 10진수로 바꾸면 됩니다.






'Wargame > codeengn' 카테고리의 다른 글

[codeEngn] Basic RCE level17  (2) 2015.07.30
[codeEngn] Basic RCE level16  (0) 2015.07.30
[codeEngn] Basic RCE level14  (0) 2015.07.29
[codeEngn] Basic RCE level13  (0) 2015.07.29
[codeEngn] Basic RCE level12  (0) 2015.07.29
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함