gdb调试

gcc编译

方法1:

gcc -m32 -g -o test test.c
  • -m32:32位编译
  • -g:增加调试信息
    在这里插入图片描述
    方法二:
gcc test.c -o test
  • 默认为64位编译
    在这里插入图片描述
    关闭保护机制
gcc -no-pie -fno-stack-protector -z execstack -m32 -o exp1 exp1.c

一般CTF都使用32位,下面我们使用32位来调试

格式

在这里插入图片描述
在这里插入图片描述
registers是寄存器,code是代码,stack是栈

命令

1、增加断点

break 函数名

break 行号

break 文件名:函数名

break 文件名:行号

break +偏移量

break -偏移量

break *地址

break可简写成b,break 函数名break *地址最常用

在这里插入图片描述
2、运行

r是重新运行

n是单步执行,next遇到函数不会进入函数内部

s是步入,step会执行到函数内部

c是继续运行,调试时,使用continue命令继续执行程序。程序遇到断点后再次暂停执行;如果没有断点,就会一直执行到结束。

在这里插入图片描述
3、删除断点

delete <断点id>:删除指定断点

delete:删除所有断点

clear

clear 函数名

clear 行号

clear 文件名:行号

clear 文件名:函数名

在这里插入图片描述
4、查看断点:

info br

简写:i b

5、查看更多的栈内容

stack 数目

在这里插入图片描述

6、 finish

finish 执行完当前函数返回到调用它的函数。
在这里插入图片描述

7、查看反汇编
disass addr 查看addr处前后的反汇编代码
 
disass functions 参看fucntion函数的反汇编代码

在这里插入图片描述

8、查看内容

p系列

p system/main 显示某个函数地址
 
p $esp 显示寄存器
 
p/x p/a p/b p/s。。。
 
p 0xff - 0xea 计算器
 
print &VarName 查看变量地址

在这里插入图片描述
x系列

命令格式:x/<n/f/u> <addr>
 
n是一个正整数,表示需要显示的内存单元的个数
 
f 表示显示的格式(可取如下值: x 按十六进制格式显示变量。d 按十进制格式显示变量。u 按十进制格式显示无符号整型。o 按八进制格式显示变量。t 按二进制格式显示变量。a 按十六进制格式显示变量。i 指令地址格式c 按字符格式显示变量。f 按浮点数格式显示变量。)
 
u 表示从当前地址往后请求的字节数 默认4byte,u参数可以用下面的字符来代替,b表示单字节,h表示双字节,w表示四字 节,g表示八字节
 
<addr>表示一个内存地址
 
x/xw addr 显示某个地址处开始的16进制内容,如果有符号表会加载符号表
 
x/x $esp 查看esp寄存器中的值
 
x/s addr 查看addr处的字符串
 
x/b addr 查看addr处的字符
 
x/i addr 查看addr处的反汇编结果

在这里插入图片描述
info系列:

info register $ebp 查看寄存器ebp中的内容 (简写为 i r ebp)
 
i r eflags 查看状态寄存器
 
i r ss 查看段寄存器
 
i b 查看断点信息
 
i functions 查看所有的函数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值