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

前言

gdb神器是linux下的一款调试工具,做pwn的时候经常需要动态调试查看堆栈信息,所以特意新开番外一篇来记录gdb的学习
这里放一些步骤
在这里插入图片描述

同时,学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,有两种方式

第一种:输入 gdb 1.out
在这里插入图片描述

第二种: 先输入gdb,再输入file 1.out
在这里插入图片描述

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

在这里插入图片描述

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

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


设置断点

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

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

在这里插入图片描述

然后,r一下
在这里插入图片描述

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

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

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

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

像这样效果是一样的

如果想要单步调试

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

在这里插入图片描述

这样就跳到下一步了

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

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


进入函数

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

所以!敲黑板!!!

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

简写s

在这里插入图片描述

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


查看源码

输入 list 简写 l 即可查看10行,如果想继续查看按回车即可
就像这样
在这里插入图片描述


查看变量的值

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

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

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

如果p+数组名也可

在这里插入图片描述

很棒吧!!

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

在这里插入图片描述


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

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

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

在这里插入图片描述

如果想看寄存器的信息

i reg

在这里插入图片描述

就是这么清爽

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

删除全部断点 delete

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


一些做pwn调试的知识

参考blog先放这里
https://blog.youkuaiyun.com/chen1415886044/article/details/105094688
https://blog.youkuaiyun.com/niyaozuozuihao/article/details/91802994
https://blog.youkuaiyun.com/yifeng_1118/article/details/12125193

要调试C/C++的程序,首先在编译时,要使用gdb调试程序,在使用gcc编译源代码时必须加上“-g”参数。保留调试信息,否则不能使用GDB进行调试。

有一种情况,有一个编译好的二进制文件,你不确定是不是带有-g参数,带有GDB调试,这个时候你可以这样验证:

gdb 文件名

在这里插入图片描述
然后呢,一般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是没用的。

大致就这样,全干货 !!

在这里插入图片描述

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

### PWN 入门习路径 #### 、基础知识准备 对于希望进入PWN领域的人来说,掌握些前置技能是非常重要的。这些技能不仅有助于理解漏洞原理,还能帮助更好地利用工具和技术来发现并修复潜在的安全问题[^1]。 - **编程语言**:熟悉C/C++是必不可少的,因为大多数二进制程序都是用这两种语言编写的。此外,Python也十分有用,尤其是在编写自动化脚本方面。 - **操作系统概念**:深入理解Linux内核的工作方式及其源码结构至关重要。这包括进程管理、内存分配以及文件系统的运作机制等知识点。开源特性使得可以直接查阅Linux内核代码,这对于安全研究人员来说是项非常有价值的资源[^3]。 - **汇编语言**:了解x86/x64架构下的汇编指令集能够极大地提升逆向工程的能力。通过阅读反汇编后的机器码,可以更清晰地看到程序的实际行为模式。 #### 二、常见漏洞与防护技术 为了有效地进行攻击面分析和防御措施设计,需要对常见的软件缺陷有深刻的认识: - **栈溢出**:当函数调用过程中传递给局部变量的数据量超过了其预定大小时就会发生这种情况。这种类型的错误可能导致任意代码执行的风险。现代编译器引入了多种缓解策略如Canary、NX位(No-eXecute)、PIE (Position Independent Executable),还有地址空间布局随机化(Address Space Layout Randomization, ASLR)等功能以增强安全性。 - **格式字符串漏洞**:如果应用程序允许外部输入控制printf系列函数中的格式说明符,则可能会泄露敏感信息甚至改写堆栈上的返回地址。因此,在开发阶段应严格验证所有来自用户的参数。 - **整数溢出/下溢**:不当处理数值运算可能引起意外的结果,进而触发其他形式的崩溃或逻辑失误。这类问题通常难以被察觉,所以编码期间要特别小心边界条件判断。 #### 三、实践操作指南 理论知识固然重要,但实际动手能力同样不可或缺。可以从以下几个方向入手积累经验: - 构建测试环境:安装必要的调试工具链,比如GDB(gdb-multiarch), pwntools库用于简化exploit开发流程;同时准备好虚拟机以便于隔离实验对象以免影响主机系统稳定性。 - 参加CTF竞赛:Capture The Flag比赛提供了丰富的挑战场景供爱好者们切磋技艺,从中不仅能到最新的攻防技巧,还可以结识志同道合的朋友共同进步成长。 ```bash # 安装pwntools Python包 pip install pwntools ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值