GDB

현재·2023년 12월 26일
0

sys

목록 보기
8/9

프로그램을 아무리 논리구조를 신중하게 설계하고, 코드를 작성을 해도 코드의 규모가 커지다 보면 실수가 발생하기 마련입니다.
컴퓨터과학에서는 이렇게 실수로 발생한 프로그램의 결함을 버그(bug)라고 합니다.


하지만 완성된 코드에서 버그를 찾는 것은 어렵습니다. 그래서 이런 어려움을 해소하고자 디버거(Debugger)라는 도구가 개발되었습니다.

리눅스의 대표적인 디버거 중 하나인 gdb에 대해 알아보겠습니다.

gdb

gdb (GNU debugger)는 리눅스의 대표적인 디버거입니다.

실습

#include <stdio.h>
int main(void) {
  int sum = 0;
  int val1 = 1;
  int val2 = 2;

  sum = val1 + val2;

  printf("1 + 2 = %d\n", sum);

  return 0;
}

gdb debugee 로 디버깅하기

// Name: debugee.c
// compile: gcc -o debugee debugee.c -no-pie

entry

ELF (Executable and Linkable Format)

실행 파일, 목적 파일, 공유 라이브러리 그리고 코어 덤프를 위한 표준 파일 형식이다.

진입점(Entry Point, EP)

말 그대로 '진입점'이라는 의미로 프로그램이 시작하는 지점이다.

context

pwndbg = 맥락(Context)

context는 크게 4개의 영역으로 구분됩니다.

  1. REGISTERS: 레지스터의 상태를 보여줍니다.

  2. DISASM: rip부터 여러 줄에 걸쳐 디스어셈블된 결과를 보여줍니다.

  3. STACK: rsp부터 여러 줄에 걸쳐 스택의 값들을 보여줍니다.

  4. BACKTRACE: 현재 rip에 도달할 때까지 어떤 함수들이 중첩되어 호출됐는지 보여줍니다.

이들은 어셈블리를 실행할 때마다 갱신되어 방금 실행한 어셈블리 명령어가 메모리에 어떤 영향을 줬는지 쉽게 파악할 수 있게 도와준다.

break & continue

디버깅 시 main 함수와 같이 특정 부분에만 관심이 있는 경우, 효율적인 접근 방법은 breakcontinue를 사용하는 것입니다.

  • break는 특정 주소에 중단점을 설정한다.
  • continue는 중단된 프로그램을 계속 실행시킨다.

run

앞의 start가 진입점부터 프로그램을 분석할 수 있도록 자동으로 중단점을 설정해줬다면, run 은 단순히 실행만 시킵니다.

gdb의 명령어 축약

b: break
c: continue
r: run
si: step into
ni: next instruction
i: info
k: kill
pd: pdisas

disassembly

기계어를 어셈블리어로 변환하는 것을 말한다.
u, nearpc, pdisass는 pwndbg에서 제공하는 디스어셈블 명령어입니다. 디스어셈블된 코드를 가독성 좋게 출력해줍니다.

관찰하고자 하는 함수의 중단점에 도달하고, 그 지점부터는 명령어를 한 줄씩 자세히 분석할때 nisi를 사용한다.

ni와 si는 모두 어셈블리 명령어를 한 줄 실행하지만

  • ni는 서브루틴의 내부로 들어가지 않고
    si는 서브루틴의 내부로 들어간다

next instruction

ni를 입력하면, 아래와 같이 printf 함수 바로 다음으로 rip가 이동한 것을 확인할 수 있습니다.

step into

si를 입력하면 아래와 같이 printf 함수 내부로 rip가 이동한 것을 확인할 수 있습니다.

finish

step into로 함수 내부로 들어오고 나서 ni로는 원래 실행 흐름으로 돌아가기 어려울 때가 있다.
이럴 때는 finish라는 명령어를 사용하여 함수의 끝까지 한 번에 실행할 수 있습니다.

examine

프로그램 분석 중에는 가상 메모리의 임의 주소에 저장된 값을 확인해야 할 때가 있습니다
GDB의 x 명령어를 사용하면 가상 메모리의 특정 주소에서 원하는 데이터를 지정된 형식으로 확인할 수 있습니다.

Format letters are o(octal), x(hex), d(decimal), u(unsigned decimal), t(binary), f(float), a(address), i(instruction), c(char), s(string) and z(hex, zero padded on the left). Size letters are b(byte), h(halfword), w(word), g(giant, 8 bytes).

telescope

Pwndbg는 메모리 덤프 기능을 제공하는데, 특정 주소의 메모리 값 뿐만 아니라 해당 주소가 참조하는 다른 주소들도 재귀적으로 탐색하여 보여줍니다.

vmmap

가상 메모리의 레이아웃을 보여줍니다. 어떤 파일이 매핑 된 영역일 경우, 해당 파일의 경로까지 보여줍니다.

profile
개발자

0개의 댓글