문제 : 비주얼베이직에서 스트링 비교함수 이름은?
답 : vbaStrCmp
일단 프로그램을 그냥 실행시켜보았다. 그러면 이렇게 오류 메시지가 뜨고 프로그램이 실행이 안된다.
오류창을 보니 MSVBVM50.DLL 파일이 없어서 안된다고 하는것 같으니 일단 구글에 파일에 대해 검색해본다.
https://boksbooks.tistory.com/67 라는 글을 보고 DLL누락 문제를 해결했다.
DLL파일을 설치하고 다시 실행하니 이런 창이 뜬다. 사진 1은 외국어로 뭐라고 적혀있는데 문제에서도
나와있듯이 비밀번호를 입력하라는것 같다. 두번째창은 비밀번호를 입력하고 왼쪽 버튼을 눌러서 인증할수있다.
이제 프로그램이 어떻게 돌아가는지 알았으니 디버거로 열어본다.
일단 막막하다. 엔트리 포인트인 00401168에서 멈추고 밑을 보아도 딱히 쓸만한 단서는 보이지 않았다.
그래서 일단 실행시킨후 비밀번호 입력창에 asdf를 입력시켜보았다. 비밀번호가 틀려 이런 화면이 나왔다.
화면에 나온 문자열의 의미를 정확히 알아보기 위해 시험 삼아 번역기에 돌렸더니
독일어로 "암호가 잘못되었습니다!" 라는 뜻이였나 보다.
일단 막막하니 메시지 박스에 뜬 문자열을 바탕으로 리버싱을 시작해보았다. 마우스 오른쪽 버튼을 누르고
Search for -> All referenced strings 메뉴로 일단 위의 문자열이 나오는 곳을 찾아보았다.
일단 크게 두곳으로 나뉘었다. 그러나 왼쪽의 Command 부분을 보면 아래쪽의 빨간줄 친 부분이 좀 더 중요해 보인다.
(MOV 명령어가 있고 위에 건 그냥 유니코드다) 그래서 더블클릭해 그 부분에 들어가 보았다.
보아하니 무언가 꽤 중요한 부분에 들어온 것 같다. 일단 주위를 둘러보니 00402A11부터 00402A21부터 vbaHresultCheckObj라는 서브루틴을 호출하고 00402A22부터 00402A2F까지 vbaStrCmp 서브루틴을 호출하는 것 같다.
일단 vbaStrCmp 서브루틴에는 대놓고 무언가 의심스럽게 생긴 2G83G35Hs2라는 인자도 전달하고 있는것 같아서 서브루틴 실행 전에 브레이크포인트를 걸고 다시 실행했다. 놀랍게도 아무일도 일어나지 않았다. 그래서 일단 위로 올라가서 또 중요해 보이는 곳에 브레이크 포인트를 걸었다.
이번에는 비밀번호 입력란에 asdf를 입력하자마자 브레이크포인트에 멈추어 섰다. 그리고 계속 무언가가 보일때까지
스텝 오버로 내려와봤다.
004028A7에서 멈추어 보았다. 대충 보아하니 특정 조건을 만족하면 저걸 실행하는것 같은데 일단 JGE때문 그냥 넘어갔다. 계속 내려가보니 방금 본 것과 비슷하게 생긴 명령어가 또 보였다.
일단 이곳에도 각 서브루틴마다 브레이크 포인트를 지정해주었다. 그러자 사진 3에서는 그냥 넘어가지더니 사진 4에서는 00402A0F에 딱 멈추어 섰다. 한번 더 F9를 눌러 실행하니 비밀번호 오류 메시지 박스 사진이 떴다.
그렇다면 여기서 문자열을 비교한다고 짐작해볼수 있는건데 여기서 의문이 든다. 불러오는 함수는 2개이니 둘중에 하나일것 같은데 어떻게 알수 있을까? 답은 간단하다. 함수의 인자를 보면 된다. 그래서 두 함수의 인자를 각각 살펴보았다.
입력값이 asdf이므로 문자열 비교함수라면 asdf값이 인자로 무조건 있어야 할것이다.
vbaHresultCheckObj의 인자는 Arg2 = 22AA94C이고 Arg1 = 0이였다.
vbaStrCmp의 Arg2를 살펴보니 만세! asdf가 있다.
그렇다면 이 함수는 문자열 비교 함수라고 짐작할 수 있다. 바로 Auth에 가서 입력해보았다.
정답이다.
한걸음 더!
일단 문자열 비교함수는 알게 되었는데 그럼 이 프로그램의 비밀번호는 무엇일까? 단순하게 생각해보자 문자열 비교함수의 Arg1의 인자를 보니 비밀번호일수도 있겠다는 생각이 들어서 프로그램에 입력해보았다. 그 결과는
이런 화면이 떠서 또 번역기에 돌려보니 "감사합니다. 비밀번호가 맞네요."라고 한다.
이로써 2G83G35Hs2 이 비밀번호가 된다.
참고한 곳
https://a6ly.dev/10 에서 파일이 누락된 것이 아니라는 것만 확인하고 종료
'리버싱 > 리버싱 문제 코드엔진' 카테고리의 다른 글
코드엔진 Basic RCE L06 (0) | 2021.07.13 |
---|---|
코드엔진 Basic RCE L05 (0) | 2021.05.25 |
코드엔진 Basic RCE L02 (0) | 2021.05.18 |
코드엔진 Basic RCE L01 (0) | 2021.05.13 |
코드엔진 Basic RCE L04 (0) | 2021.03.20 |