Without a Break

[Dreamhack] Tool: gdb 본문

Pwnable/Dreamhack

[Dreamhack] Tool: gdb

와븨 2022. 10. 12. 05:50

debugee.c 파일을 생성한 뒤 디버그 파일을 실행시킨다.

실행 결과

실행하면 다음과 같이 뜬다.

 


start

ELF : 리눅스의 실행 파일 형식

EP(Entry Point) : ELF의 헤더 중 진입점 필드

debugee 파일을 readelf로 확인해 본 결과, debugee의 진입점은 0x1060이라는 것을 알 수 있다.

 

 

gdb debugee로 들어가 pwndbg에 start 명령을 입력하면

마찬가지로 진입점의 주소를 확인할 수 있다.

 

 


Context

context는 크게 registers, disasm, stack, backtrace의 4개의 영역으로 나눈다.

registers 지스터의 상태를 보여줍니다.
disasm  rip부터 여러 줄에 걸쳐 디스어셈블된 결과를 보여줍니다.
stack rsp부터 여러 줄에 걸쳐 스택의 값들을 보여줍니다.
backtrace 현재 rip에 도달할 때까지 어떤 함수들이 중첩되어 호출됐는지 보여줍니다. 곧 예시를 들어 더 자세히 설명하겠습니다.

 

 


break & continue

break는 특정 주소에 중단점을 설정하는 기능이고, continue는 중단된 프로그램을 계속 실행시키는 기능이다.

 

중단된 start 함수부터 main 함수까지 실행시키면 다음과 같이 실행된다.

 

 


run

단순히 실행만 시킨다.

 

앞에서 main 함수에 중단점을 설정해놨기 때문에 run 명령어를 실행해도 main 함수에서 실행이 멈춘다.

 

 


disassembly

gdb는 프로그램을 어셈블리 코드 단위로 실행하고, 결과를 보여준다.

프로그램의 코드는 기계어로 이루어져 있으므로, gdb는 기계어를 디스어셈블하는 기능을 기본적으로 탑재하고 있다.'

u,nearpc, pdisassemble는 pwndbg에서 제공하는 디스어셈블 명령어이다.

 

main 함수를 디스어셈블한 모습

 


navigate

관찰하고자 하는 함수의 중단점에 도달했으면, 그 지점부터는 명령어를 한 줄씩 자세히 분석해야 한다.

이 때 사용하는 명령어로 ni와 si가 있다.

 

next instruction

ni를 입력하면 printf 함수 바로 다음으로 rip이 이동한 것을 확인할 수 있다.

 

step into

si를 입력하면 printf 함수 내부로 rip가 이동한 것을 확인할 수 있다.

 

finish

finish 명령어를 사용하여 함수의 끝까지 한 번에 실행할 수 있다.

 

 


examine

가상 메모리에 존재하는 임의 주소 값을 관찰해야할 때가 있다. 이를 위해 gdb에서는 x라는 명령어를 제공한다.

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

 

예시) rsp부터 80바이트를 8바이트씩 hex 형식으로 출력

 

 


telescope

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

 

 


vmmap

가상 메모리의 레이아웃을 보여준다.

어떤 파일이 매핑된 영역일 경우, 해당 파일의 경로까지 보여준다.