선릉역 1번 출구

System Hacking - gdb 본문

Hacking & Security/Hacking

System Hacking - gdb

choideu 2022. 12. 25. 23:31

1. pwndbg 다운받기

git clone https://github.com/pwndbg/pwndbg

cd pwndbg
./setup.sh

 

2. 다운로드 확인

 

3. 코드 작성 후 컴파일

sudo gedit debugee.c or sudo vi debugee.c

#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;
}

gcc를 사용해 작성한 debugee.c 파일을 컴파일

gcc -o debugee debugee.c -no-pie
= debugee.c를 o 옵션을 사용해 debugee로 저장

 

4. gdb를 사용해 디버깅

 

5. 리눅스의 실행파일 형식 ELF의 header 확인

readelf -h debugee

Entry point address(EP): OS는 ELF를 실행할 때 진입점의 값부터 프로그램을 실행함 -> 0x400400

 

6. DISASM영역의 화살표가 가리키는 주소 확인

이 값은 현재 rip의 값으로, start 명령어를 실행하고 보면 0x400400을 가리키고 있음

앞서 본 EP와 같음

 

7. pwndbg의 구조 파악하기

주요 메모리들의 상태를 프로그램이 실행되고 있는 맥락(context)이라고 부름 -> 가독성 있게 표현할 수 있는 인터페이스를 갖춤

context는 4개의 영역으로 구분됨

  • registers: 레지스터의 상태를 보여줌
  • disasm: rip부터 여러 줄에 걸쳐 디스어셈블된 결과를 보여줌
  • stack: rsp부터 여러 줄에 걸쳐 스택의 값들을 보여줌
  • backtrace: 현재 rip에 도달할 때까지 어떤 함수들이 중첩되어 호출됐는지를 보여줌

 

8. 기능

  • b(break): 중단점 설정
  • c(continue): 중단된 프로그램 실행
  • r(run): 실행
  • si(step into): 들어가기
  • ni(next instruction): 다음 명령어
  • i(info)
  • k(kill)
  • pd(pdisas)
  • disassemble 함수이름
    • 가독성을 좋게 출력해주는 명령어 
    • u
    • nearpc
  • finish: si를 통해 들어간 후, 다시 되돌아오기 위해 함수의 끝까지 한 번에 실행하는 명령어
  • examine: 가상 메모리에 존재하는 임의 주소의 값을 관찰하는 명령어
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).
  • tele(telescope): 메모리 조회, 메모리값이 포인터일 경우 재귀적으로 따라가며 모든 메모리값 출력
  • vmmap: 메모리 레이아웃 출력
Comments