프로그램 동작 방식

- 사용자의 Name과 관련있는 Serial을 찾아내야함.
- Name이 짧은 경우

- Serial이 틀린 경우

프로그램 실행 (Paused & Running)
- 프로그램을 실행하면 사용자 입력을 기다리는 입력 창을 먼저 띄운다.
- Name과 Serial을 입력하고 Check 버튼을 누르면 처리 결과를 보여주고 다시 사용자 입력을 기다린다. → 사용자 입력을 기다리면서 프로그램이 계속 기다리는 것.

- 디버거로 프로그램 실행시 Entry Point에서 실행이 멈춘다.
- 프로그램 상태 = Paused

- 프로그램 실행을 하면 MSVBUM60.ThunRTMain()함수에서 실행이 멈춘다.
- 프로그램 실행 상태 = Running
- Name과 Serial를 입력하는 창을 띄워주고 사용자 입력을 가미하는 로직 내부로 들어가 있다는 것을 예상할 수 있다.
- 프로그램과 상호작용하려면 프로그램 실행 상태를 반드시 Running으로 만들어야한다.
문자열 검색
- 처음부터 하나씩 살펴보기에는 너무 시간이 오래 걸림 → 문자열 검색

- 문자를 선언한 부분
- 문자를 더블클릭하면 코드 영역으로 넘어감

- 문자를 사용하는 부분
MOV DWORD PTR SS : [EBP-0D4] , 0040237C
- 스택에 0040237C라는 주소에 들어있는 내용을 복사한다는 뜻.
스택 분석하기
- 변수를 스택에 저장해서 함수로 전달
- 서브루틴에서 사용되는 변수를 저장하는 공간으로 활용
- 서브루틴을 수행하기 전 메인 루틴의 레지스터를 스택에 저장

- 주소 004023D0에는 Error가 저장되어있음.
- 주소 0040237C에는 Please enter at least 4 chars as name!이 저장되어있음.

- 브레이크 포인트 설정 후 Name : ab / Serial : 1234 입력 후 실행

- 00403066까지 실행
- 힌트 영역에서는 명령어와 관련된 Register, Stack, Memory에 저장된 데이터를 보여줌
< EIP 레지스터 >
EIP 레지스터에는 다음에 실행할 명령어 주소가 들어가 있음.
EIP 레지스터의 값을 강제로 변경해서 프로그램의 실행 위치를 바꿀 수도 있다.

- 레지스터 영역에서는 프로그램이 실행되면서 사용하는 레지스터 값을 확인할 수 있다.
< ESP 레지스터 >
현재 사용하는 스택의 맨 위의 주소가 저장되는 레지스터


- 스택의 EBP-E4에는 Error 문자열이 저장된 메모리 주소 004023D0이 들어가 있다
- 004023D0 → 0040237C

Little Endian & Big Endian

Little Endian
- 중요도가 낮은 숫자부터 집어 넣음.
- 중요도가 낮다 = 작은 숫자
- 윈도우에 저장된 형태
Big Endian
- 중요도가 높은 숫자부터 집어 넣음
- 중요도가 높다 = 숫자가 크다
메모리 분석하기
- 프로그램을 실행하는 데 필요한 모든 데이터는 메모리에 저장된다.
- 가상 메모리 기술을 사용해서 일부는 하드디스크에 남겨 놓기도 하지만, 모두 메모리에 있다고 생각하고 작업을 수행.

- 명령어가 사용하는 메모리 영역을 자세하게 볼 수 있음.
- 현재 선택한 명령어는 004023D0을 스택에 저장하는 것
1. Memory address

- Memory address는 004023D0이 저장된 위치는 찾아준다.
- 메모리주소 0019F184에 D0 23 40 00이 저장된 것을 확인할 수 있음
- Little Endian 방식으로 저장되어 있음.
2. Immediate constant

- 004023D0에 저장된 데이터를 보여준다.
3. Selection

- 선택한 명령어가 저장된 메모리 위치로 이동
[ Error → right으로 바꾸기 ]



프로그램 구조 분석
- 가장 key가 되는 문자열 → Yep, this key is right!

- 입력한 이름 길이 검사
- 4보다 작으면 오류 발생

- 이름이 4보다 크면
- 반복문을 사용해 일련번호를 생성함.

- 일련번호가 맞는지 확인
문제 해결

MOV DWORD PTR : [EBP-94], EAX
- EAX가 가리키는 주소에 있는 데이터를 4byte(DWORD)만큼 읽어서 스택 EBP-94에 복사한다는 것.

- 명령어가 실행되기 전 EBP-94가 가리키는 위치에 어떤 데이터가 저장되어 있는지 메모리에서 확인할 수 있음
- [Integer] → [Address with ASCII dump] : 4바이트 단위의 아스키 값을 확인할 수 있음.
- 문자열 C5C6C7C8이 저장되어있음을 확인할 수 있다.



- 힌트 영역을 통해 메모리와 레지스터를 분석한 결과를 확인할 수 있다.
- 현재 레지스터에는 어떤 값이 저장되어있고, 스택이 가리키는 주소에 어떤 값이 들어있는지 확인할 수 있다.
메모리를 살펴보는 이유 = 데이터의 분포를 파악하기 위함
스택을 살펴보는 이유 = 스택에서 데이터 분포와 함수의 호출 구조를 파악하기 위함.
>> 문자열 C5C6C7C8은 이름 abcd와 일치하는 일련번호라는 것을 추측할 수 있음 <<
'Reversing > Introduction to reversing' 카테고리의 다른 글
| abex crackme 5 (0) | 2025.05.05 |
|---|---|
| abex crackme 4 (0) | 2025.05.05 |
| abex crackme 3 (1) | 2025.05.05 |
| abex crackme 1 (2) | 2025.05.05 |
| Introduction to reversing - Chapter 01 (0) | 2025.05.05 |