kj0on

[RCE] Basic L03 본문

Reversing/CodeEngn

[RCE] Basic L03

kj0on 2025. 6. 28. 19:28
목차 접기

0. 실행환경

 

0-1. 운영체제 (1)

Window 11 Home


0-2. 툴 (2)

x32dbg
Detect it easy


1. 파일

https://codeengn.com/challenge/rce_basic
03.7z
0.00MB
MSVBVM50.DLL
1.29MB

 

password : codeengn


2. 프로그램 동작

[이미지1] Basic 03

실행 시 가장 처음 나타나는 메시지다. 취소를 누를 경우 종료된다. 문자가 깨져보인다.

 

[이미지2] Basic 03

확인버튼을 눌렀을 때 나타나는 GUI다.

 

[이미지3] Basic 03

Regcode : 에 일치하지 않는 값 입력 시 나타나는 메시지 창이다.

 

[이미지4] Basic 03

?er 클릭 시 나타나는 메시지 창이다.


3. Detect It Easy

[이미지5] DIE 실행 결과

32비트 실행파일, Visual Basic 5로 작성된 프로그램 인 것을 알 수 있다.


4. 분석

[이미지6] EntryPoint

EntryPoint로 이동 시 ThunRTMain으로 전형적인 Visual Basic의 EP형태가 보인다.

 

[이미지7] 문자열 참조

문자열 참조 시 값이 일치하지 않을 경우 메시지 창에 나타나는 문자열을 볼 수 있다. 해당 위치로 이동한다.

 

[이미지8] rtcMsgBox

메시지를 출력하는 부분이다. 조금 위의 코드를 살펴보면 vbaStrCmp 함수를 볼 수 있다.

 

[이미지9] vbaStrCmp

입력값을 넣고 실행해 보면 입력값("ABCDEF")과 "2G83G35Hs2"와 비교한다.

 

[이미지10] 조건부 분기

해당 분기는 성공, 실패를 결정하는것이 아닌 rtcMsgBox(메시지창)를 호출할지 말지를 결정한다. 따라서 해당 지점에서 ZF를 수정한다고 해도 성공 메시지가 나타나지 않는다. 

 

[이미지11] vbaStrCmp

성공과 실패를 구분하는 분기는 좀 더 위에서 이루어진다. 여기서도 vbsStrCmp 함수를 통해 같은 값을 비교하고 있다. 입력값이 일치 할 때 성공 메시지를 출력한다.

 

[이미지12] 전체 동작

Registrieren 버튼 클릭 시 전체 흐름을 살펴보면 위와 같다. 두번째 __vbaStrCmp에서는 코드에서는 je로 조건부 분기를 하지만 조건부 분기 이전 cmp word ptr ss:[ebp-B8], 0 코드를 수행하기 때문에 __vbaStrCmp의 결과와는 상관없이 실패메시지가 출력된다. 문자열 일치, 불일치의 반환값은 0이 아닌 값이다. cmp를 0과 하고 있기 때문에 문자열 비교만으로는 je 분기가 발생하지 않는다(왜 이렇게 나타나는 지는 잘 모르겠다). 다만 처음 __vbaStrCmp에서는 cmp di, si를 하기 때문에 문자열 비교에 따라서 분기가 이루어진다(자세한건 직접 코드 참조 해보면 알 수 있다). 결론은 문자열 비교(__vbaStrCmp)는 첫번째 분기에만 영향을 주고 두번째 분기에는 영향을 주지 않는다는 점이다.


5. 풀이

 

[이미지13] Basic 03

vbsStrCmp를 할 때 비교하는 값을 입력한다.

 

[이미지14] Basic 03

성공 메시지가 출력된다.

 

[이미지14] 0x401DDC 참조 덤프

이 값이 고정값인지 생성되는 값인지 판별하는 것은 중요한 문제다. 입력값을 바꾸면서 여러번 실행해 본 결과 값이 변하지 않았다.따라서 해당 문자열은 고정 값이라고 추측 할 수 있다.

 

[이미지15] System Break Point

시스템 BP가 걸리는 지점에서 확인해 봐도 해당 값은 동일하다. 프로그램 실행 전 문자열을 확인해도 값이 동일한 점으로 봐서 해당 값은 특정 연산에 의해 생성되는 값이 아닌 프로그램 작성 시 하드코딩된 값이다.

 

[이미지16] 전체 동작

위 전체 흐름을 통해 "2G83G35Hs2" 값이 왜 비밀번호인지 알 수 있다. 성공과 실패를 결정하는 분기는 __vbaStrCmp 호출 후 위에서 표시한 지점에서 발생한다. 그럼 그 분기는 무엇으로 결정되는가를 생각해 보면 __vbaStrCmp의 반환값으로 결정된다. __vbaStrCmp의 반환값은 또 뭐로 결정되는가를 생각해 보면  "2G83G35Hs2"와 내가 입력한 값이 일치하는가로 결정된다. 그렇기 때문에 해당 문제에서 TextBox에 입력해야 할 값은 "2G83G35Hs2" 인 것이다. 처음 질문으로 돌아가서 "비주얼베이직에서 스트링 비교함수 이름은?"에 대한 답을 하자면 위 과정을 통해 vbaStrCmp가 스트링 비교함수인 것을 알 수 있다.


 

'Reversing > CodeEngn' 카테고리의 다른 글

[RCE] Basic L06  (0) 2025.06.29
[RCE] Basic L05  (0) 2025.06.29
[RCE] Basic L04  (0) 2025.06.29
[RCE] Basic L02  (0) 2025.06.28
[RCE] Basic L01  (0) 2025.06.28