팁(트러블슈팅)

GDB 기초 명령어 (리눅스 ELF 동적 분석) 내가 보려고 만든 GDB 단축키

JUNFUTURE 2021. 8. 1. 23:03

gdb 실행시 화면

gdb 실행

gdb ./[프로그램이름]

함수의 디스어셈블리 결과 출력

disas [함수이름]
disassemble [함수이름]

프로그램 열기

r [프로그램이름]

프로그램 실행 (브레이크 포인트 / 중단점 까지)

c

브레이크 포인트 걸기

b *[해당주소]

브레이크 포인트 정보 출력

info breakpoints

해당 번호 브레이크 포인트 삭제

delete [브레이크 포인트 번호, 지정안하면 다 삭제 됨]

정보 출력 / 지정된 메모리 영역 출력 타입 및 갯수(바이트) 지정

p $레지스터이름
x/2wx $레지스터 이름 w->word(16진수)타입 2개 출력
x/s $레지스터 이름 s->string(문자열)타입

 

gdb ./분석하려는프로그램 : gdb시작

disassemble 함수이름 : 함수 어셈블리어 확인

b *주소 / b $레지스터 / b 함수이름 : break point

got : 함수 got 정보 출력

info func : 함수 정보 출력 (plt, got까지 전부 출력해줌)

info variables : 전역변수 정보(이름,주소) 출력

info variables [regax] : [regax] 에 해당하는 전역변수 정보(이름,주소) 출력 (검색)

info break : break point 정보출력

delete 브포넘버 : 해당 브레이크 포인트 삭제

vmmap / vmmap 주소 : 메모리 정보보기

heap : heap 영역에 할당/해제된 메모리(chunk)정보보기

awatch *주소 / awatch 변수 : 해당주소/변수에 값이 쓰여지거나 읽히면 브레이크 (하드웨어 브레이크)

 

출력형식

x/10 main : main 함수 시작부터 40바이트를 출력 => x/10x와 동일

x/10x main : main 함수 시작부터 40바이트를 16진수로 출력

x/10a main : 가장 가까운 심볼의 오프셋을 출력

x/10s main : 문자열로 출력

x/10i main : 어셈블리 형식으로 출력

 

1. 특정 함수의 어셈블리어 코드 보기

disassemble [함수이름]
disassemble main

2. 브레이크 포인트 걸기

브레이크 포인트란? 해당 코드의 주소에서 실행을 하지않고 멈출 수 있게 해주는 기능

이로써 레지스터의 값들과 메모리(스택, 힙) 영역에 있는 값들을 디버깅함

b * [주소]
b* 0x400c0

3. 프로그램 재시작하기(실행하기)

r

4. continue - break point 지점까지 실행하기

c

5. 메모리 값 보기

x/40x 0x400c0 (16진수로 보기)
x/40i 0x400c0 (instruction으로 보기)
x/40s 0x400c0 (문자열로 보기)

6. 메모리 영역 확인하기

vmmap

 

7. arg 넣어주면서 gdb 실행

gdb --args executablename arg1 arg2 arg3
 

 

https://mk28.tistory.com/134
https://jayy-h.tistory.com/11