[Dreamhack] Tool: gdb

·2024년 2월 26일

Security

목록 보기
5/60

gdb & pwndbg

gdb(GNU debugger)는 리눅스의 대표적인 디버거
gdb의 플러그인 중에서 바이너리 분석 용도를 널리 사용되는 플러그인들은 gef, peda, pwngdb, pwndbg 등이 있다.
이 포스트에서는 pwndbg를 다룰 것임

우분투에서 pwndbg 설치

$ apt-get update
$ apt-get install git
$ git clone https://github.com/pwndbg/pwndbg.git
$ ls
$ cd pwndbg/
$ ls
$ ./setup.sh

gdb를 설치한 후 실행 후 화면
text editer로 c파일을 생성 후 컴파일까지 해줍니다.

// Name : 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;
}

명령어

1. entry

ELF (Executable and Linkable Format)

  • 헤더와 여러 섹션들로 구성
  • 헤더 : 실행에 필요한 여러 정보들
    + 진입점(Entry Point, EP) : OS는 ELF를 실행할 때, 진입점의 값부터 프로그램을 실행
  • 섹션 : 컴파일된 기계어 코드, 프로그램 문자열을 비롯한 여러 데이터

-> 진입점으로부터 프로그램을 분석할 수 있게 해주는 명령어

2. context

맥락 (Context)
1. Registers : 레지스터의 상태를 보여줌
2. Disasm : rip(명령어 포인터 레지스터)부터 여러 줄에 걸쳐 디스어셈블된 결과를 보여줌
3. Stack : rsp(사용중인 스택을 가리키는 포인터)부터 여러 줄에 걸쳐 스택의 값들을 보여줌
4. Backtrack : 현재 rip에 도달할 때까지 어떤 함수들이 중첩되어 호출되었는지 보여줌

3. break, continue, run

break

  • 특정 주소에 중단점(breakpoint)을 설정하는 기능

continue

  • 중단된 프로그램을 계속 실행시키는 기능

run

  • 단순 실행

gdb 명령어 축약

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

disassembly

gdb가 기본적으로 제공하는 디스어셈블 명령어로, 함수 이름을 인자로 전달하면 해당 함수가 반환될 때까지 전부 디스어셈블하여 보여줌

ni & si

ni : next instruction, printf 함수 바로 다음으로 rip 이동
si : step into, printf 함수를 호출하는 지점까지 프로그램 실행 후 si 입력하면 printf 함수 내부로 rip 이동함

finish

: 함수의 끝까지 한 번에 실행

examine(x)

: 특정 주소에서 원하는 길이만큼의 데이터를 원하는 형식으로 인코딩하여 볼 수 있음

telescope(tele)

: 강력한 메모리 덤프 기능으로 메모리가 참조하고 있는 주소를 재귀적으로 탐색하여 값을 보여줌

vmmap

: 메모리 레이아웃 출력

helloworld.c 디스어셈블

Dump of assembler code for function main:
   0x0000000000401136 <+0>:	endbr64 
   # 코드 섹션의 시작을 나타내기 위해 컴파일러에 의해 추가됨
   
   0x000000000040113a <+4>:	push   rbp
   0x000000000040113b <+5>:	mov    rbp,rsp
   
   # 스택 프레임을 설정, push rbp는 베이스 포인터의 값을 스택에 푸시
   # mov rbp, rsp 는 베이스 포인터를 현재 스택 포인터 값으로 설정함
   
   0x000000000040113e <+8>:	lea    rax,[rip+0xebf]        # 0x402004
   # 메모리의 오퍼랜드의 유효한 주소를 계산하며, 
   # 레지스터 rax에 [rip+0xebf] 주소를 로드
   
   0x0000000000401145 <+15>:	mov    rdi,rax
   # rdi 레지스터에 있는 값을 rid 레지스터 이동시킴
   
   0x0000000000401148 <+18>:	call   0x401040 <puts@plt>
   # puts 함수를 호출하며, 호출할 때 rdi 레지스터에 로드한 주소가 인자로 사용됨
   # 문자열 출력, 출력할 문자열은 주소 0x402004에 위치
   
   0x000000000040114d <+23>:	mov    eax,0x0
   # main 함수의 반환 값을 0으로 설정함
   # C에서는 프로그램이 성공적으로 실행되었음을 나타냄
   
   0x0000000000401152 <+28>:	pop    rbp
   0x0000000000401153 <+29>:	ret    
   # 스택 프레임을 정리, pop rbp는 베이스 포인터를 복원
   # ret은 함수에서 반환함

Dreamhack wargame_welcome

nc 명령어를 실행하기 위해서는 netcat 설치 필요

$ apt-get install netcat
$ apt-get update
$ nc host3.dreamhack.games 18971 # portnumber
# c 파일과 함께 flag 나옴
profile
Whatever I want | Interested in DFIR, Security, Infra, Cloud

0개의 댓글