| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | |||
| 5 | 6 | 7 | 8 | 9 | 10 | 11 |
| 12 | 13 | 14 | 15 | 16 | 17 | 18 |
| 19 | 20 | 21 | 22 | 23 | 24 | 25 |
| 26 | 27 | 28 | 29 | 30 |
- ABI
- 32bit
- 실행파일
- Reversing
- 크랙미
- x32
- __vectorcall
- Dos Stub
- 리버싱
- Rich Header
- Image dos header
- Programmers
- Calling Convention
- 함수 호출 규약
- __stdcall
- pe format
- rev
- 코드엔진
- 파이썬
- crackme
- stack frame
- 리치헤더
- __fastcall
- __cdecl
- Python
- 프로그래머스
- x64
- image section header
- RVA
- CodeEngn
- Today
- Total
kj0on
[RCE] Basic L03 본문
0. 실행환경
0-1. 운영체제 (1)

0-2. 툴 (2)


1. 파일

password : codeengn

2. 프로그램 동작

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

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

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

?er 클릭 시 나타나는 메시지 창이다.
3. Detect It Easy

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

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

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

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

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

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

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

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

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

성공 메시지가 출력된다.

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

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

위 전체 흐름을 통해 "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 |