01 프로그램 디버깅
02 디버거의 종류
03 디버거 사용법(x64 dbg)
1. 프로그램 디버깅
1.1 프로그래밍 오류
- 1차이 오류(off-by-one error) : 프로그래머가 간과한 곳에서 발생하는 오류로 주로 아이템 사이의 공간과 아이템 수를 착각할 때 주로 발생한다. 이런 오류를 찾기 위해 c언어에서는 디버깅 과정을 거친다.
- 문법 오류 - 간단한 문법을 빠뜨린 경우(,)
- 심볼 오류 - 심볼 테이블에서 변수나 함수 이름을 찾을 수 없을 때 발생한다. 변수 선언 문제
- 메모리 접근 오류 - 변수나 주소를 사용할 때 프로세스에 허용되는 영역을 벗어날 경우 발생한다. 주소의 문제
- 잘못된 결과 출력 오류 - 원래 기대했던 값과 다른 값이 나온 경우로 어디서 잘못됐는지 찾기 어려워 수정이 어렵다.
- 장기 작업 오류 - 프로그램을 오랫동안 실행하는 동안 발견할 수 있는 오류로 메모리 누수가 발생한 것.
1.2 프로그래밍 오류가 자주 발생하는 지점
- 프로그램 비교 조건문의 작성 실수
- 프로그램에서 반환 값과 포인터의 오류 검사 - 값의 범위 문제
- 프로그램 내 값의 잘못된 적용
1.3 프로그래밍 오류 찾는 법
- 직접 일일이 한 줄씩 찾아보기
- printf()를 중간에 넣어 오류 발생 예상
- 디버거 사용
2. 디버거 종류
- OllyDBG - http://www.ollydbg.de에서 다운
무료 공개용 도구로 GUI 기반이며 디버깅 용도로 사용
사용 도구로 C언어 구조로 보여줄 수 있고 전문가용
- x64 dbg - https://sourceforge.net/projects/x64dbg/
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)을 선택
'리버싱 > x64dbg 디버거를 활용한 리버싱과 시스템 해킹의 원리' 카테고리의 다른 글
ch05 - 코드 분석과 패치 (0) | 2021.09.22 |
---|---|
ch04 - 어셈블리어의 이해 (0) | 2021.09.15 |
ch02 - 컴퓨터 시스템의 명령어 처리 구조 (0) | 2021.09.09 |
ch01 - 리버싱과 해킹의 이해 (0) | 2021.09.09 |
책 : x64dbg 디버거를 활용한 리버싱과 시스템 해킹의 원리 (0) | 2021.09.09 |