관리 메뉴

JIE0025

[악성코드분석] CodeEngn 코드엔진 Basic RCE L03 + 추가 분석 본문

기타 학습/보안

[악성코드분석] CodeEngn 코드엔진 Basic RCE L03 + 추가 분석

Kangjieun11 2020. 4. 11. 18:48
728x90

######## 작성자가 진행한 실습 그대로의 과정을 담았습니다. ########

 

오늘의 챌린지는 비주얼베이직에서의 스트링 비교함수 이름을 찾는 것이다. 

추가적으로 스트링 비교함수 내부가 어떻게 돌아가는지를 분석해보았다.

 

--------------------------------------------------------------------------------------

 

올리디버거로 실행시켜보았더니 시스템에러가 났다. 

 

The program can't start because MSVBVM50.DLL is missing from your computer. Try reinstalling the program to fix this problem

 

MSVBVM50.DLL 이 없어서 생긴 문제인 듯 했다.

 

해결법을 찾아보았는데 사람들이 알려주는 주소에서는 파일 이름이 다르고 해서

그냥 이 블로그에서 첨부파일을 다운받아 설치하였다.

https://m.blog.naver.com/93immm/220194312371

 

msvbvm50.dll 오류 해결법

첨부파일을 다운로드 해주면 해결됩니다.

blog.naver.com

 

------------------------------------------------

이제 본격적으로 분석을 해보자.

 

F9을 눌러서 실행시켜보았다.

대충 보아하니 regcode를 작성하여서 refistrieren버튼을 누르면 그 코드가 옳은 코드인지 비교하여서 메세지 박스를 보여주는 시스템인 것 같다.

 

메세지string을 검색해보면, 그 위에 입력한 string과 실제 code를 비교하는 함수를 호출할 것이라고 예상할 수 있다.

 

 

마우스 우클릭 > searchfor> all referencced strings

 

전체 string이 나왔다.

여기서 우리는 방금 나왔던  error ! das passwort ist falsch! 라는 string을 찾을 수 있다.

더블클릭해서 들어가보자.

 

f2를 눌러서 break point를 설정해주었다.

현재 line이 들어있는 함수의 시작부분을 찾아서 그 부분도 break point 설정을 해주었다. 

분명 이 함수 안에 두 값을 비교하는 함수가 호출될 것이라고 생각했기 때문이다.

 

이제 ctrl+f2를 누르고 f9를 다시 눌러서 break point까지 간 후에

f8과 f7을 클릭해가며 한줄한줄 분석을 해보겠다.

regcode는 아무거나 작성하고 실행한다.

나는 aaaa를 입력하였다 (분석할 때 연속된 문자가 있으면 어디있는지 한눈에 볼 수 있는 것 같다)

 

쭉 실행해보다보니까 우리가 C언어에서도 자주 사용했던 strcmp함수가 눈에 보였다.

C언어에서 strcmp는 두 문자열을 비교하는 함수였다.

우리가 이 실행파일을 분석하는 목적은 "비주얼베이직"에서 스트링 비교 함수의 이름은? 이었기 떄문에

vbaStrCmp 이것이 아마 정답이 될 것같다.

함수 호출 전에 push를 통해 파라미터를 넣어주는데, 두개의 값이 내가 입력한 aaaa와 다른 string이었다.

아마도 arg1로 들어간 이 문자열 2G83G35Hs2 이것이 진짜 password값이 아닐까 예상해본다. 

두 값을 인자값으로 넣어주어서 함수 내부에서 비교한 후 리턴해 줄 것 같다.

 

정답

비주얼베이직에서 스트링 비교함수의 이름 : vbaStrCmp

regcode :  2G83G35Hs2 

 

정답인지의 여부는 글 마지막에 확인하겠다.

 

-------------------------------------------------------

 

좀 더 깊게 분석을 해보았다.

f7을 눌러서 vbaStrCmp에 들어가 보자.

jmp명령어가 있는것을 보아하니 한번 더 이동하는 듯 하다.

 

jmp명령어를 통해 이동한 곳에는 call __vbaStrComp가 있었다. 마지막으로 다시 들어가 보아야 할 듯하다.

 

다시 들어간 곳에는 비교할 두 문자열을 push한후에 다시 어떤 함수가 호출되는 것을 볼 수 있었다.

위의 것을 분석이라고 해보았지만 두 명령어를 비교하는 것 같지는 않다. 

 

바로 여기가 두 문자열을 비교하는 함수 내부라고 생각이 든다. 

 

esi와 edi가 복사 및 비교를 할 떄 source와 destination의 주소를 갖고 있는 index register라고 알고 있는데,

740CD9EC에서, edi에 arg.2인 real code number를 복사하였고

740CD9F0에서, esi에 arg.1인 aaaa를 복사하였다

그 후 740CD9FA 에서 repe cmps word ptr ds:[esi]. word ptr es:[edi]를 실행하는데,

repe는 같으면 반복하라는 의미이며, cmp로 esi 와 edi 를 비교한다. 

 

---------------------------------------------------------------------------

 

이제 마지막으로 정답인지 체크를 해보겠다.

 

ctrl + f2 로 초기화 후, f9을 눌러서 code를 다시 입력해보자

 

 

메세지 박스에서 

Danke, das passwort ist richtig! 가 나오는 것을 통해 옳은 코드임을 확인하였다.

 

 

비주얼베이직에서 문자열 비교 함수의 이름 역시 정답인지 체크해보았다.

역시 성공적이다.