gdb神器是linux下的一款调试工具,做pwn的时候经常需要动态调试查看堆栈信息,所以特意新开番外一篇来记录gdb的学习
这里放一些步骤
kali下输入apt-get install gdb
这里科普一个gdb插件(神器)——peda!!!
peda的一个实用命令checksec检测安全保护
peda的另一个实用命令searchmem用搜索内存
同时会在调试过程中着色并显示反汇编代码,寄存器和内存信息
简而言之,就是pwn的神器
peda下载看这里
先简单写一个c用于之后的编译
这里在桌面新建一个test.c,然后敲简单代码
之后打开终端
cat看一下
然后gcc编译一下
可以看到桌面默认产生了一个a.out
建议输入gcc -g test.c
-g 可以保留代码文字信息,便于调试的时候查看
如果不想要a.out,那就输入
gcc -g -o 1.out test.c
test.c 前面的-o 1.out表示编译后输出的文件名称
然后用载入到gdb,有两种方式
现在就跟shell一样,是可以输入命令的环境
我们可试试输入run启动程序(简写 r 也可以,gdb所有指令支持缩写)
所以接下来全简写
可以看到它很听话的退出了
break指令设置断点,简写 b
设置断点有几种方法
第一种:
b 函数名
比如 b main
这里可以看到成功在main函数开始位置设置了断点
可以看到有一堆东西,这是peda插件带来的快乐
同时看最后一行
说明断点设置成功了,当前停在了这里
如果想让程序继续运行,输入c(continue)
像这样效果是一样的
如果想要单步调试
输入n(next)可以单步调试程序
这样就跳到下一步了
这时候有个骚操作!什么指令都不输入直接回车,默认重复执行上一条指令
所以就可以按回车一直往下调试
如果按照上述的步骤一步步n下来,你就会发现它遇到fun()函数的时候不会显示进去的过程,而是继续运行main的下一步
所以!敲黑板!!!
如果想要进入某个函数,用step命令
简写s
如图,这样就能进入函数了,然后继续nnn就可以逐步看函数里是如何调试的啦
输入 list 简写 l 即可查看10行,如果想继续查看按回车即可
就像这样
查看变量的值可以说是调试的灵魂啦!
print+变量名 或者 p +函数名
简写p
演示如下:
注:p+函数名的话就是返回地址啦
这里输出是16进制输出,所以10是0xa没错的!
如果p+数组名也可
很棒吧!!
同时!打印数组也支持索引
同时也支持缩写,所以 i b 也可
如果想看寄存器的信息
i reg
就是这么清爽
同样可以 i r (这里不演示了)
删除全部断点 delete
删除指定断点 delete 序号
比如 delete 1
支持缩写,所以 d 和 d 1也可以的!!
参考blog先放这里
https://blog.csdn.net/chen1415886044/article/details/105094688
https://blog.csdn.net/niyaozuozuihao/article/details/91802994
https://blog.csdn.net/yifeng_1118/article/details/12125193
要调试C/C++的程序,首先在编译时,要使用gdb调试程序,在使用gcc编译源代码时必须加上“-g”参数。保留调试信息,否则不能使用GDB进行调试。
有一种情况,有一个编译好的二进制文件,你不确定是不是带有-g参数,带有GDB调试,这个时候你可以这样验证:
gdb 文件名
n/s都是C语言级的断点定位。 s会进入C函数内部,但是不会进入没有定位信息的函数(比如没有加-g编译的代码,因为其没有C代码的行数标记,没办法定位),n不会。
ni/si都是汇编级别的断点定位。si会进入汇编和C函数内部,ni不会。
归纳:当要进入没有调试信息的库函数调试的时候,用si是唯一的方法。
当进入有调试信息的函数,用si和s都可以,但是他们不同,si是定位到汇编级别的第一个语句,但是s是进入到C级别的第一个语句
譬如si就是在0x80483e8.用s就是0x80483f1;
所以,我们拿到的pwn题想要gdb要这几个步骤
gdb (文件名)然后观察是否出现(no debugging…)
然后设置断点b n n n下一步,如果想要看某些参数p + 变量名
如果想要进入某个函数,输入si ,s是没用的。
大致就这样,全干货 !!
今天还早,听会歌继续肝~