문제 3.
비주얼베이직에서 스트링 비교함수 이름은?
3번문제를 비주얼베이직에서 스트링 비교함수이름을 알아내는게 문제이다.
c언어에서 strcpy 같은 문자열 비교함수를 비주얼 베이직 언어에서는 어떠한 함수인지 찾아내는 것인데 사실 구글링을 통해서 바로 알수는 있지만, 직접 리버싱을 해보면서 유추를 해보자.
우선 해당 프로그램을 실행시켜 보자.
영어로 머라고 나온다. 먼말인지 모르니 그냥 확인 버튼을 눌러보겠다.
Regcode를 입력하는 공간이 있다. hello라고 친다음 Registerieren을 눌러보자.
먼가 패스워드가 맞지 않는다고 실패가 뜬다.
아마도 3번 해당 프로그램은 비주얼 베이직으로 작성이 되었는데 내가 입력한 비밀번호를 특정 문자열 비교 함수를 이용하여 비교를 한뒤, 저장된 비밀번호가 맞으면 통과가 되고 틀린 비밀번호를 입력하면 위와 같은 메시지 박스가 나오는 것 같다.
문제풀이
올리디버거로 돌려보자.
올리디버거로 프로그램을 돌려보면 다음과 같은 결과가 나온다.
코드 부분을 보면 어디 부분인지 알수 없다. 따라서 현재 해당 프로그램을 실행 시켰을 때 내가 원하는 부분을 알기위한 방법이 두가지가 존재한다.
1. 해당 프로그램이 실행됬을 때 사용하는 문자열이 모여져 있는 공간 찾기
- 우클릭 하고 Serach for 의 카테고리를 보면 다음과 같은 내용이 나온다.
- All referrenced text string : 해당 프로그램이 실행될 때 참조하는 모든 문자열을 볼 수있는 카테고리
- All intermodular calls : 사용한 API를 한눈에 볼수 있는 카테고리
윈도우에서 프로그램을 만들때 메시지 박스같은 화면에 무엇인가를 출력하려면 WINAPI 를 사용하여 OS에게 화면출력을 요청해야 한다.
즉, 프로그램이 화면에 뭔가를 출력했다는 얘기는 프로그램 내부에서 WINAPI를 사용하였다는 뜻이다.
그렇다면 프로그램의 기능을 보고 사용되었을법한 WINAPI 호출을 예상하고, 그부분을 찾을 수 있다면 디버깅은 매우 간편해 질 것이다.
올리디버거에는 디버깅 시작전에 미리 코드를 분석하여 사용되는 API 함수 목록을 뽑아내는 기능이 존재한다.
출처 : https://reversecore.com/5
All referrenced text string 를 클릭하면 다음과 같은 화면이 나온다.
결과로 나온 화면의 일부인데 자세히 보면 비밀번호(?)를 hello 라고 입력했을 때 나오는 에러문구에 사용되는 문자열을 확인할 수 있고, 해당 코드가 실행되는 위치를 더블클릭하면 확인 가능하다.
2. API 함수 호출 목록으로 확인하기
All intermodular calls 를 클릭하면 다음과 같은 화면이 나온다.
해당 프로그램에 사용한 API들을 한눈에 볼 수 있다. vba로 다 시작하는데 이는 비주얼 베이직에서 사용하는 API라고 한다. 중간중간 보면 vbaStrCmp 라는 함수를 볼수 있는데, 누가봐도 이 함수가 바로 문자열 비교시 사용되는 함수라는 것을 알 수 있다.
3. 결론
위 두가지 방법은 내가 코드를 빨리 찾아내는 방법이다. 이는 가장 기본중 기본으로 이를 통하여 해당 문제를 해결하자.
나는 API 목록을 확인한뒤 vbaStrcmp API가 호출되는 부분으로 이동하였다.
vbaStrCmp 함수를 호출하기 직전 두번의 PUSH를 통해 인자를 삽입하고 해당 함수를 호출한다.
두번째 PUSH의 설명을 보면 유니코드로 "2G83G35Hs2" 의 값을 넣는다. 이는 첫번째 PUSH를 내가 입력한 값으로 하고 그 입력값과 저 유니코드의 값을 비교한다는 것으로 유추할 수 있다.
실제 그런지 한번 확인해 보자.
현재 402A27주소에 브레이크 포인트를 걸고 hello라고 입력한뒤 402A2F 주소, 즉 vbaStrCmp 함수 직전까지 실행한 상태이다.
스택을 보면 hello와 유니코드 값이 들어가 있는 걸 볼 수 있다.
결론적으로 vbaStrCmp 함수의 첫번째 인자값에 "2G83635Hs2"를 입력하면 된다.
(정답은 vbaStrCmp이다. 비밀번호를 크랙하는건 정답이랑 상관없다)
'워게임 > CodeEngn' 카테고리의 다른 글
[CodeEngn] Basic RCE L07 (0) | 2020.12.28 |
---|---|
[CodeEngn] Basic RCE L05 (0) | 2019.05.17 |
[CodeEngn] Basic RCE L04 (0) | 2019.05.16 |
[CodeEngn] Basic RCE L02 (0) | 2019.05.16 |
[CodeEngn] Basic RCE L01 (0) | 2019.05.16 |