[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 |