아래 내용은 학교 과제로 Reverse Engineering을 하기 위해서, gdb를 공부한 내용을 정리하였다.
먼저 gdb를 Ubuntu에 설치한다.
$ sudo apt update
$ sudo apt upgrade
$ sudo apt install gdb
그리고 어셈블리어를 편하게 보기 위해서, gdb plugin인 gef를 설치해주었다. 아래 링크를 참고해서 설치하면 된다.
https://github.com/hugsy/gef
Ubuntu에서 실행파일을 gdb로 실행한다.
$ gdb ./실행파일
본인은 AT&T 문법이 더 편해서 따로 설정했다.
$ set disassembly-flavor att
main 함수 확인
$ disas main
프로그램 시작
$ start
내가 실행하는 파일은 _start부터 실행되었다.
따라서 main 함수부터 확인하기 위해서, main 함수 맨 위에 breakpoint를 설정하고, breakpoint까지 이동했다.
$ b main
$ r
gdb 종료
$ quit
$ start
$ r
OR
$ run
breakpoint가 있다면 그 위치에서 멈춘다.
$ si
OR
$ step
이때, 함수를 호출한다면 함수 내부로 들어간다.
$ ni
반대로, ni는 함수를 호출하더라도 함수 내부로 들어가지 않는다.
$ si 5
이렇게 5줄을 실행할 수도 있다.
$ fin
OR
$ finish
$ b *0x12a3
OR
$ b *main+0
$ i b
$ del 1
위에서 1은 6번에서 확인한 breakpoint Num이다.
$ continue 1
lea 0xb51(%rip), %rsi
mov %rbx, %rdi
call ... <strcspn@plt>
로 첫 번째 인자로 %rbx 값을, 두 번째 인자로 0xb51(%rip)를 준 상황일 때, 0xb51(%rip)의 값을 확인하는 방법은 다음과 같다.
$ x/s $rip + 0xb51