일단 주어진 파일을 Immunity Debugger로 실행시켜 보았더니 위와 같은 부분으로 코드가 시작되었다.
단축키를 눌러 0040123D 부분을 실행시켜보았더니 위와 같은 창이 뜨면서 Name과 Serial 값을 입력할 수 있게 되어 있었다.
일단 위와 같이 Name 값을 입력하고 Check 부분을 눌러본 후에 디버거에서 코드를 진행시켜보았다.
실행된 코드에서 약간 밑으로 스크롤 해보니 다음과 같은 두 부분을 발견할 수 있었다.
Name과 Serial값이 맞았을 경우 위의 주석과 같은 문구를 띄워줄 것을 예상할 수 있었다.
그리고 Serial 값이 틀렸을 경우 위의 주석과 같은 문구를 띄워줄 것을 예상할 수 있었다.
여기서 왜 Name 값이 맞았는지 틀렸는지를 확인해주는 코드는 없을까? 라는 생각이 들기는 했었다.
위의 코드는 Name에 abcd를 입력하고 Check를 눌렀을 때 코드가 진행된 부분이다.
LEA 명령어는 좌변에 우변의 주소값을 저장해주는 명령어이다.
코드를 보면 EAX 레지스터에 EBP-44 스택값을 저장하고 ECX 레지스터에 EBP-34 스택값을 저장하는 것을 확인할 수 있다.
혹시 방금 위에서 입력한 Name 값을 저장해주는 것이 아닐까? 라는 생각을 해서 스택값을 확인해보기로 했다.
EBP-44=0019F1F8-44=0019F1B4이고 EBP-34=0019F1F8-34=0019F1C4이다.
스택창에서 위에서 계산한 주소 부분을 찾아 확인해봤더니 위와 같이 시리얼 값으로 예상되는 주석을 발견할 수 있었다.
코드를 재시작한 후 아까 입력한 Name(abcd)과 위에서 발견한 Serial(C5C6C7C8)을 입력해봤더니 위와 같이 성공 메세지창이 잘 출력되는 것을 확인할 수 있었다.
이후에 찾아보니 이 문제는 Name값에 따라 Serial값이 달라지도록 만들어진 것이었다.
그래서 Name값의 정답 유무를 체크해주는 부분이 없었던 것이다.
다음은 writeup을 참고한 부분이다.
처음 파일을 열었을 때 실행되는 위의 코드 부분을 보면 CALL 명령어가 있는 부분에서 MSVBVM60. #100 부분으로 점프하는 것을 볼 수 있는데 이는 VB 파일을 이용한 것이라고 한다.
VB 파일은 Visaul Basic 파일로 주로 GUI 프로그래밍에 사용되며 VB 전용엔진인 MSVBVM60.dll을 사용한다.
VB 컴파일러는 MSVBVM60.dll!rtc MsgBox()가 호출되도록 한 후 이 함수 내부에서 Win32 API인 user32.dll!MessageBoxW() 함수를 호출하는 방식이며 컴파일 코드 종류에는 Native Code와 Pseudo Code가 있다. 또한, VB는 대부분 GUI 프로그래밍이라 Windows 운영체제의 Event Driven 방식의 동작으로써 main()이나 Winmain()에 사용자 코드가 존재하는 것이 아니라 각각의 event handler에 사용자 코드가 존재하며 VB에서 사용되는 각종 정보들은 내부적으로 구조체 형식으로 파일에 저장된다는 특징이 있다.
위와 같이 CALL 명령어로 해당 함수를 불러오는 부분에서 주석 부분을 보면 vbaVarTstEq 함수를 확인할 수 있다.
vbaVarTstEq 함수는 암호를 검사하는 함수로 2개의 파라미터를 전달받아 스택에 저장해준다.
이 부분에서 F7키를 눌러 함수 내부로 들어가봤다.
위와 같은 부분에서 5117C2E4 부분을 보면 또다른 함수를 호출하는 것을 볼 수 있고 이 함수 내부로 들어가봤다.
그랬더니 위와 같은 부부으로 연결되었고 계속 함수를 진행시켜보다가 51176320 부분에서 VarCmp 함수를 확인할 수 있었다.
VarCmp 함수는 두개의 파라미터를 비교해주는 함수이고, 이 부분에서 내가 입력한 값과 정답을 비교해주는 것이 아닐까? 라고 예측할 수 있었다.
그래서 위의 VarCmp 함수를 호출해주는 부분으로 들어가 보았다.
코드를 진행시켜보다가 위와 같이 VarBstrCmp 함수를 호출해주는 부분을 확인할 수 있었고
이때 스택창 부분을 확인해봤더니 정답인 시리얼키(C5C6C7C8)와 내가 아무렇게나 입력한 시리얼키(1234)를 저장한 부분을 확인할 수 있었고 이제 이후에 이 두개의 값을 비교하여 정답여부를 판단하겠구나 라고 예측할 수 있었다.
계속 코드를 진행시켜보았더니 위와 같은 부분으로 이어졌고 두개의 값을 비교하여 정답 여부를 확인해주는 부분으로 넘어가는 것을 확인할 수 있었다.
그래서 아까처럼 파일을 restart하여 Name(abcd)과 확인한 시리얼키(C5C6C7C8)를 입력해준 후 Check를 해주면 성공 메세지 창이 뜨면서 문제를 해결할 수 있다.
'2020 WINTER STUDY > CTF Study' 카테고리의 다른 글
[Reversing] Day 5_CodeEngn Basic RCE L06 (0) | 2021.02.19 |
---|---|
[Reversing] Day 5_패킹, 언패킹 (0) | 2021.02.19 |
[Reversing] Day 3_suninatas 9 (0) | 2021.02.18 |
[Reversing] Day 3_xcz.kr prob 9 (0) | 2021.02.18 |
[Reversing] Day 2_abex' crackme #3 (0) | 2021.02.16 |