본문 바로가기

리버싱/x64dbg 디버거를 활용한 리버싱과 시스템 해킹의 원리

ch03 - 디버거의 활용 방법(x64DBG/OllyDBG)

728x90

01 프로그램 디버깅

02 디버거의 종류

03 디버거 사용법(x64 dbg)

 

1. 프로그램 디버깅

 1.1 프로그래밍 오류

 - 1차이 오류(off-by-one error) : 프로그래머가 간과한 곳에서 발생하는 오류로 주로 아이템 사이의 공간과 아이템 수를 착각할 때 주로 발생한다. 이런 오류를 찾기 위해 c언어에서는 디버깅 과정을 거친다.

 

  • 문법 오류 - 간단한 문법을 빠뜨린 경우(,)
  • 심볼 오류 - 심볼 테이블에서 변수나 함수 이름을 찾을 수 없을 때 발생한다. 변수 선언 문제
  • 메모리 접근 오류 - 변수나 주소를 사용할 때 프로세스에 허용되는 영역을 벗어날 경우 발생한다. 주소의 문제
  • 잘못된 결과 출력 오류 - 원래 기대했던 값과 다른 값이 나온 경우로 어디서 잘못됐는지 찾기 어려워 수정이 어렵다.
  • 장기 작업 오류 - 프로그램을 오랫동안 실행하는 동안 발견할 수 있는 오류로 메모리 누수가 발생한 것.

 1.2 프로그래밍 오류가 자주 발생하는 지점

  • 프로그램 비교 조건문의 작성 실수
  • 프로그램에서 반환 값과 포인터의 오류 검사 - 값의 범위 문제
  • 프로그램 내 값의 잘못된 적용

 

 1.3 프로그래밍 오류 찾는 법

  • 직접 일일이 한 줄씩 찾아보기
  • printf()를 중간에 넣어 오류 발생 예상
  • 디버거 사용

 

2. 디버거 종류

무료 공개용 도구로 GUI 기반이며 디버깅 용도로 사용

 

사용 도구로 C언어 구조로 보여줄 수 있고 전문가용

 

Ollydbg와 유사

 

3. 디버거 사용법(x64 dbg)

 3.1 x64 dbg 설치

사이트 : https://sourceforge.net/projects/x64dbg/

release 폴더의 x 96 dbg.exe 프로그램을 실행하고 설치하면 된다.

  • x64 dbg 메뉴

 -> 작업 창으로 CPU 탭에 해당한다.

(1) - 어셈블리어 코드와 명령 어코드를 나타내고 있는 목적 코드 부부

(2) - CPU의 레지스터의 값을 보여주는 창이며, 실행 단계에서 값의 변화를 볼 수 있음

(3) - 메모리 공간의 값을 HEX코드(16진수)와 아스키코드로 보여주며, 관심 있는 주소를 설정해 데이터의 값의 변화를 확인할 수 있음

(4) - 함수에서 사용하는 스택 내용을 보여주며, 원하는 주소의 스탯 영역의 값들을 확인할 수 있음

(5) - 프로그램 코드 부분에서 실행되고 있는 각 해당 위치의 오프셋 값과 변경된 메모리 주소, 레지스터의 내용 등의 힌트 정보를 나타내 줌

(6) - 프로그램 코드에서 사용되는 매개변수와 지역변수의 위치를 레지스터 변위 값으로 표현함

 

 3.2 x64 dbg 주요 기능

  • 디버거 설정(Option)

시스템 중단점 - 프로세스가 초기화되어 사용자 코드를 아직 실행하지 않았을 때 발생하며, 사용자 코드를 실행하기 위한 준비 코드를 볼 수 있음

TLS 콜백 - TLS 콜백에서 일시 중지하며, main 함수가 실행되기 전에 파라미터를 설정할 수 있고 anti-debug 기술을 시행하기 위한 보호 기능들을 불러옴

진입점 중단점 - 프로그램의 시작 지점으로 이동시켜주는 기능

DLL 진입점 - 디버깅 중인 프로세스가 가져온 어떠한 DLL의 시작 지점으로 이동하는 기능

부착 중단점 - 실행되는 프로세스를 열었을 때, DbgUiRemoteBreakin() 함수로 들어갈 수 있도록 하는 기능

스레드 진입점 - 현재의 프로세스에서 실행되었던 새로운 스레드의 처음 명령으로 이동하는 기능

 

  • 디버거의 기본 명령어와 단축키

 

#x64 dbg 디버거의 보조 기능

 

 

 3.3 디버거를 사용하여 프로그램 따라가기

-> hello world 실행파일을 만들어 디버깅을 해보자.

 

#명령어 코드 한 줄씩 실행

 - [F7] 키는 Call함수의 내부로 따라 들어가 수행(함수 내부가 궁금할 때)

 - [F8] 키는 하나의 명령어씩 수행

 

#베이스캠프 설정하기

 - 디버깅을 하는데 오랜 시간이 걸리기 때문에 중간에 휴식 지점이 필요하다.

  • 중단점 [F2] - 실행 도중 멈추게 되므로 프로그램을 다시 시작해도 해당 지점에 멈추게 할 수 있다. [del]로 중단점 해제 가능
  • 레이블 달기[:] - [:] 키를 사용하면 레이블을 달수 있는데 메시지 상자를 출력하는 메인 함수의 시작 위치를 표시할 수 있다
  • 주석 달기[;] - 원하는 위치에 주석 달기
  • 주소로 직접 이동하기 [Ctrl + G] - 메모리 덤프 창과 비슷하다

 

 3.4 원하는 코드 위치로 찾아가는 방법

 

  • 문자열 검색 방법

프로그램 코드 창에 팝업 메뉴를 띄어 다음을 찾기(S) 선택 -> 문자열 참조 선택

 

  • API 검색 방법

아스키코드 기준으로 영어 문자열 위주로 검색되며 모듈 간 호출(I)을 선택