문제 확인


문제를 확인해보면 참 설명이 간단하게 나와있다. Password는 무엇인가?이다. 그렇다면 시리얼값을 구하는 것일까했지만 여기서 문제는 우리가 직접 ID까지 알아내야한다는 것이다. 프로그램을 바로 실행시키면 아이디로 무엇을 입력해야할지 당황스럽다. 


하지만 막상 디버거로 프로그램을 열면 바로 덤프 창에 This is the Username : DonaldDucK 이라고 적혀있는 것을 볼 수가 있다. 이것이 바로 우리의 ID 값이다. p.s 사실 굳이 이것을 발견하지 못해도 이후에 DonaldDuck과의 문자를 비교하는 Loop 구간이 있기에 처음에 발견하지 못하더라도 나중에 발견할 수가 있을 것이다.




풀이



우선 프로그램을 진행하다보면 위와 같이 내가 입력한 키값 123 (0x7B)와 실제 값인 0x88228F를 비교하는 것을 확인 할 수가 이다. 그리고 조금 더 밑에는 주석에서와 같이 DonaldDuck인지를 비교하는 Loop 구간을 확인 할 수가 있다.

키 값을 알았지만 자꾸 실패문이 뜨는 것을 확인 할 수가 있었다. 이는 성공문을 출력하기 위해서는 우리가 패치를 해야한다는 것이다. 이러한 패치는 2가지 과정으로 이루어 질 것이다. 성공구문 근처에서 틀린 키값을 가지고 수정을 하는 과정과 옳은 키 값을 가지고 수정을 하는 과정이다. 


이와 같이 틀린 키 값을 가지고 프로그램을 진행하기 위해서는 2번의 명령어를 수정해야한다. 이를 통하여 우리는 틀린 키 값으로도 성공문을 확인 할 수가 있게 되었다. 


이번에는 옳은 키값을 가지고 수정을 하였다. 이번에는 한가지의 명령어만 수정을 하면 되었다. 그렇다는 것은 바로 저 부분만 고치면 옳은 키값을 넣을 경우에는 성공문으로 가게 되고 틀린 키 값을 넣으면 실패문이 출력되도록 할 수가 있다.




키 값 찾기



CMP EAX, PTR DS:[ECX] 에서 EAX에는 우리가 입력한 값이 전달되고 PTR 부분에 키 값이 저장되어 있다. 하지만 이 PTR의 주소는 실행을 할 때마다 다른곳에 위치하고 있다는 것을 확인 할 수가 있었다. 그렇다면 이는 어떠한 것 떄문에 그런지 확인을 해보자.


바로 위의 사진에서와 보듯이 우리는 MOV DWORD PTR DS:[BC4404],EAX를 통하여 BC4404의 주소에 키 값이 저장된 공간의 위치가 전달 되는 것을 확인 할 수가 있다. 이러한 키 값이 있는 곳의 주소는 VirtualAlloc 를 통하여 형성이 된다.  VirtualAlloc를 통하여 할당된 주소를 EAX에 반환하고 그 값에 ADD EAX,2A0를 통하여 최종적으로 전달할 공간의 주소를 형성한다.


위의 사진을 보자. Address 파라미터의 값이 NULL일 경우 시스템이 주소를 결정한다는 것이다. 바로 이것이 키 값이 저장된 위치가 실행할때마다 변화했던 이유이다.


앞에서 확인 했던 것과 같이 키 값이 있는 곳의 주소는 00BC4404에 기록이 된다. 저 해당 주소로 가면 우리가 성공문을 출력하는데 필요한 키 값이 위치하여 있다. 추가적으로 아래의 사진은 이번 문제를 삽질할때 보았던 Flag Register에 관해 짧게 써있는 것이다. 


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

CodeEngn Advance 11  (0) 2015.07.17
CodeEngn Advance 10  (0) 2015.07.13
CodeEngn Advance 08  (50) 2015.07.01
CodeEngn Advance 06  (0) 2015.06.28
CodeEngn Advance 05  (0) 2015.06.28