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

ELF (Executable and Linkable Format)
-> 진입점으로부터 프로그램을 분석할 수 있게 해주는 명령어
맥락 (Context)
1. Registers : 레지스터의 상태를 보여줌
2. Disasm : rip(명령어 포인터 레지스터)부터 여러 줄에 걸쳐 디스어셈블된 결과를 보여줌
3. Stack : rsp(사용중인 스택을 가리키는 포인터)부터 여러 줄에 걸쳐 스택의 값들을 보여줌
4. Backtrack : 현재 rip에 도달할 때까지 어떤 함수들이 중첩되어 호출되었는지 보여줌

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

ni : next instruction, printf 함수 바로 다음으로 rip 이동
si : step into, printf 함수를 호출하는 지점까지 프로그램 실행 후 si 입력하면 printf 함수 내부로 rip 이동함
: 함수의 끝까지 한 번에 실행
: 특정 주소에서 원하는 길이만큼의 데이터를 원하는 형식으로 인코딩하여 볼 수 있음
: 강력한 메모리 덤프 기능으로 메모리가 참조하고 있는 주소를 재귀적으로 탐색하여 값을 보여줌
: 메모리 레이아웃 출력


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은 함수에서 반환함

nc 명령어를 실행하기 위해서는 netcat 설치 필요
$ apt-get install netcat
$ apt-get update
$ nc host3.dreamhack.games 18971 # portnumber
# c 파일과 함께 flag 나옴