반응형

 

Write-up 쓴 날짜 : 2022-09-30 10:29

 

MSVBVM50.DLL
1.29MB
Tut.ReverseMe1.exe
0.01MB
Tut.ReverseMe1_patched.exe
0.01MB

 

 

lena 10번 튜토리얼 디렉토리를 압축 해제하면 위의 사진과 같은 파일들이 뜬다.

 

 

files 파일로 이동하면 위의 사진과 같은 파일들이 존재하는데 이 중 Tut.ReverseMe1 파일을 디버깅할 것이다.

 

만약 Tut.ReverseMe1 파일이 실행되지 않으면, MSVBVM50.DLL 파일이 없어서 그런 것이니 해당 파일을 인터넷에서 찾아 Tut.ReverseMe1 파일과 동일한 위치에 둬야 한다.

 

주제 - Continued reversing techniques in VB, use of decompilers and a basic anti-anti-trick

 


 

 

Tutorial 10번의 Tut.Reverseme1 파일을 실행하면 위의 사진과 같은 화면이 나온다.

그리고 메시지가 보이는데 아래의 내용을 수행하라는 것이다.

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

확인 버튼을 누르면 아래와 같은 사진이 뜬다

 

 

화면에 파란 글씨로 reg를 위해 SmartCheck를 사용하라고 되어있다.

(SmartCheck는 Numega 사에서 만든 유틸리티이며 크래커들이 애용하는 툴 중 하나이다.)

 

 

Register me!를 누르면 Sorry! Wrong registration code! 라는 문구의 창이 뜬다.

 

확인을 누르면 창이 사라진다.

 

 

Nag! 버튼을 누르면 위의 사진 내용이 뜬다.

 

이 역시 확인을 누르면 창이 사라진다.

 


분석 2

 

먼저, Nag 메시지를 제거한다.

 

Nag 메시지는 아래의 사진 속 내용을 말하는 것이다.

 

 

이는 프로그램 시작할 때와 SmarkCheck를 사용하라는 파란 글씨가 보이는 창에서 Nag? 버튼을 눌렀을 때 나타난다.

 

 

x32dbg에 Tut.ReverseMe1을 로드하고, Entry Point로 이동한 뒤 스크롤을 조금 위로 올리면 위의 사진과 같이 ThunRTMain() 함수가 보인다.

 

Tut.ReverseMe1 코드 예측을 해보면, 메시지 박스를 제거하기 위해서는 메시지 박스 호출 부분을 조작하면 될 것 같다.

 

VB(Visual Basic)에서 메시지 박스 출력 함수는 MSVBVM50.rtcMsgBox이다.

 

 

dbg에서 위의 사진과 같이 빨간색 박스로 되어 있는 모듈간 호출 찾기 기능 아이콘을 들어가보면 아래와 같이 뜬다.

 

 

대상 열에서 “대상" 이라고 적힌 곳을 클릭하여 정렬한 뒤 보면 rtcMsgBox 함수가 총 4 곳에서 호출된다.

 

 

각 rtcMsgBox를 클릭하고 F2 키를 이용해 BP를 걸어둔 뒤 F9 키를 이용해 실행하면 BP가 설정된 곳에서 실행이 멈출 것이다.

 

 

실행이 멈추면 첫 번째 rtcMsgBox 함수 호출 부분인 402CFE에서 멈추게 된다.

 

 

그리고 402cFE에서 스크롤을 위로 올리면 위의 사진과 같이 Nag 창에서 봤던 문자열이 보인다.

(Get rid of all Nags and find the right registration)

이 부분이 바로 프로그램 시작할 때 나타나던 메시지 박스를 출력하는 코드 부분이다.

 

이어서 F9 키를 눌러 계속 실행 시키면 아래와 같이 메시지 박스가 출력된다.

 

 

확인 버튼을 선택하면 아래의 사진과 같이 메인 화면이 나타난다.

 

 

여기서 Nag? 버튼을 누르면 아래의 사진과 같이 402CFE에서 실행이 멈춘다.

 

 

처음 나타나는 메시지 박스와 메인 화면의 Nag? 버튼을 통한 메시지 박스 모두 같은 코드에서 실행되고 있다.

그렇다면 한 군데만 패치하면 된다.

패치하는 방법은 아래와 같이 여러가지가 있다.

  • 메시지 박스 제거
  • Registration Code 찾기

 


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

 

1차 시도

 

처음에 402CFE 주소의 CALL 명령은 아래와 같다.

 

 

이를 아래와 같이 수정한다.

(스페이스바를 누르고 명령어를 입력하고 엔터)

 

 

402CFE 주소의 add esp, E 명령어의 의미는 rtcMsgBox()에 전달되는 파라미터의 크기(14)만큼 스택을 정리하라는 명령이다.

(10진수 14는 16진수로 E에 해당한다.)

 

그리고 나머지 2byte만큼 NOP로 채워서 코드가 깨지지 않도록 한다.

(원래 CALL 명령어의 크기는 5byte이고, add 명령어는 3byte이므로 2byte가 남으니 nop 코드를 두 번 써서 남은 2byte를 채운다.)

 

CALL 명령어의 크기가 5byte인지 알 수 있는 방법은 CALL 명령어 부분을 보면 E8 1DE4FFFF로 되어 있는 것을 보고 5byte임을 알 수 있다.

 

이 코드는 문제가 없어 보이나, 결과는 에러를 발생한다.

 

이유는 rtcMsgBox() 함수의 리턴 값(EAX 레지스터)을 제대로 처리하지 못했기 때문이다.

 

 

위의 사진은 수정 전 원본 코드이다.

 

원본 코드로 와서 보면 402CFE에서 rtcMsgBox()를 호출한 이후에 402D0C 주소에서 리턴 값이 담긴 EAX를 특정 변수 EBP-9C에 저장한다.

 

여기서 메세지 박스의 리턴 값은 확인 버튼을 의미하는 1이어야 한다.

 

1 이외의 값이 지정되면 프로그램은 종료되게 된다.

 

그렇기에 이렇게 명령어를 수정하는 방법은 쓰면 안된다.

 

참고)

1. 402CFE 주소의 명령어를 아래와 같이 고칠 수도 있다.

위의 사진 속 두 줄의 어셈블리 코드는 rtcMsgBox() 함수를 호출 후 사용자가 확인 버튼을 눌렀을 때와 같은 결과를 보여준다.

(스택과 리턴

반응형

값이 동일하다.)

 

하지만 이렇게 하지 않는 이유는 명령어의 길이 때문이다.

원본 파일의 402CFE 주소의 명령어 길이는 5byte이지만, 위의 두 줄의 어셈블리 명령어의 길이는 8byte이므로 뒤쪽 코드를 침범하게 된다.

 

2. x86(IA-32) 시스템에서는 함수의 리턴 값을 EAX 레지스터를 사용하여 전달한다.

 

 

2차 시도

 

 

402CFE 코드에서 스크롤을 올려본다.

 

 

그러면 위의 사진과 같이 402C17 주소에 함수 시작을 나타나는 스택 프레임의 prologue가 있다.

 

402CFE의 rtcMsgBox 함수 호출 코드 역시 다른 함수 내부에 속해 있는 코드이기 때문에 상위 함수를 호출하지 못하게 하거나 아니면 바로 리턴해버리면 결국 rtcMsgBox 함수는 호출되지 않는다.

 

401C17 명령어의 원본 코드는 아래와 같고

 

push ebp
mov ebp, esp

 

이 코드를 아래와 같이 수정한다.

 

ret 4

 

참고) 함수에 전달된 파라미터만큼 스택을 보정(RET XX) 해야 한다.

 

이렇게 수정하고 나면 간단하게 메시지 박스를 제거하게 된다.

 


참고) 402C17 함수의 파라미터 개수를 확인하는 방법

 

 

402C17 주소에 F2로 BP를 걸어두고

 

 

F9 또는 F4키를 이용해 실행한다.

 

 

그 상태에서 스택에 저장된 리턴 주소(740DE5A9)를 확인해본다.

(스택의 값은 사용자의 환경마다 다를 수 있다.)

 

 

740DE5A9 영역은 MSVBVM50.dll 모듈 영역이다.

 

 

740DE5A9 영역에서 스크롤을 좀 올리면 740DE5A7 주소에서 call eax 명령어가 실행되고 나서 740DE5A9 주소로 리턴하도록 되어있다.

ret == mov && pop

 

 

디버거를 Ctrl+F2 키를 이용해 재실행하고, 740DE5A7 주소에 BP를 설정한 후

 

 

F9 키를 눌러 실행한 후 EAX의 값을 확인하면

 

 

402656 이라는 것을 알 수 있다.

 

 

402646 주소로 가보면 위 그림과 같이 402C17 주소로 JMP 하도록 되어 있다.

 

 

위의 두 개의 코드를 종합해보면 740DE5A7 주소의 call eax 명령에 의해 결국 402C17 함수가 호출되는 것을 알 수 있고, 이에 따라 740DE5A7 주소의 call eax 명령 호출 전/후의 스택 주소를 확인하면 402C17 함수 파라미터의 개수를 알 수 있다.

 

(winapi는 stdcall 호출 방식을 사용하므로 stack은 Callee에서 정리된다.)

 


패치(2) - Registration Code 찾기

 

Nag 메시지를 없애라는 첫 번째 목표는 완료했다.

 

두 번째 목표인 Registration Code를 찾아야 한다.

 

 

일단 프로그램을 실행한 뒤 아무 값이나 입력하고 Register me! 버튼을 누른다.

 

 

그러면 위의 사진과 같이 메시지가 뜬다.

 

 

위의 사진 속 Az 아이콘을 눌러 문자열 찾기 기능을 이용한다.

 

 

문자열 찾기 기능을 통해 나온 결과물이고, 이 중 Sorry ! Wrong registration code ! 부분을 더블 클릭 하여 이동한다.

 

 

위의 사진을 보면 402A2A 주소에 “I’m melena151” 이라는 문자열이 있고, 바로 그 밑에 있는 402A2F 주소에 __vbaStrCmp() 함수 호출 코드가 있다.

(문자열이 잘려서 I’mlena15까지만 보이지만 해당 명령어 줄에서 ‘;’ 키를 이용해 주석을 수정해보려 하면 정확히 보인다.)

 

vbaStrCmp() API는 VB에서 문자열을 문자열을 비교하는 함수이다.

 

즉 “I’mlena151” 문자열과 사용자가 입력한 문자열을 비교하는 것이다.

 

위의 사진과 같은 코드 부분에서 스크롤을 조금 더 위로 올려본다.

 

 

그러면 위의 사진과 같이 정확한 Registration Code를 입력했을 때 성공 메시지 박스인 “Yep ! You succeeded registering !”를 출력하는 코드이다.

 

 

그리고 스크롤을 조금 더 올려보면 4028BD 주소에 “I’mlena151”이라는 문자열이 있고 그 밑에 __vbaStrCmp 함수가 존재하므로 RegCode는 “I’mlena151”이 확실하다.

 

 

프로그램을 켜서 I’mlena151을 입력한 후 Register me!를 누르면 Yep ! You succeeded registering! 문자열이 뜬다.

 


참고) 파일 안에 정해진 시리얼 또는 패스워드 같은 어떠한 값이 있을 경우 HxD와 같은 프로그램으로 프로그램의 메모리 값들을 보면 정답을 출력하는 문자열 앞에 정해진 어떠한 값이 존재한다.

 

반응형

'전쟁 > lena tuts4you' 카테고리의 다른 글

[Lenatuts4you] 10-3. CConvert  (0) 2022.11.02
[Lenatuts4you] 10-2. ReverseMe2  (0) 2022.11.02
[Lenatuts4you] 9. pc2am2p  (0) 2022.11.02
[Lenatuts4you] 8. artgem11  (0) 2022.11.02
[Lenatuts4you] 7. MrBills  (1) 2022.11.02

+ Recent posts