본문 바로가기

컴퓨터와 보안/리버싱

Lena's Reversing for Newbies

 

ReverseMe1.zip
0.68MB

오늘은 위의 파일로 리버싱 실습을 진행해 보도록 하겠다.

 

 

그림 1

파일을 실행하면 다음과 같은 창이 뜬다.

Nags를 전부 삭제하고 registration code를 찾으라는 말을 한다.

 

그림 2

확인을 누르니 다음과 같은 창이 뜬다.

 

아마도 Regcode는 우리가 찾아야 하는 registration code를 말하는 거 같다.

1234를 입력하고 Register me!를 누르니

 

그림 3

다음과 같은 창이 뜬다.

 

그럼 이제 디버깅을 진행하기위해 ollydbg로 해당 파일을 열어보겠다.

 

그림 4

오늘도 평소와 마찬가지로 F8을 누르며 천천히 진행해 본다.

 

00401160 부분에서 그림 1의 창이 뜬다.

아마 Nags를 없애라는것은 그림 1의 창이 뜨지 않게 하라는 뜻인 거 같다.

 

그림 5

우선 search for all referenced text string을 통해 대충 의심이 가는 지점을 찾았다. 우선 레지스트링에 성공했다는 메세지가 있는 004028F5 지점으로 이동해 Regcode를 찾아본다.

 

그림 6

 

이런 문구들이 보인다. 위의 UNICODE "I'mlena151" 이 매우 수상했다. 저걸 스택에 넣고 StrCmp 문자열 비교 함수를 호출하는 부분이 이곳과 틀린 문구를 출력하는 부분에도 있었다.

다시 확인해보니 004028E3에 JE 분기문도 있다. 아마 문자열을 비교하고 그 결과로 분기문이 실행되는 거 같다.

그럼 비교대상인 I'mlena151을 그대로 입력해본다.

 

그림 7

 

그림 8

확인완료!

이제 Nags 창이 뜨지 않게 디버깅 해보자

그림 9

Search for all intermodular call 을 통해 MsgBox의 존재를 알아냈다.

이제 이 MsgBox 중에 Nags 창을 불러오는 MsgBox를 찾는다.

 

그림 10

다음 주소에서 BP를 걸었을 때 Nags창이 실행되지 않았다.

이걸 어떻게 하면 실행되지 않게 하고 넘어갈 수 있을까?

 

처음엔 CALL 명령어를 조작하려는 시도를 했다. 다른 API를 불러옴으로써 메시지박스가 실행되지 않고 프로그램이 제대로 진행되길 바랬는데 몇개를 넣어보니 작동이 멈추는 현상이 계속 발생했다.

 

위쪽으로 커서를 쭉 올려보니 이 부분이 하나의 Nags 메시지를 호출하는 함수임을 알 수 있었다.

 

그림 11 Nags함수 단서

그럼 이 함수를 시작부터 실행되지 않게 하는 방법이 있을것이다.

그림 12 Nags함수 시작부분

위쪽의 PUSH EBP, MOV EBP, ESP가 함수의 시작부분이다.

(함수를 호출할때 EBP를 스택에 넣고 ESP를 EBP로 옮기는 과정을 한다.)

그럼 EBP를 스택에 넣지 않고 바로 RETN을 해버리면 어떨까

그림 13

바로 함수가 Return이 되게 어셈블리어를 수정했다.

실행을 해보면 Nags 경고창이 안뜨고 바로 그림 2의 창이 뜨는것을 확인할 수 있다.

Nag? 버튼을 클릭해봐도 Nags 경고창이 뜨지 않는다.

 

어찌저찌 해결하긴 했지만 RETN 4를 입력한 이유는 사실 바로 위쪽에 RETN 4가 있어 그냥 똑같이 입력해 본 것이다.

RETN 4 가 RETN + POP 4 와 동일하다는 것은 알고 있고 RETN 전에 스택을 정리해줘야 하는 것도 알고 있지만 왜 4만큼의 주소를 POP 해야 하는지는 사실 정확히 모르고 했다.

 

그 이유를 찾아보자

 

그림 14

RETN 전에 스택을 정리해줘야 하는 것은 이미 알고 있었다.

어떻게 스택을 정리할 수 있을까?

 

해당 함수를 부른 CALL에서 CALL을 부르기 전과 후의 ESP를 확인해 원래 함수의 ESP가 변동이 없도록 

같은 값으로 POP를 해주면 될 것이다! 

어떻게 이 값을 확인할 수 있을까?

 

그림 15
그림 16

해당 함수를 CALL을 통해 호출할 때 스택에 CALL 호출 후 RETN 할 때 어디로 복귀 해야 하는지에 대해 이 주소를 스택에 저장한다. 스택에 저장된 값은 그림 16과 같다.

 

해당 주소로 Follow in Disassembler 해서 확인해보자.

그림 17

CALL EAX를 통해 함수가 호출되었음을 알 수 있다.

CALL EAX의 주소가 아닌 MOV ESP, EBP의 주소가 복귀주소로 지정된 이유는 CALL EAX를 통해 함수가 실행된 후 

복귀하는 주소는 다음 명령어가 있는 주소가 되어야 하기 때문이다.

 

자 그럼 CALL EAX 함수가 실행되기 전 ESP와 실행된 후 ESP를 비교해보자

이를 위해서는 모듈에 BP를 걸어야 하는데 모듈에 BP를 거는 법은 다음과 같다. (이거땜에 꽤 헤맸다...)

 

그림 18

 

1. View Executable modules에 들어간다.

 

그림 17

2. 아까 복귀주소가 MSVBVM50 모듈을 가리켰으므로 MSVBVM50을 더블클릭해 들어간다.

 

그림 18

3. Ctrl + G 키를 이용해 수정하려는 곳으로 이동한다.

4. BP를 건다.

 

자 이제 일련이 과정이 끝났다.

 

디버깅을 진행하면서 ESP의 변화를 살펴보자

 

그림 20 Nags함수 실행 전
그림 21 NAgs 함수 실행 후

ESP의 변화가 다음과 같이 나타나나는것을 볼 수 있다.

함수 실행 전에 0019FAB8에서 0019FABC로 변화했으므로 ESP는 4가 증가했다.

따라서 RETN 4를 통해 리턴과 동시에 스택을 정리해주면 된다!

(RETN + POP 4 를 통해 원래 증가하는 ESP값 4를 유지해준다.)

 

리턴과 동시에 스택을 정리하는 방식을 stdcall 방식이라 하는데 함수 호출 규약 포스팅에서 자세히 다루도록 하겠다!