Tool : gdb

곽무경·2022년 6월 29일
0

System Hacking

목록 보기
5/27

디버거

버그를 없애기 위해 사용하는 도구

gdb

리눅스의 대표적인 디버거 (여기서는 pwndbg 사용)

디버깅 시작

$gdb filename

start

진입점부터 프로그램 분석

pwndbg> start

각 영역(context)

REGISTER : 레지스터의 상태

DISASM : rip 부터 여러 줄에 걸쳐 디스어셈블된 결과 출력

STACK : rsp 부터 여러 줄에 걸쳐 스택의 값들을 출력

BACKTRACE : 현재 rip에 도달할 때까지 중첩되어 호출된 함수들을 출력

break(b)

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

pwndbg> b *main               ; main 함수가 실행되는 시점에 중단점 설정

continue(c)

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

run(r)

단순 실행
설정한 중단점이 없다면 프로그램이 끝까지 멈추지 않고 실행된다.

disassemble

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

nearpc, u, pd

디스어셈블된 코드를 가독성 좋게 출력
pwndbg에서 제공하는 디스어셈블 명령어

ni, si, finish

어셈블리 명령어를 한 줄 실행

  • ni(next instruction) : 서브루틴의 내부로 들어가지 않음
  • si(step into) : 서브루틴의 내부로 들어감 (함수 내부도 한 줄씩 실행)
  • finish : 서브루틴 내부로 진입한 경우 함수의 끝까지 한번에 실행

x

특정 주소에서 원하는 길이만큼의 데이터를 원하는 형식으로 인코딩하여 출력

형식
o(octal) x(hex) d(decimal) u(unsigned decimal) t(binary) f(float) a(address) i(instruction) c(char) s(string) z(hex, zero padded on the left)
사이즈
b(byte) h(halfword) w(word) g(giant, 8 bytes)

  1. rsp부터 80바이트를 8바이트씩 hex 형식으로 출력
    → x/10gx $rsp
  2. rip부터 10줄의 어셈블리 명령어 출력
    → x/10i $rip
  3. 특정 주소의 문자열 출력
    → x/s 0x400000

tele

메모리 덤프 기능
특정 주소의 메모리 값들을 보여주고, 참조하고 있는 주소를 재귀적으로 탐색하여 값을 출력

vmmap

가상 메모리의 레이아웃
어떤 파일이 매핑된 영역일 경우, 해당 파일의 경로까지 출력
파일 매핑 : 어떤 파일을 메모리에 적재하는 것

파이썬을 통한 입력값 전달

r $(python -c 'print "\xff"*100') <<< $(python -c 'print "dreamhack"')

0개의 댓글