12558网页游戏私服论坛

 找回密码
 立即注册
游戏开服表 申请开服
游戏名称 游戏描述 开服状态 游戏福利 运营商 游戏链接
攻城掠地-仿官 全新玩法,觉醒武将,觉醒技能 每周新区 经典复古版本,长久稳定 进入游戏
巅峰新版攻 攻城掠地公益服 攻城掠地SF 新兵种、新武将(兵种) 进入游戏
攻城掠地公 散人玩家的天堂 新开 进入游戏
改版攻城掠 上线即可国战PK 稳定新区 全新改版,功能强大 进入游戏
少年江山 高福利高爆率 刚开一秒 江湖水落潜蛟龙 进入游戏
太古封魔录 开服送10亿钻石 福利多多 不用充钱也可升级 进入游戏
神魔之道 签到送元宝 稳定开新区 送豪华签到奖励 进入游戏
神奇三国 统帅三军,招揽名将 免费玩新区 激情国战,征战四方 进入游戏
龙符 三日豪礼领到爽 天天开新区 助你征战无双 进入游戏
王者之师 免费领豪华奖励 免费玩新区 6元送6888元宝 进入游戏
三国霸业 战车-珍宝-觉醒-攻城掠地SF-全新玩法 免费玩新区 攻城掠地私服 进入游戏
手游私服盒子 各类免费游戏 0.1折送海量资源 各类手游私服 进入游戏
皇家MU2 《奇迹 2:传奇》韩国网禅公司《奇迹》正统续作。 3D锁视角Mmrpg 暗黑3+传奇+流放之路+奇迹 进入游戏
查看: 355|回复: 0

从零开始的Linux堆利用(二)——Fastbin Dup

[复制链接]

315

主题

315

帖子

640

积分

实习版主

Rank: 7Rank: 7Rank: 7

积分
640
发表于 2022-1-28 15:26:51 | 显示全部楼层 |阅读模式
和前一篇一样,是Udemy上Linux Heap Exploitation课里面的内容;
内容都是自己的博客,有爱好可以看一看-> https://hack1s.fun/
FastBin

与malloc相对的是free函数
free函数可以释放malloc分配的chunk空间
这些free的chunk会连接在一起在free_list中
fastbins是可以快速访问的bins,里面存储着被free的chunk
用一个简朴的例子来看一下,起首malloc了三个空间,这时可以看到vis和fastbins的输出

执行这一步free,把a这部分空间free掉之后再看有什么厘革

执行完了一步,free(a)之后可以看到,vis中原本a那里被标识出来连接到了fastbins
别的在fastbins中0x20的位置填上了原本a的chunk地址
这里的信息是存储在堆中名为arena的空间的,直接用dq &main_arena 20查看

赤色标出来的地方是大小为0x20的fastbin地点的地址
每次free之后如果要被放在fastbin中就会在main_arena中进行修改,图中按照字节下去,接下来是0x30、0x40等等的fastbin

再将b和c都free掉
之后可以看到起首是vis看到的堆中的数据,原本b、c的空间中userdata的第一个字变成了前面的地址;
即c的user-data是chunk b的地址,b的user-data是chunk a的地址,而a的user-data为0,表示为链表末了;
在main_arena中记录的是chunk c的地址,即fastbins链表中的末了一项
fastbin的布局类似于栈,filo
之后我们再执行三次malloc,查看都分配在哪里

可以发现最先申请的d是拿到了原本c的空间;
末了申请的f是拿到了原本a的空间;先进后出,类似于栈
Fastbin_dup

漏洞程序本身

这个程序本身也是一个菜单形式

输入用户名,之后就是malloc、free、target,和之前的程序差不多;
起首分配一个空间随便输一些内容看一下

之后可以用free输入index来释放这个chunk
释放的index是从0开始往后增长的
最初输入的用户名和target是一个绑定的布局,可以用p来print或者用dq查看内存地区的内容

恣意地址写

起首还是实现低级目的,恣意地址写
这个程序本身的题目是double free,可以对一个chunk free两次
起首尝试一下直接free这个chunk两次

直接收到了Abort信号中断下来了,这时用frame 4查看_int_free函数的栈帧

可以看到在这个函数这里是一个提示,检测到了double free,之后中断了;
看到这里的注释,其实是因为要free的chunk和fastbin的链表中top chunk是雷同的导致的;
那么针对这个的绕过方式就是再第一次free之后再free一次其他的chunk
让fastbin的第一项和要free的chunk不是同一个地址就可以了

如许实现的一个效果就是fastbin链表中形成了一个环
0x603000->0x603030->0x603000接下来如果执行malloc的话就可以两次申请0x603000的空间
如果想要构成恣意地址写,可以第一次申请之后修改其中User-Data的第一个字处,改成一个想要写的地址;
如许之后再执行malloc就可以申请来恣意一个地址,并且可以写内容;

这里我们执行流程是
a=malloc(0x28);b=malloc(0x28);free(a);free(b);free(a);malloc(0x28,p64(0xdeadbeef));其中末了一次malloc分配的内容到了原本chunk a的位置,并且我们在user data这里填充了0xdeadbeef
如许接下来再申请三次,第三次malloc的内容就会写在0xdeadbeef这里
我们想要修改的是Target变量的值,这个值在elf.sym.user这里,以是我们先把shellcode改成下面如许
a=malloc(0x28);b=malloc(0x28);free(a);free(b);free(a);malloc(0x28,p64(elf.sym.user));malloc(0x28);malloc(0x28);malloc(0x28,"writesomethins");结果刚刚运行就直接收到SIGNAL中断了,查看一下出错的位置的栈帧,可以看到提示的是Memory corruption

注释写着是在查抄chunk的size字段和fastbin申请的是否相等
看一下我们正常申请chunk时的布局,有一个比较重要的地方被忽略了

这些地方都标识着0x31,表示这个chunk大小是0x30
而我们伪造的elf.sym.user那里是没有这个值的,因此需要把这个补一下;
正好这个地方是我们一开始输入username的地方,我们直接把username伪造成如许的布局就可以了
username = p64(0) + p64(0x31)
这时可以看到这个target就已经被改了
但是如许的恣意地址写有一些限制,需要先在要写的位置有一段可以控制的内容,在这里我们想要写的是target,但是起首需要能够控制这个user字段,否则伪造的chunk无法通过size的查抄。
恣意代码执行

可以尝试像之前一样修改__malloc_hook或是修改__free_hook
但是简朴的尝试修改这两个指针的值会导致没有办法通过chunk size的查抄
我们可以使用find_fake_fast这个指令查看想要修改的位置附近是否有可能存在可以伪造的chunk内存地址

这里查到__free_hook附近是没有,__malloc_hook前面一些有如许的一个可以改的地方
现实上把这附近的值都输出一下,可以发现

现实上find_fake_fast做的事情就是在__malloc_hook开始的地址向前找,看是否有哪一个地方可以看成标志位,可以用来伪造的;

固然这里0x7f不是在size现实上在的谁人位置,但是前面都是0,我们设法把0x7f这个位置放在size的地方再对齐,靠这个0x7f绕过free对size的查抄;
然后由于大小是0x70,原本是申请0x28是放在0x30的bins,需要都改成0x68,放在0x70的bins
别的从这个fake chunk的用户数据b3d到__malloc_hook的b50中心还需要填充一些数据
以是整个流程就是
a=malloc(0x68)b=malloc(0x68)free(a)free(b)free(a)malloc(0x68,p64(libc.sym['__malloc_hook']-(0x50-0x2d)))malloc(0x68)malloc(0x68)malloc(0x68,b'B'*(0x50-0x3d)+p64(libc.sym.system))如许执行完之后就已经被改成了system了

末了想要弹一个shell就只需要传/bin/bash给system的参数就可以了
但是这里又存在了一个题目
这个程序为了只申请fastbin,在这里malloc的大小受到了限制

最大120,着肯定没法直接传入一个地址
这里的解决方法是不使用system函数的地址,改用one_gadget

用one_gadget查找这个libc中可能调用的bin/sh
之后把这个地址和libc的起始地址相加之后写到原本system谁人地方
下面需要查抄一下这里面哪一个gadget的束缚条件是满意的
在GDB里面用b *__malloc_hook下断点,之后继续运行
在终端里面用选项1触发malloc,查看这时的寄存器状态

R12、R13都不是NULL,并且rsi、[rsi]也都不是NULL、[rax]、[[rax]]也不是
那只能确认一下[rsp+0x50]这里了

查抄一下栈发现这里是满意的,以是可以用这个gadget
最终我们的payload如下
a=malloc(0x68)b=malloc(0x68)free(a)free(b)free(a)malloc(0x68,p64(libc.sym['__malloc_hook']-(0x50-0x2d)))malloc(0x68)malloc(0x68)malloc(0x68,b'B'*(0x50-0x3d)+p64(libc.address+0xe1fa1))malloc(1,'')运行一下就乐成获得了shell权限

FastBin_dup只可以用于glibc_2.3.1及以下的版本
并且需要攻击者知道要修改的地址,以及能够找到绕过chunk size查抄的fake chunk


fastbin.zip
9.6 KB, 下载次数: 23, 下载积分: 吾爱币 -1 CB


来源:http://www.12558.net
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
楼主热帖
回复

使用道具 举报

*滑块验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|12558网页游戏私服论坛 |网站地图

GMT+8, 2024-11-24 11:11 , Processed in 0.078125 second(s), 32 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表