Lena Reversing tutorial 24_1
이번 단계에서 볼 프로그램은 RegMech 프로그램이다.
같은 프로그램을 두 번에 나누어서 그냥 언패킹을 하는 방법과 loader를 이용해서 패치하는 과정을 진행한다.
해당 글에서는 먼저 언패킹을 진행해보도록 한다.
먼저 프로그램을 Exeinfo PE 프로그램에 올려주었다.

Armadillo 프로텍터가 적용되었다는 것을 확인 할 수 있다.
Ollydbg로 열어서 확인해준다.
Ollydbg로 열어서 진행하면 어느순간 꺼져버린다. Armadillo 프로텍터의 특징이다.
디버거를 탐지해서 실행중이던 프로그램을 꺼버린다.
그냥 프로그램을 열어서 프로그램을 확인해주려고 했으나..

멈춰서 실행이 안된다. 현재 32bit 환경인데 64bit 환경으로 진행하니 프로그램이 실행이 된다.
xp 64bit 환경에서 진행했지만 여기서도 실행이 안된다.
bit 보다 운영체제 문제인듯 싶다. 실행이 되는 windows 10 64bit 환경에서 진행하도록 한다.

실행된 모습이다.
Ollydbg로 열어준다.
이번 프로그램은 Armadillo 프로텍터가 적용되어 있고 때문에 Debuger가 실행되는지 확인하여 실행중이라면 종료시켜 버린다.
따라서 Debuger가 동작중인지 판단하는 함수를 우회하도록 한다.
이번 프로그램에 사용중인 함수는 OutputDebugStringA이다.
Command 바에 bp OutputDebugStringA를 입력하여 bp를 걸어준다.

실행을 시키면 다음과 같은 코드에 break가 걸린다.

JMP 하게 되면 다음 코드가 나온다. PUSH 234 부분을 RET 4 로 바꾸어준다.

실행을 하면 프로그램이 실행된다.
프로텍터의 안티 디버깅 기법을 알았으니 OEP를 구해주도록 한다.
OEP를 구하는 방법은 두가지를 보이려 한다.
첫번째는 해당 프로그램이 Visual Basic으로 만들어진 프로그램임을 이용하는 것이다.
프로그램이 실행된 후 memory map을 살펴보면 MSVBVM60 dll이 import 된 것을 볼 수 있다.
이는 Visual Basic으로 만들어진 프로그램에서 나타나는 현상이다.
Visual Basic 프로그램은 OEP에서 'VB' 문자열을 스택에 저장하고 VB dll로 분기하기 위해 ThunRTMain을 호출한다.
이런 특징을 통해 OEP를 찾아준다.
메모리 맵에서 search를 해준다. VB를 검색하면 여러 결과가 나오는데 넘어가다보면 다음과 같이 나온다.

해당 문자열을 스택에 저장할 것이기 때문에 PUSH 0041361C 명령어가 나올것이다.
그냥 search for -> all commands 로 검색하니 나오질 않는다.
주소를 41361C를 찾아간 뒤에 다시 해주니 다음과 같이 나온다.

41262C 주소에 해당 명령어가 있다.
이동해주니 이전에 말한 대로이다.

스택에 VB문자열을 저장하고 ThunRTMain을 호출하고 있다.
이곳이 OEP라고 할 수 있다.
이번엔 또다른 방법으로 OEP를 찾아주도록 한다.
Exception을 이용한 방법이다.
Option ->Debugging options 의 Exception 탭으로 간다.
이전 단계부터 진행해왔다면 Ollydbg의 Exception 설정이 모두 걸려있을 것이다.

여기서 맨 위의 KERNEL32 관련 체크박스 이외에는 모두 체크박스를 해제해준다.
이제 다시 프로그램을 시작해서 진행을 해주면 break 처럼 멈추는 것을 볼 수 있다.
아래 하단에 보면 use Shift+ F7/F8/F9 to pass exception to program 이라고 써있다.
이대로 shift+F9를 눌러가면서 진행한다.
이 때 몇번 눌렀을때 프로그램이 실행되는지를 기억해야 한다.
23번 누르니 프로그램이 실행되었다.
이번엔 다시 프로그램을 실행하여 한번 적은 22번 누른 후 memory map으로 간다.
프로그램의 코드섹션에 bp를 걸어준다.

다시 실행해주면 이전에 찾았던 곳과 같은 위치의 OEP에 도착함을 볼 수 있다.

ImportREC를 사용해 열어준다.
프로그램을 로드하고 Select Code Section을 통해 Dump해준다.
이제 임포트 테이블을 수정해준다.
OEP 값을 수정하고 IAT Autosearch, Get Imports를 눌러준다.
valid값이 NO로 나온다. 세부 내용을 살펴보면 하나가 잘못된 것이 보인다.

name이 적혀있지 않다. 해당 주소로 가서 살펴본다.
OEP에서 조금 올라가면 점프 테이블이 보인다.

해당 명령어에서 엔터를 눌러 들어가서 살펴본다.

쭉 살펴보면 MSVBVM60.dll 을 인자로 받아서 Call 하는 부부이 보이고
그 뒤로 __vbaEnd 를 인자로 받아 GetProcAddress 가 Call 되는 것이 보인다.
이제 name이 없던 부분을 __vbaEnd로 바꿔준다.
더블 클릭하면 Edit가 가능하다 바꾸어주고 나면 Valid가 Yes로 바뀐 것을 볼 수 있다.
fix dump를 통해 저장해주고
lord PE를 열어 PE editor를 열어준다.

Section으로 이동해 다음과 같이 필요 없는 부분들을 모두 제거해준다.
오른쪽 마우스를 눌러 Wipe section header를 누르면 제거된다.
이제 Rebuild PE를 해준다.

성공적으로 끝났다.
끝.
'Security&Hacking > 리버싱' 카테고리의 다른 글
Lena Reversing - tutorial 25_1 (4) | 2020.04.09 |
---|---|
Lena Reversing - tutorial 24_2 (0) | 2020.03.26 |
Lena Reversing - tutorial 23 (0) | 2020.03.16 |
Lena Reversing - tutorial 22 (0) | 2020.03.16 |
Lena Reversing - tutorial 21_4 (0) | 2020.03.15 |