闭关学pwn番外(一)——入门gdb

前言

gdb神器是linux下的一款调试工具,做pwn的时候经常需要动态调试查看堆栈信息,所以特意新开番外一篇来记录gdb的学习
这里放一些步骤
闭关学pwn番外(一)——入门gdb_第1张图片

同时,学pwn时学一些调试过程中会用到的汇编也是重要的
闭关学pwn番外(一)——入门gdb_第2张图片


gdb下载安装

kali下输入apt-get install gdb
这里科普一个gdb插件(神器)——peda!!!
peda的一个实用命令checksec检测安全保护
peda的另一个实用命令searchmem用搜索内存
同时会在调试过程中着色并显示反汇编代码,寄存器和内存信息
简而言之,就是pwn的神器
peda下载看这里


载入

先简单写一个c用于之后的编译
这里在桌面新建一个test.c,然后敲简单代码
闭关学pwn番外(一)——入门gdb_第3张图片
之后打开终端
cat看一下
闭关学pwn番外(一)——入门gdb_第4张图片

然后gcc编译一下

闭关学pwn番外(一)——入门gdb_第5张图片

可以看到桌面默认产生了一个a.out

建议输入gcc -g test.c

-g 可以保留代码文字信息,便于调试的时候查看

如果不想要a.out,那就输入

gcc -g -o 1.out test.c

test.c 前面的-o 1.out表示编译后输出的文件名称

然后用载入到gdb,有两种方式

第一种:输入 gdb 1.out
闭关学pwn番外(一)——入门gdb_第6张图片

第二种: 先输入gdb,再输入file 1.out
闭关学pwn番外(一)——入门gdb_第7张图片

现在就跟shell一样,是可以输入命令的环境
我们可试试输入run启动程序(简写 r 也可以,gdb所有指令支持缩写)
所以接下来全简写

闭关学pwn番外(一)——入门gdb_第8张图片

如果想要退出输入q
在这里插入图片描述

可以看到它很听话的退出了


设置断点

break指令设置断点,简写 b
设置断点有几种方法
第一种:
b 函数名
比如 b main
在这里插入图片描述

这里可以看到成功在main函数开始位置设置了断点

闭关学pwn番外(一)——入门gdb_第9张图片

然后,r一下
闭关学pwn番外(一)——入门gdb_第10张图片

可以看到有一堆东西,这是peda插件带来的快乐
同时看最后一行
在这里插入图片描述

说明断点设置成功了,当前停在了这里

如果想让程序继续运行,输入c(continue)

第二种:b 文件名:行号
比如 b 1.out:10
在这里插入图片描述

像这样效果是一样的

如果想要单步调试

输入n(next)可以单步调试程序

闭关学pwn番外(一)——入门gdb_第11张图片

这样就跳到下一步了

这时候有个骚操作!什么指令都不输入直接回车,默认重复执行上一条指令

所以就可以按回车一直往下调试


进入函数

如果按照上述的步骤一步步n下来,你就会发现它遇到fun()函数的时候不会显示进去的过程,而是继续运行main的下一步

所以!敲黑板!!!

如果想要进入某个函数,用step命令

简写s

在这里插入图片描述

如图,这样就能进入函数了,然后继续nnn就可以逐步看函数里是如何调试的啦


查看源码

输入 list 简写 l 即可查看10行,如果想继续查看按回车即可
就像这样
闭关学pwn番外(一)——入门gdb_第12张图片


查看变量的值

查看变量的值可以说是调试的灵魂啦!
print+变量名 或者 p +函数名
简写p
演示如下:
在这里插入图片描述

注:p+函数名的话就是返回地址啦

这里输出是16进制输出,所以10是0xa没错的!

如果p+数组名也可

在这里插入图片描述

很棒吧!!

同时!打印数组也支持索引

在这里插入图片描述


一些很少用但又很有用的指令

info b
查看断点信息(也就是你b过的)
在这里插入图片描述

同时也支持缩写,所以 i b 也可

在这里插入图片描述

如果想看寄存器的信息

i reg

闭关学pwn番外(一)——入门gdb_第13张图片

就是这么清爽

同样可以 i r (这里不演示了)

删除全部断点 delete

删除指定断点 delete 序号
比如 delete 1
支持缩写,所以 d 和 d 1也可以的!!


一些做pwn调试的知识

参考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 文件名

闭关学pwn番外(一)——入门gdb_第14张图片
然后呢,一般pwn题想要进入函数s是不行的,需要si

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是没用的。

大致就这样,全干货 !!

在这里插入图片描述

今天还早,听会歌继续肝~

你可能感兴趣的:(linux,kali,gdb,linux)