프로그램을 개발할 때는 일반적으로 코드의 논리 구조를 신중하게 설계하고, 코드를 작성해 나간다. 그런데 개발 초기에 아무리 신중하게 설계해도, 코드의 규모가 커지다 보면 실수가 발생하기 마련인데, 이렇게 실수로 발생한 프로그램의 결함을 **버그(Bug)**라고 한다.
**버그(Bug)**는 컴퓨터 과학에서 공식적인 학명은 아니지만, 널리 쓰이는 전문 용어이다. 버그라는 용어는 1947년 하버드 대학의 Mark. II 컴퓨터의 회로에 나방이 들어가 합선을 일으킨 것에서 유래되어 현재는 프로그램에서 의도치 않게 발생한 문제를 표현하는 말로 사용되고 있다.
개발자들은 농담처럼 개발에 투자한 시간만큼 버그를 잡는 데 사용한다고 말한다. 그 정도로 작성된 코드에서 버그를 없애는 것은 어렵다. 그래서 이런 어려움을 해소하고자 **디버거(Debugger)**가 개발되었다.
디버거는 문자 그대로 버그를 없애기 위해 사용하는 도구이다. 프로그램을 어셈블리 코드 단위로 실행하면서, 실행 결과와 프로그램의 내부 상황을 사용자에게 보여준다. 자신이 추상적으로 생각한 아이디어의 결과를 직관적으로 보여주기 때문에, 개발자는 디버거를 사용하여 자신이 작성한 코드의 문제점을 더욱 명확하게 찾을 수 있게 되었다.
그러나 이러한 디버거의 효용을 개발자만 얻는 것은 아니다. 해커, 리버스 엔지니어 등을 비롯하여 소프트웨어에서 버그를 찾고자 하는 모두가 이 도구를 사용하여 버그 탐색의 효율을 높일 수 있게 되었다. 버그 발견이 쉬워짐으로써, 개발자들은 버그를 고치기가 쉬워졌고, 해커들은 취약점을 발견하기 쉬워졌다.
**GDB (GNU debugger)**는 리눅스의 대표적인 디버거이다.
오픈 소스로 개발되어 무료로 설치할 수 있으며, 역사가 오래된만큼 다양한 플러그인들이 개발되어 있다.
Ubuntu 환경에서는 기본적으로 설치되어 있지만, GDB가 설치되지 않았다면 sudo apt-get install gdb 명령어를 통해 설치할 수 있다.
GDB는 오픈소스이고, 역사가 오래되어 사용할 수 있는 플러그인도 많다. GDB의 플러그인 중에서 바이너리 분석 용도로 널리 사용되는 플러그인들은 다음과 같다.
예를 들어, pwndbg를 설치하려면 다음의 명령어를 수행하여 설치할 수 있다.
git clone <https://github.com/pwndbg/pwndbg>
cd pwndbg
./setup.sh