본문 바로가기

DreamHack: System Hacking/F Stage 3

Tool: gdb (gdb 명령어 정리)

Linux 실행파일 형식 == ELF

ELF는 '헤더&섹션'으로 구성되어있다.
헤더: 실행에 필요한 여러 정보가 들어있음
섹션: 컴파일된 기계어&프로그램 문자열&여러 데이터가 들어있음

ELF가 실행될 때는 Entry Point(EP)부터 프로그램이 실행됨.(명령어: readelf -h "실행 프로그램 이름")

----------------------------------------------------------------------------------------------------------------------------------------

context

context는 크게 4개의 영역으로 구분된다.
1. registers: 레지스터의 상태를 보여줍니다.
2. disasm: rip부터 여러 줄에 걸쳐 디스어셈블된 결과를 보여줍니다.
3. stack: rsp부터 여러 줄에 걸쳐 스택의 값들을 보여줍니다.
4. backtrace: 현재 rip에 도달할 때까지 어떤 함수들이 중첩되어 호출됐는지 보여줍니다.

----------------------------------------------------------------------------------------------------------------------------------------

gdb 명령어

gdb "프로그램 이름" == debuging 시작
start == Entry Point(EP)부터 프로그램을 분석할 수 있게 해준다. (DISASM에서 가리키는 화살표 == 현재 rip의 값)


b: break (ex. b *main+48// b *main)
c: continue
r: run->
si: step into
ni: next instruction
i: info
k: kill
pd: pdisas

disassemble "함수 이름" == 해당 함수가 반환될 때까지를 디스어셈블 하여 보여줌
u, nearpc, pdisassemble == 가독성 좋게 디스어셈블 해줌

ni == 중단점(break point)부터 명령어를 한 줄씩 실행함//서브루틴 내부로 들어가지 않음(X)
si == 중단점(break point)부터 명령어를 한 줄씩 실행함//서브루틴의 내부로 들어감(O)

finish == 함수 끝까지 실행

###################################가상 메모리의 값 읽기#######################################
'x'라는 명령어 이용

---Format letters---
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---
b(byte), h(halfword), w(word), g(giant, 8 bytes)

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

tele == 특정 주소의 메모리 값을 보여줌&메모리가 참조하고 있는 주소값까지 보여줌

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

###################################### r $() 명령어 ############################################
r $() == ()안에 파이썬 코드 입력하면 값을 "전달"함
ex) 1. r $(python -c 'print("\xff"*100)')
r $(python -c '입력할 코드')
    2. r $(python -c 'print("\xff"*100)') <<< $(python -c 'print("dreamhack")')
'<<<'이용하여 값을 입력할 수 있음

###################################최종 정리########################################
start: 진입점에 중단점을 설정하고, 실행
break(b): 중단점 설정
continue(c): 계속 실행

disassemble: 디스어셈블 결과 출력

u, nearpc, pd: 디스어셈블 결과 가독성 좋게 출력

x: 메모리 조회

run(r): 프로그램 처음부터 실행

context: 레지스터, 코드, 스택, 백트레이스의 상태 출력

nexti(ni): 명령어 실행, 함수 내부로는 들어가지 않음
stepi(si): 명령어 실행, 함수 내부로 들어감

telescope(tele): 메모리 조회, 메모리값이 포인터일 경우 재귀적으로 따라가며 모든 메모리값 출력
vmmap: 메모리 레이아웃 출력