실행파일의 어셈블리를 원하는 단계까지 실행시키며 메모리의 변화를 관찰
바이너리를 실행하지 않고 분석(disassemble, IDA분석 등)
바이너리를 실행하며 동적으로 변화를 관찰(debugging, emulating)
둘 다 해야한다. 두 분석론을 적절히 사용해야 한다.

install 방법은 링크 참조 https://github.com/hugsy/gef
- file {filename} : 디버깅 할 실행파일 선택
- disas {function name} (==disassemble) : 함수 디스어셈블
- start : 실행파일의 엔트리포인트부터 디버깅 시작
- r(run) : 처음부터 breakpoint까지 실행
- c(continue) : 현재부터 다음 breakpoint까지 실행
- s(step) : 한 줄 실행, 서브루틴을 호출할 경우 함수 내부로 진입
- n(next) : 한 줄 실행, 서브루틴을 호출할 경우 내부로 진입하지 않고 실행
- finish : 현재 함수를 마지막까지 실행
- return : 현재 상황에서 강제 return
- jump * {addres} : 해당 주소로 강제 분기
- set{type}[address] = {value} : 특정 주소의 값을 변경(레지스터도 가능)
- b : 현재 위치에 브레이크포인트 설정
- b {function name} : 함수 시작부분에 bp 설정
- b {address} : 특정 주소에 bp설정
- d {bp num} (delete) : num번째 bp 삭제
- info locals : 현재 실행중인 함수의 지역변수 출력
- info variables : 전역변수 모두 출력
- info registers : 레지스터 값 모두 출력
- info proc map : 메모리 매핑값 출력
- p(print) {변수명/$레지스터/*주소} : 값 출력
- display $변수명 : 실행할 때 마다 변수 값 출력