비베로 짜여진 프로그램이다 .

 

우선 어떤 프로그램인가 실행을 해보면

일반적인 뮤직 플레이어라는걸 확인 할 수 있다.

다만, 1분만 재생이 가능하다는 것이다 .

우리의 목표는 이 1분 미리듣기 구간을 건너뛸 수 있게 만드는 것이다.

 

비베의 메시지 박스를 호출하는 rtcMsgBox 함수를 호출하는 부분을 찾으면 된다 .

위 그림을 보면, rtcMsgBox 를 찾아가 B.P 를 걸고,

1분 미리듣기 메시지박스로 넘어가기를 기다려보자 .

 

그럼 1분이 지나는 순간 B.P 를 걸어두었던 곳에서 멈추게 된다.

이때 호출한 위치는 콜스택에 저장이 된다 .

위의 그림에서 4045DE 는 이 스택이 해제되고 난 뒤에 실행될 주소를 뜻한다.

Ret 라고도 하며 이 부분을 변조하는 BOF 공격이 존재한다 .

 

다음 명령어가 실행될 주소가 EIP 에 저장이 되는데,

함수 호출로 인해 스택 프레임이 다시 만들어 지는 경우

스택이 해제되며 EIP 는 이곳을 참조하여 다음 실행될 명령어의 주소를 가지게 된다 .

즉, 저 주소의 바로 전단계가 메시지 박스를 호출한 위치라는걸 확인할 수 있다.

밑의 그림을 참고하자 .

위의 그림의 부분을 봤을 때 명령어들이 주르륵 실행되다, 메시지 박스를 띄우는걸 확인할 수 있다.

 

그럼 1분이 되지 않았을 때 저 부분을 건너뛰는 분기점이 있을것이다.

그럼 그 부분에 대해 찾아보도록 하겠다.

위로 조금만 올리면 보인다 .

 

 

위 그림에서 1번 부분을 보면 EAX 와 0EA60 과 비교를 하고,

EAX 가 작을 경우 점프를 하게 된다 .

 

0xEA60 은 10진수로 표현하면 60000 이다.

프로그래밍 시 시간에 관련된 함수들이 대부분 m/s 단위인걸 보면

60초를 의미하는걸 알 수 있다.

 

당연히, 점프구문은 1분 미리듣기 메시지박스 호출 부분을 건너 뛰게 된다 .

 

그럼 우리는 저 비교구문의 값을 크게 키운다면 1분을 넘을 수 있다고 예상할 수 있다.

 

그럼 우린 60초였던걸 120초로 변경해 보도록 하겠다 .

( 0x1D4C0 = 120000 )

 

끝난 줄 알았던 이 문제에 마지막 관문이 남았다 .

 

네모친 부분의 주소로 넘어와 예외에 걸리게 되는데

Shift + F9 로 넘기면 음악은 재생되지만,

런타임 에러라는 380번 에러를 만나게 된다 .

우린 이부분까지 우회를 해야한다 .

 

예외가 걸리던 부분에서 콜스택을 불러보겠다 .

아까와 똑같다 4046BF 바로 윗부분에서의 호출로 타고 이어져 내려온걸 확인 할 수 있다.

그럼 간단히 윗부분을 우회하는 곳이 존재하는가 확인을 해보자 .

 

그림이 좀 복잡하지만, 콜 스택을 보고 따라온 그대로의 위치이다 .

1번 의 점프구문을 점프하면 런타임 에러를 뿜는 함수의 호출을 건너 뛸 수가 있다.

그럼 우린 바로 위의 TEST EAX, EAX 구문을 바꿔서 우회하게 해보도록 하겠다 .

여기서 EAX 가 무조건 0이 나오도록 해야 한다.

고로 XOR EAX, EAX 로 바꿔서 우회를 해봐야 겠다 .

 

성공적으로 우회를 했다.

1분이 넘어가자마자 윈도우 캡션이 바뀌는걸 확인할 수 있었다.

'WarGame > Reversing' 카테고리의 다른 글

Reversing.kr – Easy KeygenMe 풀이  (0) 2015.10.31
Reversing.kr – Easy CrackMe 풀이  (0) 2015.10.29

+ Recent posts