본문 바로가기
Computer Science

Bomb Lab에 꼭 필요한 gdb 커맨드 모음

by invrtd.h 2023. 10. 8.

 굵은 글자는 다른 검색 결과에서 안 알려주는 개꿀팁(?)이다.

1. gdb 시작하기

  • gdb - gdb를 실행한다.
  • gdb bomb - gdb를 실행하고 gdb 위에 bomb을 올린다.

 한편 gdb를 여러 번 실행해서 실행할 때마다 같은 작업을 반복해야 한다면, 다음과 같이 자동화할 수 있다.

  • gdb bomb -x inst.txt - gdb bomb을 실행한 뒤 inst.txt에 담긴 명령을 그대로 수행한다.
  • gdb bomb --command inst.txt - 위와 동일

 inst.txt 파일은 상황에 따라 원하는 대로 짜면 된다. 내가 Bomb Lab을 할 때는 이렇게 짰었다.

 

 

 2. 프로그램 실행, 중단

  • run - gdb에 올려져 있는 프로그램을 실행한다.
  • r - run의 약어
  • run 1 2 3 - gdb에 올려져 있는 프로그램을 실행한다. 그 프로그램에 1 2 3을 인자로 준다.
    • 터미널로 프로그램을 실행하는 데 익숙하지 않은 초보 컴공생은 그동안 항상 프로그램을 시작할 때 더블클릭만 해 왔기에 프로그램에 인자를 준다는 개념이 익숙하지 않을 가능성이 크다. 하지만 함수에 인자를 줄 수 있는 것처럼 프로그램에도 인자를 줄 수 있다.
  • run < input.txt - gdb에 올려져 있는 프로그램을 실행한다. 이때 stdin이 input.txt에 적힌 값을 읽는다.
    • Bomb Lab 할 때 핵심적인 기능으로, 암호를 외워 뒀다 번거롭게 여러 번 칠 필요가 없다! input.txt에 암호를 적어 두고 여기로 stdin을 리디렉션하면 해당 페이즈를 매우 빠르게 넘어갈 수 있다. 그러나 리디렉션 이후에는 콘솔이 stdin이 아니기 때문에, 프로그램은 input.txt에 있는 모든 값을 다 읽고 난 다음에는 더 이상 읽을 값이 없어서 꺼져버리고 만다. 방해가 되지는 않지만 당황스러울 수 있어서 소개한다.
    • Bomb Lab을 할 때 input.txt 마지막 부분에는 꼭 하나의 빈 줄을 넣자. 아마 bomb이 한 줄씩 입력을 읽을 때 \n을 기준으로 읽는 것 같은데, input.txt 마지막 부분 다음에 빈 줄이 없으면 마지막 부분 다음이 EOF가 돼서 이걸 읽은 순간 프로그램이 꺼진다.
  • kill - 현재 프로세스를 죽인다.
  • quit - gdb를 나간다.
  • q - quit의 약어

3. 중단점

  • break sum - 함수 sum에 중단점 설정
  • b sum - break sum의 약어
  • break *0xffffff - 주소 0xffffff에 중단점 설정
  • break *<func> + <integer> - 함수 function + integer 주소에 중단점 설정
  • delete 1 - 1번 중단점 삭제
  • delete - 모든 중단점 삭제
  • disable 1 - 1번 중단점 비활성화
  • enable 1 - 1번 중단점 활성화

4. 실행

  • stepi - 1개의 인스트럭션 실행
  • si - stepi의 약어
  • stepi 4 - 4개의 인스트럭션 실행 (물론 si 4 이렇게 쓰는 것도 가능하다.)
  • nexti 4 - 4개의 인스트럭션 실행 (함수호출을 하나의 인스트럭션으로 간주)
  • ni - nexti의 약어
  • continue - 다음 중단점까지 계속 실행
  • c - continue의 약어

5. 분석

  • disas - 현재 함수의 어셈블리 코드 보기
  • disas sum - 함수 sum의 어셈블리 코드 보기

 

  • x/[NUM][SIZE][FORMAT] addr - addr 위치에 있는 값 보기 (addr은 레지스터 또는 숫자)
    • 설명:
      • NUM: 보고 싶은 오브젝트의 개수
        • 생략: 1로 간주
      • SIZE: 보고 싶은 오브젝트의 사이즈
        • b: byte
        • w: word (4byte)
        • g: giant (8byte)
        • 생략: 이전에 사용한 SIZE를 그대로 사용
      • FORMAT: 포맷
        • d x o: 각각 10, 16, 8진수
        • s: 문자열 (널 문자 직전까지 모든 내용 출력)
    • 예제:
      • x/d $rax - rax 레지스터에 있는 값을 주소값으로 보고, 그 주소에 담긴 10진수 값 출력
      • x/32wd 0xffffff - 주소 0xffffff을 어떤 int[32] 형식의 어레이의 시작점 주소로 보고, 그 어레이의 모든 내용을 10진수로 출력

댓글