pwndbg 사용법

  • b: break
  • c: continue
  • r: run
  • si: step info
  • ni: next instruction
  • i: info
  • k: kill
  • pd: pdisas


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

image-20240403214336056


  • u, nearpc, pdisas는 pwndbg에서 제공하는 디스어셈블 명령어, 가독성 좋게 출력해줌
  • 그냥 nearpc main 명령어를 입력하니 오류 발생, github 찾아보니 nearpc &main 명령으로 해결 가능

image-20240403214940340


  • ni와 si의 차이점은 ni는 서브루틴으로 들어가지 않지만 si는 서브루틴으로 들어가는 차이점이 있음


  • printf 경우 문자열은 stdout의 버퍼에서 잠시 대기한 뒤 출력되기 때문에 gdb로 printf를 실행해도 출력되는 조건은 다음과 같다.
      1. 프로그램이 종료될 때
      2. 버퍼가 가득 찼을 때
      3. fflush와 같은 함수로 버퍼를 비우도록 명시했을 때
      4. 개행문자가 버퍼에 들어왔을 때


  • finish 명령어는 함수의 끝까지 한 번에 실행할 수 있음
  • si로 함수의 내부에서 분석했을 때, 함수의 규모가 너무 커서 돌아가기 어려울 때 사용할 수 있음


examine

  • 가상 메모리에 존재하는 임의 주소의 값을 관찰할 때, gdb에서는 x라는 명령어 사용 가능
  • x를 이용하면 특정 주소에서 원하는 길이만큼 데이터를 원하는 형식으로 인코딩하여 볼 수 있음
    • 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).
    • b(byte), h(halfword), w(word), g(giant, 8 bytes)


  • 아래는 8바이트씩 hex인 16진수 형식으로 10개를 보여주는 명령어

image-20240403232222374

  • rip부터 5줄의 어셈블리 명령어

image-20240403232449602

  • 특정 주소의 문자열 출력

image-20240403235016160


telescope

  • telescope는 pwndbg가 제공하는 강력한 메모리 덤프 기능
  • 특정 주소의 메모 값들을 보여주는 것에서 그치지 않고, 메모리가 참조하고 있는 주소를 재귀적으로 탐색하여 값을 보여줌
  • tele &main 명령도 가능

image-20240403235425939


vmmap

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

image-20240404000231823


gdb / python

  • gdb를 사용하여 디버깅을 할 때 키보드로 직접 타이핑하기 어려운 복잡한 값을 입력하고 싶을 때 사용할 수 있음
  • r(run) 명령어의 인자로 $()와 함께 파이썬 코드를 입력하면 됨
    • 예) pwndbg) r $(python3 -c "print('\xff' * 100)")

댓글남기기