ELF: https://doitnow-man.tistory.com/entry/ELF-1-ELF-%EB%9E%80
Header + sections 로 구성
ELF의 헤더 중에 진입점(Entry Point, EP)이라는 필드가 있는데, 운영체제는 ELF를 실행할 때,
진입점의 값부터 프로그램을 실행한다.
아래 사진과 같이 'readelf' 로 확인가능하다.
gdb의 entry 명령어는 진입점부터 프로그램을 분석할 수 있게 해주는 명령어이다.
DISASM영역의 화살표(►)가 가리키는 주소는 현재 rip의 값이다.
EP == RIP
앞서 살펴본 프로그램 진입점의 주소와 일치한다.
프로그램은 실행되면서 레지스터를 비롯한 여러 메모리에 접근합니다. 따라서 디버거를 이용하여 프로그램의 실행 과정을 자세히 관찰하려면 컴퓨터의 각종 메모리를 한눈에 파악할 수 있는 것이 좋습니다. pwndbg는 주요 메모리들의 상태를 프로그램이 실행되고 있는 맥락(Context)이라고 부르며, 이를 가독성 있게 표현할 수 있는 인터페이스를 갖추고 있습니다.
context는 크게 4개의 영역으로 구분됩니다.
REGISTERS:
레지스터의 상태
DISASM:
rip부터 여러 줄에 걸쳐 디스어셈블된 결과를 보여준다.
이들은 어셈블리를 실행할 때마다 갱신된다. 따라서 실시간으로 실행한 어셈블리 명령어가 메모리에 어떤 영향을 주는지 쉽게 파악이 가능한다.
gdb를 이용하여 프로그램을 분석할 때, 일반적으로 전체 프로그램 중 아주 일부분의 동작에만 관심이 있습니다. 이 예제에서 main 함수가 분석의 대상이라고 가정하겠습니다. 이런 상황에서, 진입점부터 main 함수까지, 코드를 한 줄씩 실행시켜가며 main 함수에 도달해야 한다면, 디버깅은 그렇게 효율적인 분석 방법이 아닐 것입니다.
효율적인 디버깅을 위해서 사용하는 기능이다.
break: 특정 주소에 중단점설정
continue: 중단된 프로그램을 계속 실행
현재 중단된 start 함수부터 main 함수까지 실행시키면 다음과 같다.
앞서 설정한 endpoint 에 의해서 실행이 멈춘다.
b: break
c: continue
r: run
si: step into
ni: next instruction
i: info
k: kill
pd: pdisas
gdb는 프로그램을 어셈블리 코드 단위로 실행하고, 결과를 보여주고 기본적으로 disassemble 기능을 탑재하고 있다.
pwndbg에는 디스어셈블된 결과를 가독성 좋게 출력해주는 기능이 있는데, 다음과 같다.
disassemble은 gdb가 기본적으로 제공하는 디스어셈블 명령어이다. 아래와 같이 함수 이름을 인자로 전달하면 해당 함수가 반환될 때 까지 전부 디스어셈블하여 보여준다.