[reversing.kr] replace

취미/WarGame 2013. 10. 25. 13:29 |


이 프로그램은 우리에게서 숫자를 입력받는다.


허나, 프로그램이 정상적으로 실행되지 않을것이다.


그러니 디버거로 분석을 해보자.




프로그램을 F9 로 실행하면 위 명령에서 익셉션이 발생해 프로그램이 정지한다.


mov ptr [eax] , 90 


eax 레지스터가 가리키는 값에 90을 대입해라. 


이 패치가 오류의 원인이다. 





먼저 오류의 원인인 해당 명령을 NOP 으로 패치해보자 .


이렇게 코드를 바꾸니 일단 실행은 정상적으로 잘 이루어 졌다. 


그리고 나서 나오는 핵심 코드 





NOP으로 넘겨서 돌아온곳은 다름아닌 JMP문이다. 


그것도 가장 중요한 correct 메시지를 출력하는 루틴을 건너뛰어버리는 JMP문! 


이 코드는 대체 왜 있는걸까 ? 


이 코드가 있는 한 어떠한 값을 입력해도 절대로 correct 메시지를 볼 수 없다. 


어거지로 이 JMP문을 NOP으로 채워보면  어떠한 값을 입력해도 correct메시지를 볼 수 있지만, 우리가 원하는 건 이런 메시지를 보는 것이 아니다. 

correct가 실행될 수 있는 입력값을 찾는 것이다. 




다시 여기로 돌아와 코드를 유심히 살펴보자.

eax 는 우리가 입력한 값에 특정 연산이 더해진 값이다. 즉 우리가 입력하는 값에 따라 그 수치가 바뀐다.


그리고, 그곳에 90이라는 데이터를 입력하려고 한다.


바로 이곳이 유요하지 않은 메모리를 가리킬 경우 메모리 참조 오류를 내면서 프로그램이 뻗어버리는 것인데 .


유효한 메모리공간으로 바꾸어 버리면 어떻게 될까?


예를 들어 코드영역내의 어느부분을 가리키도록 말이다.


90은 어셈 NOP명령의 OP코드이다.


즉, eax 가 특정 메모리를 가리키도록 만들면 이 명령에 의해 해당 메모리가 NOP명령어로 패치된다는 얘기다.


이정도면 거의 정답을 다 말한셈이다.


그래도 모르겠다면 프로그램을 몇 번이고 다시 분석해보길 권한다.






답 :



우리가 위에서 확인한 correct 를 건너 뛰어버리는 JMP문 그곳을 eax 가 가리키도록 해서 NOP으로 패치시키면 correct 메세지를 볼 수 있고


그 값이 바로 답이다.


여기까지 왔다면 계산기를 조금 두들겨 답이 무엇인지 알 수 있을것이다.


'취미 > WarGame' 카테고리의 다른 글

[reversing.kr] ImagePrc  (0) 2015.02.21
[reversing.kr] Position  (0) 2013.10.30
[reversing.kr] Easy_UnpackMe  (0) 2013.10.24
[reversing.kr] 2번 문제 Easy_keygen  (0) 2013.10.23
[reversing.kr] 1번 문제 Easy CrackMe  (0) 2013.10.18
Posted by $Zero
: