'__vbaVarTstEq'에 해당되는 글 1건

  1. 2010.03.07 [Reversing With Lena] lena's tutorial 09 풀이
0x03 Reversing/Reversing2010.03.07 17:07
1. 개요
예제 문제 및 강의 내용 출처 : http://tuts4you.com lena로 검색

이번 Lena의 9장 강의에서는 지금까지의 분석했던 프로그램들과는 달리 Visual Basic으로 만들어진 프로그램을 리버싱하는 방법을 보여준다.

Ollydbg : http://www.ollydbg.de
SmartCheck : http://forum.esoft.in/other-softwares/13100-numega-smartcheck-v6-2-build-1286-a.html

2. 분석


PEiD를 이용하여 해당 프로그램을 로딩해보면 Visual Basic으로 작성된 프로그램인 것을 확인할 수 있다. Visual Basic  프로그램은 C / C++로 작성된 프로그램과는 달리 Event 중심의 프로그램인 경우가 많다. 따라서 이벤트를 처리하는 별도의 Sub routine을 갖는 경우가 많으며, Visual Basic의 경우 DLL(Dynamic Link Library)을 사용하는 경우가 많다. 따라서 프로그램 시작시에는 DLL 파일들을 로딩하지 않다가 필요한 부분에서(해당 함수를 호출했을 경우) DLL 파일을 로딩하여 요청을 처리한다. 이렇게 함으로써 메모리 절약의 효과를 볼 수 있는 것이다. DLL을 호출했다가 메인 프로그램으로 흐름이 돌아오고 다시 DLL을 호출하는 식의 프로그램을 Ollydbg를 이용하여 분석하기에는 조금 어려운 면이 있다고 한다. 따라서 이번에는 SmartCheck라는 디버깅 툴을 이용해서도 해당 프로그램의 흐름을 분석한다.

○ Visual Basic 파일 특징
① VB 전용 엔진의 사용

VB 파일은 MSVBVM60.dll 파일을 이용한다. VB 프로그램 내에서 어떤 API를 호출하게 되면 MSVBVM60.dll 파일에서 해당 API에 대한 처리를 해주게 된다.

② N(Native) code, P(Pseudo) code 가능
VB은 컴파일 옵션에 따라서 일반적인 디버거에서 해석 가능한 IA-32 명령어를 사용하는 N code로 컴파일 되거나, VB 가상머신에서 자체 해석을 통한 실행가능한 형태인 P code로 컴파일이 가능하다.
P code의 대표적인 언어로는 JAVA(JVM 이용), Python(Python 전용 엔진) 등이 있다.

③ Event Handler 기능
VB은 앞에서 말한대로 주로 GUI 형식의 프로그래밍을 할 때 사용되어 지며 event driven 방식으로 작동하다보니 우리가 디버깅하려는 코드가  main(), WinMain()등에 존재하는 것이 아니라 event handler에 사용자 코드가 존재한다.

④ undocumented 구조체
VB에서 사용되는 각종 정보들(Dialog, Control, Form, Module, Function 등..)은 내부적으로 구조체 형식으로 파일에 저장된다. 이런 구조체의 정보는 공개되지 않았기 때문에 디버깅에 어려움이 있다.

일단 Olly로 프로그램을 로딩한 후 실행을 시켜보자.
프로그램을 실행하는 과정에서 정상적으로 등록된 프로그램인지 검증한 뒤 그렇지 않을 경우 위와 같이 등록키를 입력하라는 메세지를 발생시키는 것을 알 수 있다. 프로그램 실행시 등록키와 정상적인 키와의 비교시 사용하는 API로는 VB에 아래와 같은 것들이 있다고 한다. 이중에서 Olly에서 Ctrl+N을 누른 뒤 __vbaVarTstEq 을 찾아보자.
__vbaVarTstEq //등록여부를 검증하는 것과 관련된 부분으로 자주 사용
__vbaVarTstNe
__vbaVarCmpEq
__vbaStrCmp
__vbaStrComp
__vbaStrCompVar

__vbaVarTstEq을 찾은 뒤에 위와 같이 해당 부분에 모두 BP를 설정한다. 이후 프로그램을 실행해 보자.

주번째 BP에서 조금 하위로 프로그램을 진행하다가 보면 위와 같은 문자열을 만날 수 있다. 정상적으로 등록할 수 있는 문자열인 듯 하다. 프로그램을 실행하여 위의 코드를 등록해 보자.

위와 같이 등록키가 정상적으로 등록되는 것을 확인할 수 있다. :)

이번에는 SmartCheck를 이용하여 프로그램을 로딩해 보자.
SmartCheck의 설정은 위와 같이 변경해 준다. 프로그램을 로딩한 뒤에 위쪽 메뉴에 있는 ▷ 버튼을 클릭하여 프로그램을 실행해 보자.


부가정보들과 디버깅의 편의성을 위해 View 메뉴를 위와 같이 설정해 준다. ②번 버튼을 눌러 프로그램을 실행한 뒤 ①번 버튼(Show All Events)을 클릭하면 이벤트를 자세히 볼 수 있다.

상단 메뉴의 검색 부분에 우리가 찾고자 하는 함수명(__vbaVarTstEq)을 입력한 뒤 검색을 해보자.
①번에 해당 검색된 함수를 볼 수 있으며 좀 더 밑을 보면 Olly를 이용하여 찾아냈던 등록키 값이 나타나는 것을 볼 수 있다.

3. 결론
이번 Lena의 강의에서는 Visual Basic으로 이루어진 프로그램에 대한 분석 및 리버싱 방법에 대한 내용을 다루고 있었다. 기존의 프로그램 들과는 약간 다른 방식으로 접근이 필요했다. 프로그램의 정상적인 등록키가 프로그램 자체에 내장되어 있는 간단한 형태의 프로그램이라서 키 값을 찾아내는 것 자체는 어렵지 않았으나 조금더 복잡한 방식의 프로그램일 경우 SmartCheck를 이용한 프로그램 흐름의 분석이 가능해야 할 듯 하다. 다행히 Lena는 다음 강의에서 그런 내용을 다룬다고 한다.

리버싱! 정말 알아야하는 것이 많은 부분인 듯 하다. 각종 툴의 사용법, 프로그램의 흐름 분석, 프로그래밍 언어별 차이 및 특성, 알고리즘의 분석 등등.. 알아야 할 것이 많은 만큼 도전해 볼 가치가 있어 보인다!

                                                                +---------------------------------+
                                                                | Infinite Flow..                              |
                                                                | mail : geekspark@gmail.com         |
                                                                | Blog : http://sinun.tistory.com       |
                                                                | CISSP                                        |
                                                                +----------------------------------+
저작자 표시 비영리 변경 금지
신고
Posted by By. PHR34K

티스토리 툴바