12558网页游戏私服论坛

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

从零开始的Linux堆利用(四)

[复制链接]

305

主题

305

帖子

620

积分

实习版主

Rank: 7Rank: 7Rank: 7

积分
620
发表于 2021-5-8 00:25:06 | 显示全部楼层 |阅读模式
写到第四篇了,也不知道有没有人看,再贴一下本身博客的链接https://hack1s.fun/

这次是先容到堆中Unlink时可能出现的问题

这种Unlink的本领是比较久远的年代提出的,当时还没有NX、ASLR如许的安全机制,我们这次也用到旧版本的glibc


Unsorted Bin

与Top Chunk相邻的chunk,在Free之后假如不属于fastbin,就会直接归并到Top Chunk中

fastbin最大是可以放0x80,这边申请两个大小为0x90的chunk,之后free与top chunk相邻的那个

可以看到这是直接将空间收回了;
下面我们再执行两个malloc,重新申请b的空间,以及再申请一个新的0x20大小的空间;
这时堆中的内容是下面如许

这时假如将a的空间释放,a就被链接到了unsorted bins上面

这里发生变化的主要有三个地方;

  • 被释放的块a的用户空间中的两个字,酿成了两个指针(绿色框)
  • 与a靠近的块b,指示位previous_inuse,值从本来的91酿成了90(蓝色框)
  • 与a靠近的块b,本来空着的一个字酿成了previous_size,也是90(红色框)
unsortedbin 是一个双向链表的结构,因此a中这两个指针分别是backward和forward;
目前只有a一项,以是是同一个值,这个值就是main_arena中的top这个字段;

我们继承执行,把b也free了,这时并不会再unsortedbin中加两项,而是会把ab两个块归并在一起

可以看到直接是修改了块a的大小,酿成了120,末了一个chunk的prev_size也是酿成了120
free掉一个fastbin是对周边的chunk没有影响的,但是free通例的chunk,是对周围的值有影响的;
Unsafe Unlink

前面一部分先容了unsortedbin,我们可以注意到它是通过一个链表实现的;

链表大概就是如许的一个结构;
fd、bk分别是双链表的指针,指向前后的块;
假如想要拆下来此中的一个块,只需要把它前一个块的fd改成它自身的fd,把它后一个块的bk改成它自身的bk就可以;

在低版本的GLIBC中没有对这个过程进行检查,而且是通过宏来实现的;
而且由于fd、bk这两个指针本身的位置是一个正常块的user data部分,以是这里是存在伪造的可能的;
示例程序

下面就用一个例子来看一下;

程序和之前一样是一个菜单形式
1是malloc申请空间,2是可以输入对应空间要添补的内容,3可以free掉申请的chunk
这个程序的malloc申请的chunk限定了大小在120~1000字节之间;
0x78是120比特,也就是说正好是fastbin放不下的chunk
另外还有一点就是,这个漏洞unsafe_unlink提出的时候还没有NX,这个程序为了讲最基本的原理也关闭了NX

恣意地点写

起首是程序的漏洞所在,就是没有进行输出内容长度的判定,申请a、b后输入许多内容回溢出到下一个chunk
这个类似于之前的House_of_force,但是这个程序限定了malloc的次数,以是没办法像House_of_force一样使用;

那么我们照旧先设法获取一个恣意地点写的本领;
我们这次一共只能申请两次chunk
在前面的demo程序中也了解到了,远离top chunk的块a被free之后会加入到unsortedbin
而且会出现这几个修改

  • 还在使用中的块b,size filed中prev_inuse位置零;
  • 被释放的块a,user data末了一个字酿成块a的大小,即prev_size字段;
  • 被释放的块a,user data的前两个字节酿成两个指针,分别是fd和bk;
这时free(b)会把两个块归并,实际上执行的操纵是

  • 查看b的prev_inuse,发现位0,前一个块已经被释放;
  • 查看b的prev_size,找到块a的起始地点;
  • 把a从unsortedbin list上卸载下来,即按照fd、bk去修改前后块的地点
那么我们一步一步来,起首申请a、b两个chunk
编辑chunk_a的数据,把b的prev_inuse位清0
a = malloc(0x88)b = malloc(0x88)edit(a,b'a'*0x88+p64(0x90))可以看到这时a的末了一个字已经属于b了

下面把prev_size这个字段也伪造了,只需要修改刚才的edit那句
edit(a,b'a'*0x80+p64(0x90)*2)
接下来我们需要填入两个指针,修改chunk_a的fd和bk两个字段;
在unlink的时候实际上是
this.fd->bk = this.bk;this.bk->fd = this.fd;如许两个写入操纵,假如我们想要用第一个语句来写
那么fd+0x18是终极写入的地点,bk是写入的内容;
我们先试着直接使用这个写入堆中的数据
由于测试的时候都关闭了ASLR,直接是用的固定的地点
我们输入的payload直接就拿这个固定的地点了
edit(chunk_A, p64(0x555555757090)+p64(0x5555557570b0)+b"a"*0x70+2*p64(0x90))free(chunk_B)
执行完毕之后,用vis可以看到A、B一起都被free掉了
而且可以看到我们输入的两个值都写到内存里了,fd+0x18写入了70b0,bk+0x10写入了7090
说明白实是可以写的;
这可以说是一个有限定的恣意地点写;
限定在于要写的数据也会被当成地点来做一个解析,而且会尝试往那个地点写内容;
命令执行

接下来尝试将这个转换为一个命令执行的漏洞
假如我们直接在__free_hook写入system的话,会导致system之后的内容也被写入一些内容
如许由于尝试在不可写的地方写入导致出错;
不过由于这个程序是2000s时的程序,NX没有开启,因此我们可以直接把shellcode写到内存内里
之后把__free_hook覆盖成堆内里的地点
edit(chunk_A, p64(fd) + p64(bk) + shellcode + p8(0)*(0x70-len(shellcode)) + p64(0x90)*2修改一下要edit的内容
shellcode的话由于bk+0x10会被写入为fd的值,shellcode中需要空出来一小段地区,这个可以通过汇编加一个小jmp实现
shellcode = asm("jmp shellcode;"+ "nop;"*0x20+ shellcraft.execve("/bin/sh"))这里的nop至少要把bk+0x10这里的8个字节都空出来,最小值的话应该是0x18-len("jmp shellcode")
jmp shellcode汇编代码是两个字节,以是这里至少要是0x16

可以看到图中红框是shellcode的内容,绿框是指向shellcode地点的一个指针,即bk
下面执行free(b)

看到堆中a和b都已经被释放掉了,而且bk+0x10的位置已经酿成了fd即__free_hook的值
使用u可以将__free_hook中的内容当作code打印出来,可以看到已经是我们shellcode的内容了

这时继承执行,再调用一次free就会执行我们的shellcode
终极返回了一个shell

unsafe_unlink.zip
9.44 KB, 下载次数: 4, 下载积分: 吾爱币 -1 CB


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

本帖子中包含更多资源

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

x
楼主热帖
回复

使用道具 举报

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

本版积分规则

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

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

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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