3.7 패치

3.7.1 원하는 코드 위치 찾기

  1. 어셈블리어 코드를 한 줄씩 실행시켜 출력 상태 확인하기

    -> Step Into[F7], Step Over[F8] 로 출력 상태 확인

  2. 문자열 검색

    -> 마우스 오른쪽 버튼 클릭해 Search for > All referenced text strings 선택

    ( 찾고자 하는 코드 위에 실행하기!)

  3. 프로그램이 사용한 함수 검색

    -> 마우스 오른쪽 버튼 클릭해 Search for > All intermodular calls 검색

3.7.2 메모리 패치

소스가 없는 프로그램을 자신이 원하는 결과로 수정하기

ex) Hello, Word!.exe 프로그램에서 출력하는 문자열을 메모리 패치를 통해 다른 문자열로 바꾸기

  1. 올리디버거로 Hello, Word!.exe 실행
  2. “Hello, Word!” 문자열 출력 코드로 이동
  3. 올리디버거 덤프 영역에서 마우스 오른쪽 버튼으로 Go to > Expression 메뉴 클릭 (Ctrl + G)
  4. 문자열 “Word” 드래그 후 마우스 오른쪽 버튼으로 Binary > Edit 메뉴
  5. 메모리 수정 창에서 아스키, 유니코드, 16진수 등의 부분에서 수정

3.7.3 코드 패치

-> printf 함수 호출전에 “Hello, word” 문자열 주소를 인자값으로 입력하는 코드를 수정해서 프로그램 패치

  1. 마우스 오른쪽 버튼 클릭으로 Binary > Edit 메뉴 선택/ 단축키 Ctrl + E 사용/ 어셈블리어 코드 더블 클릭
  2. 코드 패치 명령어 입력창을 통해 코드 패치

3.7.4 파일 저장

메모리가 패치되거나 코드 패치된 프로그램을 재실행하면 패치된 내용이 적용 X

=> 프로그램이 실행되고 있는 메모리에서만 패치가 이뤄져 디스크에 저장되어 있는 파일은 변화가 없기 때문!

  • 패치된 내용을 파일에 적용시키기

    1. 패치된 문자열을 드래그 & 마우스 오른쪽 버튼 > Copy to executable file 메뉴 클릭

    2. File 창에서 마우스 오른쪽 버튼 클릭 & save file 메뉴 선택 & 원하는 파일명으로 저장

3.8 실전

3.8.1 비밀번호

pass.exe 프로그램을 분석해 비밀번호 검사 루틴을 우회하거나 복구

  • 프로그램 분석

    • 디버깅

      -> 브레이크 포인트로 특정 값을 살펴보거나 수정하기 위해 임의의 지점에서 프로그램 멈추기

      • 브레이크 포인트

        1. 소프트웨어 브레이크 포인트

        2. 하드웨어 브레이크 포인트

    • 점프 패치

      -> 비밀번호 검사 우회

      • 점프문 명령어

        : EFLAGS 레지스터 상태에 따라 분기 결정

        1. 제로 플래그
        2. JE 명령어
        3. NOP 명령어

3.8.2 시리얼

  1. 시리얼 검사 루틴 찾기

    ->” The serial is incorrect” 검색

  2. 시리얼 검사 함수 찾기

    -> 시리얼 검사 프로그램에 비밀번호 검사 함수 찾는 방법을 적용

  3. 브레이크 포인트 설정

  4. 함수 인자로 사용자가 입력한 시리얼 입력

  5. **사용자가 입력한 시리얼값과 복화화된 시리얼값 비교 **

  6. 암호화된 시리얼을 복호화하여 올바른 시리얼 구함