워게임/Reversing.kr

[Reversing.kr] Replace 풀이

name2965 2022. 6. 30. 18:18
728x90

 

이번 문제에서 주어진 파일은 실행파일 하나입니다.

 

 

 

 

별다른 readme.txt 파일없이 실행파일 하나만 있어서 어떤것을 해결해야 하는건지 막막하지만

일단 실행시켜보겠습니다.

 

 

 

프로그램은 이런 구조로 이루어져있습니다. 

특정 값을 입력해서 Wrong에서 Currect 와 같은 문자열로 바뀌게하는것이 목표일것 같습니다.

 

 

그런데 아무값이나 입력해보면 프로그램이 그냥 종료된다는것을 알수 있습니다.

이것이 원래 그런건지 아님 어떤 오류인지 잘 모르기 때문에

일단 분석을 진행하면서 알아보겠습니다.

 

 

IDA로 분석하다보면 문자열을 찾는 기능을 사용하는데

Wrong은 발견하지 못했지만, Currect! 라는 문자열이 보입니다.

 

한번 이 문자열이 쓰인곳으로 진입해보면

 

 

 

다음과 같은 구조를 하고있습니다.

메세지박스에 있는 텍스트를 Correct !로 바꾸는 분기가 있는데

문제는 Correct !로 바꾸는곳으로 분기가 이어져있지 않다는것입니다.

 

그러므로 이 부분으로 분기가 이어지도록 패치를 진행해야 할것같습니다.

그러므로 일단 x32dbg로 분석을 이어나가보겠습니다.

 

우선 1을 입력해서 분석을 진행해보겠습니다.

 

 

 

이 부분은 텍스트박스에 입력한 값을 받아오는 부분인데, 함수를 보면

값을 정수형으로 받는다는것을 알수 있습니다. 

그러므로 입력해야할 값은 정수형 입니다.

 

 

 

 

우선 GetDlgItemInt 함수가 호출되고나면 제가 입력했던 1이 eax로 반환됩니다.

그다음에는 eax값이 4084D0 주소로 복사됩니다.

 

그렇게 eax값이 복사된 주소의 덤프를 따라가보면 다음과같이 1이 있는것을 볼수 있습니다.

 

그런다음에는 사용자 정의 함수가 호출되는데 이 함수로 F7을 눌러서 진입해보겠습니다.

 

 

 

 

진입을 해보면, 다음과 같은 어셈블리가 보입니다.

 

하나하나 분석해보면, 또다른 함수를 호출한뒤 아까전에 eax값을 복사했던 주소에 601605C7이라는 값을 더합니다.

그다음에는 eax를 1더하고 bl과 ch값을 더해서 bl에 저장합니다.

 

 

다음함수로 진입해보겠습니다.

 

 

 

 

다음 함수로 진입해보면, 이런 구조로 되어있는데 619060EB라는 주소값을 406016 주소에 복사한뒤

또다른 함수를 호출합니다.

 

복사된 주소를 확인해보면

 

 

다음과 같이 주소값이 들어가있는것을 확인해볼수 있습니다.

 

그다음 함수 호출하는 부분을 잘보면, 바로 다음 주소를 호출한다는것을 알수 있습니다.

그러므로 결국 다음코드가 실행되게 되는것입니다.

 

다음 코드는 아까전에 eax값을 복사한 주소에 있는값을 1 증가시키는 코드입니다.

그런데 리턴을 하게되면, 이 함수를 다시 호출하게됩니다.

그래서 아까전 주소에 있던 값을 다시 1 증가시킵니다.

그래서 결과적으로 2가 증가합니다.

 

그 다음에 리턴하게 되면

 

 

 

 

아까전에 봤었던 코드입니다. 4084D0에 601605C7을 더합니다.

그다음에는 eax를 1 증가시킨뒤 bl과 ch를 더해서 bl에 저장합니다.

그래서 eax는 2가 됩니다.

 

 

 

 

그 다음에는 다시 함수를 호출시키는데 결국 다음 코드가 실행되는 방식입니다.

 

4084D0에 있는 값을 1 증가시키는것을 아까처름 2번 합니다.

그래서 결국 2가 증가합니다.

 

 

 

계속 진행해보면

다음과 같이 eax를 0으로 초기화시킨뒤

404690으로 점프합니다.

 

 

 

진행해보면, 4084D0에 있는 값을 eax에 복사합니다. 

그렇게되면 지금까지 연산했던 값인 601605CC가 eax에 복사됩니다.

 

그 다음에, 40469F가 스택에 푸쉬된뒤 404689를 호출합니다.

 

 

이 주소는 방금전에 호출한 주소 전에 있는 코드입니다.

이 코드도 아까와 같이 4084D0 주소에 있는 값을 1 증가시킵니다.

 

그 뒤에는 40466F 에 있는 값을 C39000C6으로 바꾸는 작업이 이루어진뒤 40466F를 푸쉬합니다.

그리고 40466F를 호출합니다. 

 

 

이 작업을 한뒤에 40466F의 어셈블리를 확인해보면 아까와 달라진것을 볼수 있습니다.

그러므로 아까전의 작업은 어셈블리를 임의의 코드로 바꾸는 작업이였다는것을 알수 있습니다.

 

그렇게해서 바뀐 곳으로 가게 되면 다음과 같이 나타나는데

문제는 여기서부터 진행이 되지 않습니다.

 

 

 

이 코드는 eax에 있는 주소에 90이라는 값을 복사하는것입니다.

eax에는 다음과 같은 값이 있습니다.

그리고 리턴한뒤 eax를 1 증가시킨뒤

다시 호출해서 그다음 주소를 90으로 복사합니다.

그 뒤에는 여러 과정을 거친뒤 401071로 점프합니다.

 

 

 

이 주소에 90이라는 값을 아까전에 어셈블리를 바꾸듯이 하는것입니다.

하지만 제대로 작동하지 않는 이유는 아마도 존재하지 않는 주소이기 때문일 것입니다.

 

그런데 지금까지의 분석에 의하면, 최종적으로 나오는 이 주소값은 입력값을 이용한 여러 연산을 통해서 나오는 값입니다.

 

분석을 종합해보면 최종적으로 나오는 이 주소값은

 

입력값(1) + 2 + 601605C7 + 2  = 601605CC

 

다음과 같은 과정을 통해서 값이 나오는것입니다.

그렇다면 이 주소값을 만드는 과정은 파악했는데, 과연 이 기능을 어떻게 써야 할까요?

 

 

우리가 이 프로그램에서 해야하는 목적은 프로그램상에 띄워져있는 텍스트인

Wrong을 Correct ! 로 바꾸는 것일겁니다.

그런데 아래 사진을 보면 

이 주소에 위치한 점프문으로 인해서 바뀌는 기능이 작동하지 않습니다

 

 

그러므로 Wrong을 Correct ! 로 바꾸기 위해서는 이 점프문을 없에야만 합니다.

아까전에 분석한 과정을 잘생각해보면, eax에 있는 주소를 90이라는 이진코드로 바꾸는것은

한줄을 nop로 바꾸는것과 같습니다.그러므로 계산과정을 역이용해서 입력값을통해서

401071이라는 값이 나오도록 한다면 이 점프문과 그 다음 주소의 어셈블리가

nop로 바뀌게 되면서 자연스럽게 목적을 달성할수 있게됩니다.

 

이 점프문의 어셈블리는 2 바이트의 크기를 가지고 있으므로 

프로그램의 크기가 깨지지 않으려면 401071과 401072의 어셈블리가 

nop으로 바뀌어야만 합니다.

 

이 프로그램에서는 이것을 의도하고 지정된 주소와 그 다음 주소를 nop으로 바꾸도록

문제를 출제한것 같습니다.

 

그렇다면 역산을 해봐야하는데

 

입력값 + 2 + 601605C7 + 2 = 401071

 

다음과 같은 식이 나옵니다.

이것을 계산기로 역산해보면

 

 

다음과 같은 값이 나옵니다. 32비트 환경인것을 감안해서 단위를 DWORD로 맞춘뒤 계산을 해보면

A02A0AA6 이라는 값이 나옵니다.

여기서 10진수로 표현하면 마이너스 단위로 나오는 이유는 32비트 연산체계를 넘어선 값이기 때문에

오버플로우가 일어나서 값이 작아지는 현상입니다. 그래서 이렇게 큰값을 넣으면

양수를 입력했는데 오히려 뺄샘이 되는 현상이 일어납니다. 

그렇기 때문에 우리가 원하는 401071이라는 값이 도출되는것입니다.

 

일단 이 값은 10진수 양수로 입력해야 하기 때문에 변환해보면 

2687109798 이라는 값이 나옵니다.

 

이 값을 프로그램에 입력해서 분석해보면

 

 

 

 

아까전에 있었던 점프문이 없어지게 되고 

 

 

 

순조롭게 우리가 원하는 기능으로 이어지게 되면서 최종적으로 

텍스트가 Correct ! 로 바뀌게 됩니다.

 

 

 

그러므로 이 문제의 답은 2687109798 입니다.

728x90

'워게임 > Reversing.kr' 카테고리의 다른 글

[Reversing.kr] ImagePrc 풀이  (0) 2022.07.02
[Reversing.kr] Music Player 풀이  (0) 2022.06.29
[Reversing.kr] Easy Unpack 풀이  (0) 2022.06.29
[Reversing.kr] Easy Keygen 풀이  (0) 2022.06.29
[Reversing.kr] Easy Crack 풀이  (0) 2022.06.29