[System Hacking][DreamHack][Stage3] Tool: gdb (aws ubuntu)

marceline·2024년 3월 29일
0

[System Hacking]

목록 보기
17/17
post-custom-banner

gdb&pwndbg 실습예제

entry

ELF: https://doitnow-man.tistory.com/entry/ELF-1-ELF-%EB%9E%80

ELF (Executable and Linkable Format)

Header + sections 로 구성

  • 헤더에는 실행에 필요한 여러 정보 저장
  • 섹션들에는 컴파일된 기계어 코드, 프로그램 문자열을 비롯한 여러 데이터가 포함

EP (Entry point)

ELF의 헤더 중에 진입점(Entry Point, EP)이라는 필드가 있는데, 운영체제는 ELF를 실행할 때,
진입점의 값부터 프로그램을 실행한다.
아래 사진과 같이 'readelf' 로 확인가능하다.

entry

gdb의 entry 명령어는 진입점부터 프로그램을 분석할 수 있게 해주는 명령어이다.
DISASM영역의 화살표(►)가 가리키는 주소는 현재 rip의 값이다.

EP == RIP

앞서 살펴본 프로그램 진입점의 주소와 일치한다.

Context

프로그램은 실행되면서 레지스터를 비롯한 여러 메모리에 접근합니다. 따라서 디버거를 이용하여 프로그램의 실행 과정을 자세히 관찰하려면 컴퓨터의 각종 메모리를 한눈에 파악할 수 있는 것이 좋습니다. pwndbg는 주요 메모리들의 상태를 프로그램이 실행되고 있는 맥락(Context)이라고 부르며, 이를 가독성 있게 표현할 수 있는 인터페이스를 갖추고 있습니다.

context는 크게 4개의 영역으로 구분됩니다.

  1. REGISTERS:
    레지스터의 상태

  2. DISASM:
    rip부터 여러 줄에 걸쳐 디스어셈블된 결과를 보여준다.

  1. STACK:
    rsp부터 여러 줄에 걸쳐 스택의 값들을 보여준다.
  1. BACKTRACE:
    현재 rip에 도달할 때까지 어떤 함수들이 중첩되어 호출됐는지 보여준다.

이들은 어셈블리를 실행할 때마다 갱신된다. 따라서 실시간으로 실행한 어셈블리 명령어가 메모리에 어떤 영향을 주는지 쉽게 파악이 가능한다.

break & continue

gdb를 이용하여 프로그램을 분석할 때, 일반적으로 전체 프로그램 중 아주 일부분의 동작에만 관심이 있습니다. 이 예제에서 main 함수가 분석의 대상이라고 가정하겠습니다. 이런 상황에서, 진입점부터 main 함수까지, 코드를 한 줄씩 실행시켜가며 main 함수에 도달해야 한다면, 디버깅은 그렇게 효율적인 분석 방법이 아닐 것입니다.
효율적인 디버깅을 위해서 사용하는 기능이다.
break: 특정 주소에 중단점설정
continue: 중단된 프로그램을 계속 실행

b *main

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

run

r

앞서 설정한 endpoint 에 의해서 실행이 멈춘다.

gdb 명령어 축약

b: break

c: continue

r: run

si: step into

ni: next instruction

i: info

k: kill

pd: pdisas

disassembly

disassemble main

gdb는 프로그램을 어셈블리 코드 단위로 실행하고, 결과를 보여주고 기본적으로 disassemble 기능을 탑재하고 있다.
pwndbg에는 디스어셈블된 결과를 가독성 좋게 출력해주는 기능이 있는데, 다음과 같다.

disassemble은 gdb가 기본적으로 제공하는 디스어셈블 명령어이다. 아래와 같이 함수 이름을 인자로 전달하면 해당 함수가 반환될 때 까지 전부 디스어셈블하여 보여준다.

post-custom-banner

0개의 댓글