gdb的使用
前言
简介
GDB 堪称陆地最强调试器
- gdb是GNU开源组织发布的一个强大的Linux下的程序调试工具
- gdb除支持c/c++语言外还支持go、D、object-c、fortran等语言
- GDB主要帮助你完成下面四个方面的功能:
- 启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。
- 可让被调试的程序在你所指定的调置的断点处停住。(断点可以是条件表达式)
- 当程序被停住时,可以检查此时你的程序中所发生的事。
- 你可以改变你的程序,将一个BUG产生的影响修正从而测试其他BUG
命令
步过 | 步入 | 步出 |
---|---|---|
一行行往下走,无论是否有函数,直接进入下一行代码 | 无函数,直接进行下一行代码,相当于步过 有函数则进入函数第一行代码 |
直接将现在所在的函数执行完,并跳出该函数 |
rip是64位
eip是32位
编译指令
gcc 文件.c -o 文件_x64 (将源文件编译成x64位系统)
gcc hello.c -o hello_x64
gcc -m32 文件.c -o 文件_x86 (将源文件编译成x86系统下的32位文件)
gcc -m32 hello.c -o hello_x86
gcc -m32 文件.c -fomit-frame-pointer -o 文件_x86_esp
gcc -m32 hello.c -fomit-frame-pointer -o hello_x86_esp
gcc 文件.c -fomit-frame-pointer -o 文件_x64_esp
gcc hello.c -fomit-frame-pointer -o hello_x64_esp
gcc -s 文件.c
gcc -s hello.c
gcc 文件.c -no-pie -o 文件_x64_nopie (去掉pie)
gcc hello.c -no-pie -o hello_x64_nopie
gcc 文件.c -static -o 文件_x64_static (静态链接编译)
gcc hello.c -static -o hello_x64_static
gdb ./文件_x64(x86) (gdb开始调试)
gdb ./hello_x64
objdump -d 文件 -M intel |less
(相当于ida,在shell里进行反编译)
基础调试指令
start
程序运行到入口点,gdb定义的入口点
r
如果此前没有断点,则运行完程序,如果有断点,则暂停到第一个可用断点处
i
查看信息
- i r
查看寄存器
i b
查看断点
c
执行到遇到断点为止或者程序结束b
设置断点b加<函数名称>(b main)
b加<行号>(b numble)
b加*<代码地址>(b *0x18)
finish(步出)
结束函数,从函数里直接出来
d 数字
删除断点set
改变变量值
- set *0x地址=数值(给地址赋值)
set *0x8888=62
- set $寄存器=数值(给寄存器赋值)
set $rip=62
- set *((unsigned int)$ebp..)=0x18
- set *0x地址=数值(给地址赋值)
vmmap
程序中关键地址段
list
显示源文件
file
看具体细节
(文件格式,大小端序,位数,,,)
ldd
对细节的描述更清楚
p
p &函数
(p &main
)打印出函数的地址
p/x &数组
(p/x &heaparray
)打印数组地址
search
search '字符'
{搜索某个字符所在的地址}
cyclic 数字
cyclic 100
自动生成100个字符
cyclic -l
一串ASCII可以计算出这串ASCII所在偏移量
反编译指令
disassemble
查看当前函数的反汇编disassemble 函数名字
查看这个函数的反汇编disassemble 地址
地址附近函数的反汇编disassemble 地址1,地址2
查看地址1到地址2范围内的反汇编disassemble $rip
反编译rip现在所直到的函数位置
x/数字i $rip
从rip开始反汇编(数字)行
x/20i $rip
(从rip开始反汇编20行)
x/20 i 0x12345678
(从0x12345678开始反汇编20行)
i | d * | x | s * | b | w * | g * |
---|---|---|---|---|---|---|
汇编 | 10进制 | 16进制 | 字符 | 一个字节 | 8个字节 | 4个字节 |
s | si | n | ni |
---|---|---|---|
步入 | 步过 | ||
单步进入 执行一行源程序代码,有函数调用,则进入函数 |
单步跟踪 执行一行源程序代码,有函数调用则直接将函数执行完,不进入函数 |
||
针对源代码 | 针对汇编指令,与s等同 | 针对源代码 | 针对汇编指令,与n等同 |
disable b 数字 | enable b 数字 |
---|---|
让断点失效 | 让断点生效 |
调试过程
编译
gcc 文件.c -o 文件_x64 (将源文件编译成x64位系统)
gcc hello.c -o hello_x64
gcc -m32 文件.c -o 文件_x86 (将源文件编译成x86系统下的32位文件)
gcc -m32 hello.c -o hello_x86
gcc -m64 文件.c -o 文件_x86(将源文件编译成x86系统下的64位文件)
gcc -m64 hello.c -0 hello_x86
运行
./文件_x86(x64)
./hello_x86
看具体细节
查看文件的少部分内容
file 文件_x86(x64)
file hello_x86
查看ELF文件
readelf -a 文件_x86(x64)
readelf -a hello_x86
查看更详细的内容 ***very important
ldd 文件_x86(x64)
ldd hello_x86
开始gdb调试
gdb 文件_x86(x64)
gdb hello_x86
- 先r一下,检查是否有错误
- 再start一下,看一下入口以来设置断点
start之后必须要设置断点,不然任何命令都不起作用
b设置断点
i b检查断点
然后就可以开始正式调试了!!!