728x90
  • abex crackme - 01


: 이 예제에서 프로그램을 실행하였을 때, 하드디스크를 CD-Rom으로 인식하도록 하라는 화면이 뜨게 된다.

: Ollydbg를 이용해서 위 프로그램을 분석하려고 한다.



01. 엔트리 포인트

디버거를 통해 프로그램을 열면 실행되지 않고 특정 지점에서 멈추는 것을 확인할 수 있는 지점을 엔트리 포인트라고 한다.

프로그램이 로딩되면서 베이스 주소(Base Address) + RVA(상대주소)가 더해진 위치에 데이터가 저장된다.


디버거에서 메모리 상 시작 지점의 위치가 '00401000' 을 확인 할 수 있으며,

맨 마지막의 주소는 '004001061'을 확인 할 수 있다.


02. 명령어

    • F8(=스텝 오버): 프로그램을 한 줄씩 실행
    • F7(=스텝 인투): 'CALL 주소'를 실행하는 명령어에서 해당 주소의 서브루틴 안으로 들어간다.
    • F2(=브레이크포인트): 특정 명령어에 브레이크포인트를 설정 시, 프로그램 실행이 그 위치에서 일시 정지
    • F9 : 브레이크포인트 지점으로 바로 이동
    • Alt + B: 브레이크포인트 확인
    • Ctrl + F12: 프로그램 다시 시작
    • NumLock -: 전단계 혹은 후진 
    • NumLock +: 다음단계 혹은 전진


03. MessageBox() 함수의 구조

: PUSH OFFSET 00402000 / PUSH OFFSET 00402012는 메모리에 있는 데이터를 스택에 넣는 역할을 한다.
메모리에 어떤 데이터가 저장되어 있는 지는 마우스 오른쪽 클릭 후 Follow in Dump → Immediate constant 메뉴를 통해 확인할 수 있다.

+ 00은 null을 의미한다.


04. 서브루틴과 스택 프레임

- 서브루틴
: 스택 프레임 구조로 이루어져 있으며, 어떻게 동작하는지 알아보려면 F7을 통해 한 단계 들어가야 알 수 있다.


05. 프로그램 구조 분석

  • GetDriveTypeA( ) 함수 호출 : 드라이브 종류를 정수 형태로 반환한다. 함수의 반환값은 EAX 레지스터에 저장되며, 함수 실행이 끝나면 EAX 레지스터에 3이 저장된 것을 확인할 수 있는데, MSDN을 참조하면 반환값 3은 하드디스크 드라이브라는 것을 알 수 있다.

 

  • 드라이브 종류 확인 : INC, DEC 명령어는 뒤에 오는 레지스터값을 1씩 감소 또는 증가시키는 동작한다. 따라서 ESI 레지스터 값을 3 증가시키고 EAX 레지스터 값을 2 감소시킨다.

 

  • 비교문과 점프문 : CMP명령어는 뒤에 오는 두 레지스터의 값이 같으면 제로 플래그 레지스터 값을 1로 설정 뒤에 오는 JE 명령어는 앞의 비교구문 결과가 같으면 지정된 주소로 점프, 다르면 다음 행을 실행한다.

 

  • 제로 플래그 레지스터 : EAX레지스터와 ESI 레지스터의 값이 다르므로 제로플래그 레지스터에는 0이 저장된다.

 

  • 목적 달성 실패 : CMP EAX, ESI 구문의 결과가 다를 때 이 부분이 실행된다.

 

  • 목적 달성 성공 : CMP구문의 결과가 같을 때 JE SHORT 명령어를 수행하여 이 부분이 실행된다.


06. 문제해결

: JMP 주소를 00401023으로 바꿔주면 문제가 풀린다.


  • abex crackme - 02


두 번째 예제는 사용자가 입력한 이름과 관련있는 일련번호를 찾아내는 것이 목적으로 이름을 기반으로 만들어진 일련번호가 저장된 메모리 위치를 찾아가는 것이 문제 해결 방법이다.

01. 프로그램 실행

프로그램 실행 시 엔트리 포인트에서 실행을 멈추게 되는데, 이때 F9를 눌러 프로그램을 실행하면 MSVBUM60.ThunRTMain() 함수에서 실행이 멈추게 된다.

프로그램과 상호작용하려면 프로그램 실행 상태를 반드시 'Running' 으로 만들어야 한다.


02. 문자열 검색

프로그램 코드 양이 많을 경우 문자열 검색을 사용하면 유용하다.

공격 실패 또는 성공 시 여러 메시지를 볼 수 있는데, 이 메시지 문자열을 검색해 디버깅 위치를 결정한다.

: 코드 영역에서 마우스 우클릭을 해서 Search for 메뉴 → All refernced text string 메뉴를 클릭하면 프로그램의 전체 문자열을 보여 준다.

Search for text 기능을 활용해서 필요한 문자열의 위치를 구해 준다.


03. 스택 분석하기

스택 분석을 위해 주소 '00403054' 에  브레이크포인트를 설정해 준다.

프로그램을 실행해 2자리 이름과 일련번호 1234를 입력해서 프로그램이 브레이크포인트로 이동하도록 해 준다.

입력 후 check를 누르면 디버거가 브레이크포인트 부분에서 자동으로 멈춘다.
스텝 오버 기능으로 프로그램을 주소 00403066까지 실행해 준다.

아까 찾은 문자열 주소로 스택 데이터를 수정해 준다.
스택 주소에서 binary메뉴의 edit을 선택하고 원하는 데이터가 있는 주소로 주소값 변경을 해주면 된다.



04. 메모리 분석하기

- 메모리:  Adress, Hex dump, ASCII

- 디버거는 ASCII영역에서 헥스 덤프의 데이터를 아스키값으로 변경해 디버깅 시 참고할 수 있도록 해준다.

메모리에 저장된 값을 수정해 메시지 창의 타이틀을 변경한다.

Error 문자열 부분을 선택하여  right로 변경해 준다.

: 수정 후 프로그램을 실행하면 타이틀이 변경된 것을 확인할 수 있다.


05. 프로그램 구조 분석

01) 입력한 이름의 길이를 검사하는 부분으로, 4자리보다 작으면 오류가 발생한다.

02) 이름을 사용해서 반복문으로 일련번호를 생성하는 부분이다.

03) 일련번호를 확인하고 맞으면 첫번째, 틀리면 두 번째 문자열을 보여 준다.

06. 문제해결

메모리 영역에서 우클릭 Integer->Address with ASCII dump 메뉴를 선택하면 4바이트 단위의 아스키 값을 확인할 수 있고, 문자열 'C5C6C7C8' 이 저장된 것을 확인할 수 있다.

name에 abcd, 일련번호에 C5C6C7C8를 입력해 주면 문제가 해결된다.

+ Recent posts