문제확인


우선 문제를 확인하면 이전에도 풀려고 했지만 결국 풀지 못했던 문제로 기억을 한다. 하지만 그 때에는 분명 리버싱을 처음 접했을때로 기억을 하기에 당시보다는 잘 풀 수 있겠지라는 자신감으로 리버싱을 시작하였다. 

우선 UPX 패킹을 해제하고 리버싱을 계속 진행하면 된다.




풀이


사실 이 문제는 정말 많이 삽질을 한것 같다. 출력되는 남은 군생활의 값을 증가시켜주는 부분을 찾았고 그 주위에서 CMP를 통한 비교문을 찾기 위하여 많은 노가다를 하였지만 결국 삽질도 여러번 하다가 문득 생각 난 것이 바로 치트엔진이였다. 

사실 치트엔진을 통한 문제 풀이가 과연 리버싱에 도움이 되는 것인지는 모르겠지만 이참에 치트엔진 공부도 새롭게 같이 시작을 해보려한다. 우선 아래와 같이 치트엔진을 통하여 변화하는 값을 캐치한다.

위의 사진과 같이 치트엔진을 통하여 우선 해당 N번째의 값인 10을 입력해주고 그 다음은 Increased value를 통하여 두개의 값만 남았다. 여기서 첫번째 주소로 이동을 하여 확인을 해볼 것이다. 주소는 02583DB0로 이동을 한다. 그러면 위의 덤프창에서와 같이 0xA의 값이 존재하는 것을 확인 할 수가 있다.


위의 사진과 같이 해당 덤프에 BP를 건다. 위와 같이 ON ACCESS를 하는 것이 적당할 것이다. 그 후 BP를 통하여 계속 진행을 하다보면 아래와 같은 지점이 나타난다. 이 지점에서 우리가 현재 N번쨰인 B와 316을 비교를 한다. 이를 통해 우리는 남은 군 생활 수가 0x316 일수도 있다는 것을 확인 할 수가 있다. 이제 확인을 위하여 명령어를 바꾸어 보자.


0x316보다 클 경우에는 해당지점으로 점프를 한다. 그렇다면 우리는 확인을 위하여 JL을 JMP로 바꾸어 볼 것이다. 아래와 같이 바꾼 후에 진행을 할 경우 결국 RETN 8을 끝으로 프로세스가 종료 되는 것을 확인 할 수가 있다.

이러한 작업을 통하여 우리가 찾은 비교문이 올바른 지점이라는 것을 확인 할 수가 있었다. 이러한 방법을 통하여 문제를 풀 수가 있다. 치트엔진을 이용해서 더 쉽게 풀 수가 있었던 것 같다. 하지만 치트엔진보다 더 쉬운 방법이 있는데 바로 아래와 같은 디컴파일러를 이용하는 것이다. 디컴파일러를 이용하면 바로 1 TO 790(0x316)을 확인 할 수가 있다. 하지만 이는 실력 향상에는 안좋을 것 같다. 이러한 방법이 있다는 것만 잊지 말자.


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

CodeEngn Advance 09  (0) 2015.07.12
CodeEngn Advance 08  (50) 2015.07.01
CodeEngn Advance 05  (0) 2015.06.28
CodeEngn Advance 04  (0) 2015.06.28
CodeEngn Advance 03  (0) 2015.06.28