Reversing/Reversing.kr

[Reversing.kr] Replace

PhoB 2023. 6. 22. 00:24
문제 개요

특정 값을 입력해서 Wrong이 안나오게 바꿔야 하는것 같다.

x32 dbg사용

우선 진입점이다.

여기서 살짝만 위로 올려보거나 아님 문자열 찾기에 들어가보면 바로 "Correct"를 찾을 수 있다.

"Correct"위를 보면 GetDlgItemInt함수가 보인다. 맨 위의 DialogBoxParamA함수를 통해 받은 값을 저장하는 함수이다.

중단점을 설정하고 F9를 통해서 실행시켜보자. 테스트 값으로 123(Hex : 7B)를 입력해 보았다.

eax에 입력값이 저장되었다. 중단점을 잡은 함수를 통해서 입력값을 16진수로 바꿔 eax에 저장하는함수 일 것이다.

이후 eax의 값을 4084D0에 저장.

replace.40466F함수로 들어가보자

들어가서도 바로 replace.40467A함수를 실행하는 모습이다. 다시한번 들어가보자.

주소 406016에 619060EB를 더해준다. 그러면 406016에 들어있는 값은

그대로 들어간다.

이후 replace.404689함수를 실행하는데 바로 밑에줄에있는 inc을 수행하는 함수이다.

404684를 수행하고 빠져나온 뒤 다시 403689를 수행하여 inc작업이 총 2번 수행되었다.

=> 4084D0 + 2 = 7B + 2 = 7D

이후 F8을 누르면 해당 함수를 빠져나오고 404674로 돌아간다.

이후 4084D0에 601605c7이 더해진다.

4084D0 --> 6016 6044

이후 쭉 진행하다보면 replace.40466F 함수를 실행하면서 eax에 90(nop)를 더하려는 과정에서 에러가 생긴다.

이는 eax에 90(nop)를 넣는 과정에서 eax의 주소에 접근할 수 없기 때문에 발생하는 예외이다.

함수 40466F에서 오류가 나지 않았다고 가정을 하고 코드를 쭉 읽다보면 401071로 분기(jmp)하고 있는것을 볼 수 있다. 401071로가보면

Correct를 띄워주는 부분인것 같다. 다만 jmp를 사용하여 무조건 분기를 하니 401071이 부분을 다른 코드로 덮어씌워줘야 할 것이다. 그렇다면 eax를 401071로 만들어 거기에 nop를 넣는다면 덮어씌워지지 않을까?

그렇다면 결국 이 문제의 해답은 " eax의 값을 401071으로 만드는 입력값" 일 것이다.

에러가 나기 직전의 입력값 123(Hex : 7B)에 대한 eax의 값은 60160646이었다

(input + x) = eax --> 7B + x = 60160646 

이렇게 계산하면 x는 6016 05CB가 된다

그러면 input + 601605CB = 401071이 되야하는건데 계산해보면 답이 나옵니다!