2017. 8. 20. 02:18ㆍ0x02 Reverse Engineer/0x01. CodeEngn
문제 : What is the name of the Visual Basic Function that Compares two strings?
바이너리 실행:
저런,,,,저런,,,, 해당 vm 환경에 dll이 없어서 dll부터 설치를 해야한다.
비주얼 베이직은 MSVBVMxx.dll 이 필요하다.
잠시 dll에 대해 설명하면, 동적라이브러리링크라고 부르는 아이인데, 이 놈은 컴퓨터 안에 쏙 들어있다가 특정한 프로그램에 필요한 기능을 순간 순간 제공해주는 기능을 지니고 있다. 즉, 지금 vb 프로그램을 실행했는데 vb에 필요한 기능을 제공하는 dll이 없어서 에러가 빰 하고 뜨는 원리인 셈이다.
dll을 만들어 두면, 프로그램의 크기는 현저히 줄어들고 더불어서 속도도 빨라진다 !!
꿀팁 !
x86_64 운영체제를 사용하시는 분은 sysWOW64와 System32 둘 다 삽입해야한다.
|
[그림 1] dll을 내놓으란 말이다... |
dll을 설치중... ■■■■■□□
훗... dll을 windows 폴더 내부에 삽입 해두니 이제서야 말귀를 알아듣는 모습을 볼 수 있다.
|
[그림 2] 바이너리 정상 실행 ~ |
커서가 깜박거리면서 코드를 입력하라고 유혹중이다.
|
[그림 3] 입력 해줘 아무거나.. |
잘못된 값을 넣게 되면...
|
[그림 4] Error를 표출한다. 알았어.. 제대로 값을 넣어주겠어 |
이제 어떻게 돌아가는 바이너리인지 알았으니 뜯어보자.
1번 문제에서 보지 못한 놈이 나왔다...
|
[그림 5] VB의 다소 특이한 구조.. |
비주얼베이직에 대해 조금 더 알아보았다.
비주얼베이직은 폼을 갖다 놓고, 그 위에 컨트롤들을 올리고, 해당 컨트롤에서 어떤 이벤트가 발생할 경우, 수행할 작업들을 코딩해준다.
버추얼머신은 폼이 어떻게 생겼는지 조사해서 화면에 뿌려주고 사용자의 입력(이벤트)을 기다린다.
이벤트가 발생하면 해당 작업코드, 함수를 실행시키고 함수가 종료되면 이벤트를 기다린다.
저 함수에 접근 한번 해보고 싶은 욕망이 생겨서 들어가보았다...
C언어에서의 mainCRTStartup처럼 여기도 메인이 존재하긴한다.
|
[그림 6] msvbvm50.ThunRTMain |
|
[그림 7] 바뀐 것이 2개다... |
그럼 알아봐야지? 주소에서 7번대역은 dll이 위치하는 대역이며, 지금 보이는 state 화면은 module 03 -> msvbvm50.dll 로 바뀜을 의미한다.
MSVBVM50.dll 은 Visual Basic 5.0 라이브러리 파일로써
비주얼 베이직을 사용하는 프로그램을 이것을 필요로 한다고 한다.
CALL <JMP.&MSVBVM50.#100> 에 진입하기위해 break point설정 후
진입하게 되면
MSVBVM60.ThunRTMain 즉 MSVBVM의 메인에 진입하는것 같다.
module MSVBVM60에 진입하게 되는데 임계영역에 진입하는 코드가 있는 것으로 보아MSVBVM은 스레드라고 판단된다.
이제 bp를 걸어보면서 바이너리의 메인을 찾아본다.
00401168 >/$ 68 B8184000 push 03.004018B8
0040116D |. E8 F0FFFFFF call <jmp.&MSVBVM50.#100> (bp)
00401162 $- FF25 64514000 jmp near dword ptr [<&MSVBVM50.#100>] ; msvbvm50.ThunRTMain
00401168 >/$ 68 B8184000 push 03.004018B8
0040116D |. E8 F0FFFFFF call <jmp.&MSVBVM50.#100>(bp)
740CA1BF > 64:A1 00000000 mov eax,dword ptr fs:[0]
740CA1C5 55 push ebp
740CA1C6 8BEC mov ebp,esp
740CA1C8 6A FF push -0x1
740CA1CA 68 88A20C74 push msvbvm50.740CA288
740CA1CF 68 84361A74 push msvbvm50.741A3684
740CA1D4 50 push eax
740CA1D5 64:8925 0000000>mov dword ptr fs:[0],esp
740CA1DC 83EC 54 sub esp,0x54
740CA1DF C745 E4 FFFF008>mov dword ptr [ebp-0x1C],0x8000FFFF
740CA1E6 53 push ebx
740CA1E7 8B45 08 mov eax,dword ptr [ebp+0x8]
740CA1EA 56 push esi
740CA1EB A3 E8231D74 mov dword ptr [0x741D23E8],eax
740CA1F0 57 push edi
740CA1F1 8965 E8 mov dword ptr [ebp-0x18],esp
740CA1F4 33F6 xor esi,esi
740CA1F6 8975 FC mov dword ptr [ebp-0x4],esi
740CA1F9 8D45 9C lea eax,dword ptr [ebp-0x64]
740CA1FC 50 push eax
740CA1FD FF15 14110C74 call near dword ptr [<&KERNEL32.GetStart>; kernel32.GetStartupInfoA
kernel32.GetStartupInfoA 여기에서 해당 바이너리의 절대경로를 알 수 있다.
|
[그림 8] strcmp ...가 보인다 이놈이다! |
|
[그림 9] 진짜 배기다.. 비록 가상머신이지만 가상머신에서 돌아가는 프로그램인데 어쩌겠어. |
|
[그림 10] 저 유니코드 값이 곧 답이다. |
|
[그림 11] 코드 값 입력 |
|
[그림 12] yes c0ngratulation |
'0x02 Reverse Engineer > 0x01. CodeEngn' 카테고리의 다른 글
[CodeEngn Basic 7] WHAT ABOUT THE CHANGE BY 'CodeEngn' (0) | 2017.08.20 |
---|---|
[CodeEngn Basic 6] You Find OEP (0) | 2017.08.20 |
[CodeEngn Basic 4] Do you know antiDebug? (0) | 2017.08.20 |
[CodeEngn Basic 2] Do you know recovery to EXE? (0) | 2017.08.20 |
[CodeEngn Basic 1] Do you Know GetDriveType? (0) | 2017.08.20 |