CodeEngn Reversing Basic_Level12

아무 것이나 입력하고 Check를 눌러보면 아무 창도 뜨지 않는다. 성공했을 때만 메시지가 뜨는 것 같다.

PEiD로 확인해보았다. 패킹은 되어있지 않은 것 같다.

ollydbg로 referenced string을 찾아보려 했는데 이런 오류가 나며 실행되지 않는다. 환경 설정의 문제인지 프로그램의 문제인지 모르겠다.

다행히 코드가 길지 않아 바로 쓸만한 문자열이 보인다. 해당 문자열 근처에 분기가 있을 거라 기대한다. 위의 점프문을 살펴보았다.

성공 메시지 출력 위의 점프문이다. 바로 위에는 cmp가 있다. EAX의 값을 7A2896BF와 비교하고 같지 않으면 점프한다. 입력 값을 이용하여 위쪽 코드를 실행한 뒤 EAX에 값을 저장하는 것 같다. 입력 값으로 7A2896BF를 넣었을 때는 반응하지 않았다.  

abc를 입력한 뒤 cmp 하는 순간 레지스터 값을 확인해보자.

EAX가 0이다. 그렇다면 어떤 계산을 통해 EAX에 값이 들어오는지 알아보자.

성공 메시지를 띄우는 코드의 위쪽을 보면 이상한 문자열이 있다. 그 위에는 GetDlgItemInt가 있다. 이 함수는 입력 값을 받아오는 함수인데, 마지막 Int에 주목할 필요가 있는 것 같다. 아무래도 숫자만 넣어야 하는 것 같다.

GetDlgItemInt 함수는 숫자 이외의 값이 들어오면 0을 반환한다 한다. 그렇다면 숫자를 넣었을 때 EAX값을 확인해보자.

12를 입력했을 때 EAX의 값은 0xC로, 12이다. 입력값을 10진수로 넣어야 하는 건가? 또 다른 숫자를 넣어보자.

입력 값으로 12345를 넣은 경우이다. 12345는 16진수로 0x3039이다. 10진수 변환하여 입력해야 하는 것이 맞는 것 같다.

7A2896BF가 10진수로 무슨 수인지 계산해보면 2049480383 이다.

2049480383 을 입력해 보았다.

맞았다. flag값의 앞 부분은 2049480383 이다.

사실 처음 풀 때는 GetDlgItemInt함수 사이와 cmp 사이의 코드를 분석하려고 꽤 삽질을 했다. 더미 코드라는 것을 알 때까지… 그 후로 무조건 코드를 분석하려 하지 말고, cmp하는 값을 비교해 보고 판단하기로 했다.

그럼 문제가 요구한 문자열 수정에 대해 알아보자.

MessageBox에 출력을 하기 위해서는 원래 출력하는 성공 메시지를 정답 + null 로 변경하면 된다. 숫자를 문자열로 입력할 때는 아스키 코드로 입력해야 함에 주의한다.

EXE 파일의 데이터 부분에서 성공 메시지를 변경하였다.

위와 같이 수정하고 저장한 뒤 실행했다. 00000D3B~00000D45 범위의 파일을 수정했다. 뒤의 네 글자를 이용해서 0D3B0D45가 flag의 뒷자리가 되겠다.

따라서 flag는 20494803830D3B0D45이다.


tags: writeup, reversing, pe file, windows, x86asm