GDB调试
GDB即GUN Debugger,是linux上的标准调试器,常配合gef、peda等插件来使用。
为方便调试,可以给gdb安装两个常用插件:gef和peda
另外,推荐radware2和cutter调试工具。
编译程序
入门调试,本次调试一个简单的c程序,对程序运行过程中寄存器和栈的变化进行分析。c源码如下
1 | //test4.c |
编译程序
1 | gcc hellogdb.c -o hellogdb |
汇编文件编译
将汇编保存在一个名为max.s的文件中,并使用以下命令进行编译:
1 | $ as max.s -o max.o |
调试程序
1 | gdb ./filename |
使用gdb ./filename
命令打开待调试文件,也可以进入gdb后使用file filename
加载待调试文件。如果安装了GEF,将会显示gef>
提示符。
根据二进制文件、核心文件或进程ID启动GDB:
附加到一个进程:$ gdb -pid $(pidof <process>)
调试二进制代码:$ gdb ./file
1 | $ gdb -q /path/to/my/bin |
远程调试:
1 | remote:~ $ gdbserver 0.0.0.0:1234/path/to/file |
还有:
1 | local:~ $ gdb -q |
查看代码
1 | list 1,30 //查看前30行代码 |
注意,只有使用gcc -g
参数编译的程序,才能在调试时看源代码。
下断点
让程序在指定函数如main、fread等处停下,以便调试。
1 | gef> b main |
其中指令 b 即 breakpoint 的缩写,与使用 breakpoint 效果一样;main 是指程序的main函数。即在main函数处下断点。下断点的方式有多种,使用起来也非常灵活。
如果使用gcc -g
参数编译的程序,在使用list xxx
命令查看源码时,直接在某行代码处下断点。
其他断点操作命令
1 | info break |
查看程序信息
起始地址
1 | $ nm hellogdb | grep _start |
1 | (gdb) backtrace #查看函数调用的顺序 |
寄存器信息
info registers
或i r
命令检查寄存器的值 。
内存信息
examine 简写 x,以各种格式显示变量内容。
使用gdb> help x
命令来查看使用方式
语法 : x/<number><format><unit>
参数解释:
number:要显示的内存单元个数
format:选择显示内容的格式,支持如下格式:
1
2
3
4
5
6
7
8
9
10t(binary) 二进制
o(octal) 八进制
d(decimal) 十进制
x(hex) 十六进制
a(address) 内存地址
c(char) 字符形
f(float) 浮点数
s(string) 字符串
i(instruction) 指令形式
u(unsigned decimal) 无符号十进制unit:每个内存单元的大小,以字节计算
1
2
3
4b (byte) 1 bytes
h (half word) 2 bytes
w (word) 4 bytes
g (giant) 8 bytes
常用举例
1 | gef> x/10i $sp 当前栈 |
查看反汇编代码
disassemble
命令可以查看函数的反汇编输出。 如查看main函数:disassemble main
。
1 | gef➤ disassemble main |
x/i 反汇编 – 通常,我们会使用 x/10i $eip-20 来查看当前的汇编($eip是指令寄存器)
以16进制的形式打印当前程序中的变量tf里面的内容
(gdb) p /x *tf
执行程序
正常执行
1 | run |
Crash执行
1 | run $(python -c "A"*27+) |
单步调试
用于单步调试的命令:单步执行下一条命令。可以进入函数内部
1 | stepi |
执行下一行代码。不会进入函数内部
1 | nexti |
继续处理,直到达到指定的行号、函数名称、地址、文件名函数或文件名:行号
1 | until |
显示当前行号以及所在的函数:where
gef> nexti 5
溢出测试
1 | $ ./bufferoverflow $(python -c 'print " A" *17 + " \x1b\x84\x04\x08" ') |
文件型:
1 | python -c 'print " A" *17 + "\x1b\x84\x04\x08"' > input.txt |
命令速查
1 | #!bash |
Refenence
https://azeria-labs.com/debugging-with-gdb-introduction/
https://www.cnblogs.com/HacTF/p/7773750.html
https://bbs.pediy.com/thread-250772.htm
http://www.cppblog.com/baby-fly/archive/2010/07/27/121395.html
- Post title:GDB调试基础
- Post author:ssooking
- Create time:2019-12-16 00:00:00
- Post link:https://ssooking.github.io/2019/12/gdb调试基础/
- Copyright Notice:All articles in this blog are licensed under BY-NC-SA unless stating additionally.