Haekt‘s log

[리버싱] reversing with lena-tutorial 1 본문

Reversing

[리버싱] reversing with lena-tutorial 1

Haekt 2022. 9. 20. 12:26

- 사용 툴

  • X32dbg
  • exeinfope

reverseMe.exe
0.01MB
keyfile.dat
0.00MB

 

- 01. 해당 파일의 실행 환경 확인

 

이번에 해볼 리버싱파일은 reversing with lena-tutorial 1 의 reverseMe.exe 파일이다. 

 

 

한번 먼저 실행을 시켜보자. 

 

new license 를 구매하라는 것을 보니, license 를 얻어내는 것이 목표인듯 하다.

.

 

 

먼저 그냥 x64dbg , x32dbg 에 무작정 넣어서 어떤 환경에서 실행되는지 확인할수도 있으나,

다양한 툴을 활용하는 법을 키우기 위해

exeinfope 툴을 사용해서 reverseMe.exe 파일을 살펴보았다.

 

Image is 32bit executable 이라고 뜨는 걸 보니 32bit 환경에서 실행되는 파일임을 알 수 있었다.

그럼 이제 x32dbg 에 넣어서 확인해보자 .

 

- 02. 툴에서 MessageBox 가 뜨는 부분 확인 

 

먼저 f9를 눌러 엔트리 포인트로 이동해 준다. 

 

그 후 control + a 를 눌러 문자열 찾기를 통해 Message Box가 뜨는 부분을 찾아준다.

그후 상단바의 문자열 찾기를 눌러 찾은 문자열을 확인해 준다.

 

 

상단바의 문자열 보기를 통해 여러가지를 볼 수 있었는데, 먼저 keyfile.dat 이라는 부분이 보였다.

아마 license 파일의 이름이지 않을까 생각된다. 일단 purchase new license 부분을 살펴보자. 더블클릭.

 

00401084 로 이동되었다. 

 

00401084 로 진행하는 중간에 점프문이 jne 하나밖에 없는데, 이친구가 

purchase new license 의 다음 부분을 가리키는 것을 보아,

license 파일이 없을 경우 점프하는 것으로 보인다.

 

jne - 비교했을때 같지 않을 경우 점프

 

cmp eax, FFFFFFF 가 보인다. eax 에 무슨 값이 담기는지 보기 위해 f8 을 이용해 하나씩 실행해보자.

 

 

- 03. 순차 실행을 통한 작동 원리 파악

 

cmp 를 하기전 함수가 하나 실행된다. 혹시 모르니 함수 실행전에 eax 값을 확인했다. 

 

함수를 지나니 eax 값이 FFFFFFFF 로 변경되었다. 그래서 점프를 하지 않고, purchase new license가 뜨게 되는 것 같다.

 

검색해보니 CreateFile 함수는 윈도우에서 파일 혹은 오브젝트를 열거나 생성하는 함수라고 한다.

 

HANDLE CreateFile(

    LPCTSTR lpFileName,

    DWORD dwDesiredAccess,

    DWORD dwShareMode,

    LPSECURITY_ATTRIBUTES lpSecurityAttributes,

    DWORD dwCreationDisposition,

    DWORD dwFlagsAndAttributes,

    HANDLE hTemplateFile);

위의 코드는 함수의 원형이다. 참고 사항으로 넣어 놓았다. 

함수를 더블클릭하여 함수 안으로 들어가보자. 

 

위의 함수 원형의 인자와 같은 크기를 push 하는 것이 보인다.

 

함수의 작동 과정을 보기위해 함수의 제일 윗부분에 중단점을 설정하고, f9를 누른 후 순차적으로 실행시켜 보자.

 

 

함수 내부에서 EDX에 위에서 봤던 keyfile.dat 의 값 402079 를 넣는 것을 볼 수 있었다.

 

keyfile.dat 이 뭐길래..  keyfile.dat 을 읽고, 못읽으면 FFFFFFFF 를 넣는건가?

궁금한건 못참지! 

 

Keyfile.dat 을 생성해보자. 

 

- 04. 키 파일 생성

 

exe 파일이 있는 공간에 메모장을 이용하여 keyfile.dat 을 생성해 보았다.

안에 내용은 G 하나만 입력하였다.

 

이제 다시 실행해보자.

 

결과적으로, eax 에 FFFFFFFF 가 안담겼으며, purchase new license 문을 건너뛰고 진행되었다.

 

마찬가지로 순차진행..

 

내가 입력했던 G 하나가 떴다. 계속 진행 ..

 

Keyfile is not valid. Sorry 문으로 점프 되었다. 

저곳으로 점프하는 조건을 보자.

 

바로 위의 cmp문을 보면 402173 의 부분과 0x10  을 비교하여 0x10 보다 작으면 점프를 하게 되어있었다. 

 

402173 으로 가보자.

툴 하단 덤프에서 control + G 를 누르면 해당 주소로 이동할 수 있다. 이동해보자. 

 

01 이 입력되어있었다. G 하나 입력했는데, 01이 나왔다.

문자의 갯수를 뜻하는 걸까? 

더 입력해보자. 

 

이번엔 GGGG  총 4개 

04가 입력된걸 보니, 문자의 갯수가 맞는 것 같다. 

그럼 점프를 하지 않게 0x10 에 맞는 갯수를 입력해보자. 

 

0x10 == 16

 

GGGGGGGGGGGGGGGG

 

그랬더니 점프가 되지않고, 아래에 있던 한 반복문이 등장하였다. 

 

천천히 하나하나 살펴보자.

 

- 05.  문자열 비교 반복문 해석

 

mov al,byte ptr ds:[ebx+40211A]

ebx+40211A 의 값을 al에 byte 만큼 저장하고, 

 

cmp al,0

al 의 값이 0 인지 확인.

 

je reverseme.4010D3

( jump equal )  같을 경우 cmp esi,8 명령어로 점프한다. 

 

cmp al, 47

 같지 않을 경우 al 의 값이 47 인지 확인.

 

0x47은 G 라고 바로 옆에서 친절히 알려줬다. 

 

jne reverseme.4010D0

al 이 47이 아닐경우 inc ebx 로 점프.

 

inc esi   // jne 통과했을 경우 실행
inc ebx   //jne 문이 가리키는곳

같을 경우 esi 를 1 증가. 

그리고 같아도, 같지 않아도 그냥 ebx 1 증가.

 

jmp reverseme.4010C1

 

다시  mov al,byte ptr ds:[ebx+40211A] 문으로 점프 

 

cmp esi,8

esi 를 8이랑 비교

 

jl reverseme.4010F7
jmp reverseme.401205

esi 가 8 보다 작을경우 keyfile is not vaild. sorry 문으로 점프

그리고 reverseme.401205로 점프

 

여기서 reverseme.401205 는 따라가보니

 

you really did it! congratz!!! 문의 앞부분이었다. 

 

 

- 06. 요약

 

앞의 코드 내용을 요약해 보자면,

 

47( G )과 비교해서 같으면 esi 1 증가.   =>   esi의 크기 == G 의 갯수

 

0과 비교해서 같으면 esi와 8을 비교하는 부분으로 점프   =>  문자열의 끝도 0 이므로, 문자열의 끝을 만나면 비교문으로 점프

 

만약 esi 가 8 보다 클 경우 성공을 띄우고, 8보다 작으면 실패를 띄운다.   =>  G의 갯수가 8보다 작으면 실패, 8이상이면 성공!

 

 

 

 

- 07. 결론

 

답이 나왔다. 

 

keyfile.dat 이름의 파일을 검사하고,

 

안의 문자열 길이가 16개 인지 확인하고,

 

문자열에 G가 8개 이상인지 확인하고,

 

맞다면 성공을 띄운다.

 

 

G를 8개 이상 입력해보자.

 

메모장으로 파일을 열고,

 

나는 귀찮아서 G 16개 입력..

 

저장하고, reverseMe.exe 를 실행해보자

 

 

성공!

 

Comments