본문 바로가기

Reversing/Introduction to reversing

abex crackme 2

프로그램 동작 방식

  • 사용자의 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이 저장된 위치는 찾아준다.
  • 메모리주소 0019F184D0 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