PWN的一次学习笔记

由 ssnhy13 发布

PWN的一次学习笔记

编写人:Hanser

首先将文件放入ida中可以发现在vulnerable函数中存在gets危险函数(gets可以写入无限字节的数据)完全可以超过八个字节,超出的部分就可以向上溢出,如下

此时我们可以开始进行动态调试。放入gdb中

现在将断点切到main函数,运行main函数,也可以使用b*地址来访问任何断断点

此时run运行程序

输入n使得程序一步一步运行,此时对进程进行观察

如上图一直运行到关键函数vulnerable,输入s进入此函数,进入之后使用n运行此函数,因为已知有gets函数说明为栈溢出漏洞,所以输入八个A查看栈的情况

stack 查看多少项stack(这题查看24项stack)

ebp指向的是前一个函数的ebp的值(保存在栈里ebp的值)ebp再往高(也就是往下)一格就是返回地址,这道题的目标就是攻击这个返回地址,由图得我们能控制的位置就是esp和ebp之间的位置。ebp就是栈顶,esp就是栈底。

此时我们要攻击的就是高一格的返回地址

我们只要把这些位置覆盖成我们想要的地址就可以达到攻击效果

Main+93就是valueable函数一会运行完要返回到的main函数的地址

我们要一直写数据据,将这个地址覆盖(quit可以推出pwndbg)

打开ida我们可以看到一个后门函数getshell (执行一个系统命令)要格外注意这个函数,用system传一个参数相当于用户自己打开/bin/sh,就相当于得到了一个shell,就可以控制目标计算机了
所以我们要篡改valueable函数return的地址,让他不返回main函数,而是直接跳到getshell函数,然后我们就可以得到了一个shell,思路有了,现在我们可以在python中攻击他了

首先到导入pwntools中所有的模块,然后建立与本地程序的连接
Io = process(”本地程序地址”)

然后我们把这行内容给他接了io.recvline()
此时开始构造payload


(如上图,这段区域是16个字节)

(这段区域为ebp所占的4个字节)

(选中区域的最后一行为要覆盖到的最后4个关键字节)
如果此时这个0x08与ebp的距离是16字节,所以我们需要把这段距离给他填充掉,但由于ebp含有4个字节,所以我们要填充16+4个垃圾信息
所以构造payload = b'A' * 16 + b'BBBB + p32(0x8048522)
(需要覆盖到地址+要执行命令的地址)

打开ida双击getshell函数


可以发现getshell函数的起始地址为0x8048522,但是它不能直接写入payload,因为要变成字节型数据,0x8048522为整数,两者不能直接运算,所以我们要把他打包成字节型数据,即p32(0x8048522)#将一个整数打包为32比特的字节数据
所以最终payload为payload = b'A' * 16 + b'BBBB + p32(0x8048522)
最后io.sentline(payload)将payload发送过去
然后io.interactive()进行交互模式
然后ls查看目录,可以看到我们已经获得了shell


此时获取了最高权限,可以使用pwd获取任何东西,但这都是获取的本机权限(也就是本机模拟服务器进行攻击),调试好之后就可以攻击远程服务器了

将process改成remote就可以攻击远程服务器了
如上图将io = process("文件地址")
改为io = remote("远程服务器ip地址")

上图为复现过程(构造payload攻击远程服务器)


0条评论

发表评论


验证码