본문 바로가기
게임해킹/리버싱 핵심원리(나뭇잎책)

11장 Lena's Reversing for Newbies

by HHack 2024. 12. 16.
반응형

11.1 실행

크랙하려는 파일을 먼저 실행해보겠습니다.

11.1 초기 메시지 박스

메시비 박스가 뜨면서 두 가지를 지시합니다.

  • 모든 성가신 Nags를 없애라.
  • registration code를 찾아라.

[확인]을 선택하면 메인 창이 나타납니다.

11.2 메인 화면

전형적인 serial crackme입니다. 화면의 파란 글씨를 읽어보면 registration을 위해 'SmartCheck'를 사용하라고 합니다.

※ SmartCheck : Numega사에서 만든 유틸리티이며, 크래커들이 애용하는 툴 중 하나

11.2 분석

11.2.1 목표(1) - 메시지 박스 제거

첫 번째 목표인 Nag 메시지를 제거해보겠습니다. 그림 11.1의 메시지 박스를 의히마는 것인데 이것은 프로그램을 시작할 때와 그림 11.2에서 [Nag?] 버튼을 눌렀을 때 나타납니다. 디버거로 파일을 열어보겠습니다.

11.3 EP 코드

코드를 한 번 예측해보겠습니다. 메시지 박스를 제거하기 위해선 메시지 박스 호출 부분을 조작하면 될 것 같습니다. Visual Basic에서 메시지 박스 출력함수는 MSVBVM50.rtcMsgBox 입니다.

 

"오른쪽 버튼 -> 다음을 찾기 -> 모든 모듈 -> 모듈간 호출"을 통해 프로그램에서 사용되는 API 호출 목록을 확인합니다.

11.4 모듈간 호출

그림 11.4에서 rtcMsgBox를 검색해 호출되는 부분을 찾고 모든 rtcMsgBox 코드에 BP를 설치합니다.

11.5 msgbox 검색 후 BP 설치

이 상태로 디버거에서 프로그램을 실행시킵니다. BP 설치된 곳에서 실행이 멈췄습니다.

11.6 402CFE 주소에서 실행이 멈춤

  402CFE 주소에서 실행이 멈췄는데, 위로 조금 스크롤을 올려보면 그림 11.1에서 봤던 메시지 박스의 문자열이 보입니다. 이 부분이 바로 프로그램 시작할 때 나타나던 메시지 박스를 출력하는 코드 부분입니다.

  계속 실행을 시켜보면 그림 11.1의 메시지 박스가 출력되고, [확인] 버튼을 선택하면 그림 11.2의 메인 화면이 나타납니다. 여기서 [Nag?] 버튼을 누르면 그림 11.6의 402CFE 에서 실행이 멈춥니다. 처음 나타나는 메시지 박스와 메인 화면의 [Nag?] 버튼을 통한 메시지 박스 모두 같은 코드에서 실행이 되고 있다는걸 알 수 있습니다. 

11.2.2 패치(1) - 메시지 박스 제거

1차 시도

처음에 402CFE 주소의 CALL 명령을 아래와 같이 수정해보겠습니다.

[원본]
00402CFE	CALL <JMP.&rtcMsgBox>			; rtcMsgBox
[수정]
00402CFE	ADD ESP,14				; 스택정리
00402D01	NOP					
00402D02	NOP

  402CFE 주소의 "ADD ESP, 14" 명령어의 의미는 rtcMsgBox()에 전달되는 파라미터 크기(14)만큼 스택을 정리하라는 명령입니다. 그리고 2바이트만큼 NOP으로 채워서 코드가 깨지지 않도록 하였습니다.

  문제가 없어보이나 결과는 '에러 발생'입니다. 그 이유는 rtcMsgBox() 함수의 리턴 값(EAX 레지스터)을 제대로 처리하지 못했기 때문입니다.

11.7 402CFE 주소의 rtcMsgBox() 호출

  그림 11.7을 보면 402CFE 주소에서 rtcMsgBox()를 호출한 이후에 402D0C 주소에서 리턴 값(EAX)을 특정 변수([EBP-9C])에 저장합니다. 여기서 메시지 박스의 리턴 값은 1이어야 합니다. 1 이외의 값이 저장되면 프로그램은 종료됩니다.(MsgBox 공식문서 참조)

https://learn.microsoft.com/ko-kr/dotnet/api/microsoft.visualbasic.interaction.msgbox?view=netframework-4.7.2

 

Interaction.MsgBox(Object, MsgBoxStyle, Object) 메서드 (Microsoft.VisualBasic)

대화 상자에 메시지를 표시하고 사용자가 단추를 클릭할 때까지 대기한 다음 클릭된 단추를 나타내는 정수를 반환합니다.

learn.microsoft.com

 

※ MOV EAX, 1로 하지 않은 이유

ADD ESP, 14
MOV EAX, 1

위와 같이 하지 않은 이유는 명령어의 길이 때문입니다. 원본 파일의 402CFE 주소의 명령어 길이는 5바이트 입니다. 하지만 위 두줄의 어셈블리 명렁어의 길이는 8바이트입니다. 따라서 뒤쪽 코드를 침범하게 됩니다.

2차 시도

그림 11.6의 코드에서 스크롤을 좀 더 위로 올려보면 402C17 주소에 함수 시작을 나타내는 스택 프레임의 프롤로그가 보입니다.

11.8 스택 프레임

  402CFE의 rtcMsgBox 함수 호출 코드 역시 다른 함수 내부에 속해 있는 코드입니다. 따라서 상위 함수를 호출하지 못하게 하거나 아니면 바로 리턴해버리면 rtcMsgBox 함수는 호출되지 않을 것입니다.

  402C17 명령어를 다음과 같이 수정합니다.

[원본]
00402C17	PUSH EBP
00402C18	MOV EBP,ESP
[수정]
00402C17	RET 4				; 바로 리턴
						; 함수에 전달된 파라미터만큼 스택을 보정

이로써 메시지 박스를 제거하였습니다.

00402C0B	MOV DWORD PTR FS:[0],ECX		; ecx:__vbaI4Var+C
00402C12	POP EBX
00402C0B	RET 4					; 바로 리턴

★ 참고 - 파라미터의 개수 확인하는 방법

1. 402C17 함수 시작 코드에서 스택에 저장된 리턴 주소(7401E5A9)를 확인합니다.

11.9 리턴 주소

2. 리턴 주소로 가봅니다. 이 코드 영역은 MSVBVM50.dll 모듈 영역입니다. 7401E5A7 주소의 CALL EAX 명령어가 실행된 후 7401E5A9 주소로 리턴하도록 되어있습니다. 디버거를 재실행시키고 7401E5A7 주소에 BP를 설치 한 후 시랳아면 EAX 값이 402656 이라는 것을 알 수 있습니다.

11.10 MSVBVM50,dll 모듈
11.11 EAX값 확인

3. 402656 주소로 가보면 아래 그림과 같이 결국 402C17 주소로 JMP 하게 되어있습니다. 그림 11.10 ~ 11.12를 종합해보면 7401E5A7 주소의 CALL EAX 명령에 의해서 402C17 함수가 호출된 것을 알 수 있습니다. 따라서 7401E5A7주소의 CALL EAX 명령 호출 전/후의 스택 주소를 확인하면 402C17 함수 파라미터의 개수를 알 수 있습니다.

11.12 402656 주소의 코드

11.2.3 목표(2) - Registration Code 찾기

이번엔 Registration Code를 찾는 것이 목표입니다. 일단 아무 값이나 입력해봅니다.

그림 11.13 RegCode is wrong! 메시지 박스

잘못된 Registration Code라고 나타납니다. 한 번 저 문자열을 검색해보겠습니다.

11.14 문자열 찾기

402A69 주소의 코드를 살펴보면 아래의 그림 11.15와 같이 나옵니다.

11.15 402A69 주소의 코드

  그림 11.15를 보면 402A2A 주소에 "'mlena151"이라는 문자열이 나옵니다.(이유는 모르겠는데 x32dbg에선 I가 생략되었습니다. 덤프를 보면 문자열이 제대로 들어가 있음을 확인할 수 있습니다.) 그리고 바로 그 밑에 402A2F 주소에 __vbaStrCmp() 함수 호출 코드가 있습니다. 이 함수는 VB에서 문자열을 비교하는 함수입니다. 즉, "I'melna151"문자열과 사용자가 입력한 문자열을 비교하는 것입니다.

  위 내용을 토대로 정확한 값을 입력하면 성공 메시지 박스가 출력됩니다.

11.16 성공 메시지 박스

11.3 마무리

www.tuts4you.com  사이트에 방문해서 원 저작자 lena의 동영상을 보면 더욱 많은 도움이 될 것입니다. 또한 사람마다 분석하는 방법이 다르므로 여러 사람의 분석 방법을 다양하게 알아두는 것이 좋습니다.

반응형