[CodeEngn Basic 3] Do you know VB in Function?

2017. 8. 20. 02:180x02 Reverse Engineer/0x01. CodeEngn

728x90

문제 : 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 여기에서 해당 바이너리의 절대경로를 알 수 있다.



740CA21A    E8 75000000     call msvbvm50.740CA294 (bp)

740CA36F    E8 53010000     call msvbvm50.740CA4C7(bp)

740CA57E    E8 93590000     call msvbvm50.740CFF16 (bp)

740CFF64    E8 EA200000     call msvbvm50.740D2053 (bp)

740D20AE    FF15 0C130C74   call near dword ptr [<&USER32.SetWindowT>; user32.SetWindowTextA
윈도우 텍스트를 세팅하는 함수를 만났다~ 

화이팅.. !! 

740D20BF    E8 6B930400     call msvbvm50.7411B42F (bp) 

가만 생각해보니... C언어는 메인 함수 접근이 상당히 쉬웠는데 이놈은 step over에서 엄청나게많이 걸리게 된다. 짜증.. 

그래도 제대로 분석해보기 위해 달려보자.

7411B4EC    FF53 1C         call near dword ptr [ebx+0x1C] (bp)


7411B607    E8 ABE3FCFF     call msvbvm50.740E99B7 (bp)


끝이 없나...????? ㅋㅋㅋㅋ 

VB는 MSVBVM이라는 가상머신을 사용한다.
그래서 루틴이 일반 코드에 보이지 않고 출력문만 보여진다.
그러므로 All Intermoduler call에 들어가서 함수들을 훑어보았다.

이정도 들어가봣음 많이 들어가본것.....  ^0^ 


c언어에서 문자열 비교하는놈은 strcmp, strncmp 이런것들이니까 이거랑 비슷한 놈을 캐치 해보자.!! 

 

 [그림 8] strcmp ...가 보인다 이놈이다! 



잘못짚으셨습니다~ 여기는 kernel32 지역입니다. 그렇다면 지금 당신이 bp를 열심히 걸었던 곳은 dll 이란 뜻이 되는겁니다 ~ ^0^ 

다시 바이너리를 재 실행 시킨 후 찾아보자. 

 

 [그림 9] 진짜 배기다.. 비록 가상머신이지만 가상머신에서 돌아가는 프로그램인데 어쩌겠어. 



vbaStrCmp에 bp를 걸고 다시 바이너리 재 실행 

 

 [그림 10] 저 유니코드 값이 곧 답이다. 


 

 [그림 11] 코드 값 입력 


 

 [그림 12] yes c0ngratulation