**4.2** 另一种 Fastbin attack 的手法就是`the Malloc Maleficarum`系列中的 The house of spirit。差不多就是以一种逆向思维去思考:我们不是想着从 fastbin 中拿到想要的 chunk,而是在外面我们能够控制的一段内存 chunk 中,修改它的数据,伪造出一个符合、或者足以绕过 fastbin 检测的 fake chunk,把它塞进 fastbin 中。
那么我们要修改的要素是什么(我们要 bypass 什么)?网上的资料有列出来,但是没有总结原因。但我是不喜欢背公式的,基本是因为 __free 这个函数的限制,可以看看它对应的源代码。这里记录一些自己的理解:
1. IS_MMAP bit must not be set: 这个很好理解,一块 chunk 上面的 AMP 三个bit位标示着它的状态,当然在 M 位上不能为“1”。哪怕篡改的 size 足够小符合 fastbin,但是如果 M=1 那这块 chunk 也不会被塞到 fastbin,而是通过 sbrk 被保留成 small chunk 了。
2. The fake chunk must be aligned properly: 这个也没啥好说的,每块 chunk 在64位系统里都要16字节对齐(32位8字节),通过 MALLOC_ALIGN_MASK 的检测。
3. The fake chunk's size must be within the fastbin range: 这不废话吗,太大了还怎么塞进 fastbin (当然也可以想想办法万一绕过了这个限制会发生什么有意思的事情)。
4. The fake chunk's next chunk size must not be too small or too large: 这个是需要注意的。next chunk 的大小不能小于 2 * SIZE_SZ,同时也不能大于 av->system_mem。因为在分配或者释放我们这个 fake chunk 的时候,堆管理器都会检查一下相邻的这块 chunk 是否正常——检查它的大小。而 2 * SIZE_SZ 到 av->system_mem 这个范围是 non-mmaped chunk 的大小范围。
5. The fake chunk's fastbin must not cause a double-free situation: 我们构造的这块 fake chunk 对应的 fastbin 链表头部不能是该 fake chunk,其实就是在构造的时候检查下不要和当前 fastbin 中 head 上面这块 free chunk 指向的地址一样。一旦 double free 就直接抛异常。
具体如何构造一块 fake chunk,在 how2heap 上面有详细的 C 代码,这里就不复制过来了,用一张自己画的图来概括这个流程(图1)。
在图1中,我认为值得注意的有两点:
1. fake_chunk[1] = 0x40,这里开始会想为什么是 0x40 不是 0x41,如果不指示前面的 chunk in use 的话,会不会触发 unlink?查了一下证明我想多了,“fastbin mechanism doesn't care about the in-use bit of the chunk being freed; it only uses the size to decide which fastbin to put the chunk into”。所以这里无论最后的bit位无论是 0 或者 1 都无所谓。
2. fake_chunks[9] = 0x1234,这里指示 fake chunk 临近下一块 chunk 的大小,4在二进制中是100,这里最后一个bit位是0,岂不是不符合 fastbin 的设置?因为如果 fake chunk 被释放到 fastbin,这个位置应该是 1 才对。事实证明也是我想多了,主要在于这只是代码中一个数组 fake_chunk[10] ,并不是真正的 chunk,我们只需要设置给这个值一个合理的大小,通过校验就可以,不用考虑最后bit位的问题。
那么我们要修改的要素是什么(我们要 bypass 什么)?网上的资料有列出来,但是没有总结原因。但我是不喜欢背公式的,基本是因为 __free 这个函数的限制,可以看看它对应的源代码。这里记录一些自己的理解:
1. IS_MMAP bit must not be set: 这个很好理解,一块 chunk 上面的 AMP 三个bit位标示着它的状态,当然在 M 位上不能为“1”。哪怕篡改的 size 足够小符合 fastbin,但是如果 M=1 那这块 chunk 也不会被塞到 fastbin,而是通过 sbrk 被保留成 small chunk 了。
2. The fake chunk must be aligned properly: 这个也没啥好说的,每块 chunk 在64位系统里都要16字节对齐(32位8字节),通过 MALLOC_ALIGN_MASK 的检测。
3. The fake chunk's size must be within the fastbin range: 这不废话吗,太大了还怎么塞进 fastbin (当然也可以想想办法万一绕过了这个限制会发生什么有意思的事情)。
4. The fake chunk's next chunk size must not be too small or too large: 这个是需要注意的。next chunk 的大小不能小于 2 * SIZE_SZ,同时也不能大于 av->system_mem。因为在分配或者释放我们这个 fake chunk 的时候,堆管理器都会检查一下相邻的这块 chunk 是否正常——检查它的大小。而 2 * SIZE_SZ 到 av->system_mem 这个范围是 non-mmaped chunk 的大小范围。
5. The fake chunk's fastbin must not cause a double-free situation: 我们构造的这块 fake chunk 对应的 fastbin 链表头部不能是该 fake chunk,其实就是在构造的时候检查下不要和当前 fastbin 中 head 上面这块 free chunk 指向的地址一样。一旦 double free 就直接抛异常。
具体如何构造一块 fake chunk,在 how2heap 上面有详细的 C 代码,这里就不复制过来了,用一张自己画的图来概括这个流程(图1)。
在图1中,我认为值得注意的有两点:
1. fake_chunk[1] = 0x40,这里开始会想为什么是 0x40 不是 0x41,如果不指示前面的 chunk in use 的话,会不会触发 unlink?查了一下证明我想多了,“fastbin mechanism doesn't care about the in-use bit of the chunk being freed; it only uses the size to decide which fastbin to put the chunk into”。所以这里无论最后的bit位无论是 0 或者 1 都无所谓。
2. fake_chunks[9] = 0x1234,这里指示 fake chunk 临近下一块 chunk 的大小,4在二进制中是100,这里最后一个bit位是0,岂不是不符合 fastbin 的设置?因为如果 fake chunk 被释放到 fastbin,这个位置应该是 1 才对。事实证明也是我想多了,主要在于这只是代码中一个数组 fake_chunk[10] ,并不是真正的 chunk,我们只需要设置给这个值一个合理的大小,通过校验就可以,不用考虑最后bit位的问题。
=寿喜烧/ほしさ
我爱辱追 完全自我中心主义
提问箱>>https://t.cn/A6TVHd01
芙3全肯定 illit团表 偶尔一吒3爻6
猜你喜欢#黄铉辰永远的1# 公梦一体机
我产品迷45不逆 偶尔一亲亲小耗
我是逆批蛋批五批崩批菌丝批 我隐属多
弦巻心 楠夢羽 西城樹里 memちょ
我是笔记姐我喜欢看脸拉郎配
产品倾向直达>>https://t.cn/A6TbQYDI
世界上唯二的恨:妙手空空 球帝
每天发废话 时间请随意
和我互动的话我会很开心
谢谢你看到这里 和我一起玩吧^
https://t.cn/A6Yg8oOt
我爱辱追 完全自我中心主义
提问箱>>https://t.cn/A6TVHd01
芙3全肯定 illit团表 偶尔一吒3爻6
猜你喜欢#黄铉辰永远的1# 公梦一体机
我产品迷45不逆 偶尔一亲亲小耗
我是逆批蛋批五批崩批菌丝批 我隐属多
弦巻心 楠夢羽 西城樹里 memちょ
我是笔记姐我喜欢看脸拉郎配
产品倾向直达>>https://t.cn/A6TbQYDI
世界上唯二的恨:妙手空空 球帝
每天发废话 时间请随意
和我互动的话我会很开心
谢谢你看到这里 和我一起玩吧^
https://t.cn/A6Yg8oOt
《岑笙季烛》-岑笙季烛(最新章节无弹窗完本)全文阅读岑笙主角[月亮][鄙视]PQ^)=mEm
‼阅读岑笙季烛全文请到蚣/众/呺【岁月书摘】发送一个6648即可!
书名:《岑笙季烛》
主角:岑笙,季烛
以下非文章原文:“岑笙,你现在真有钱的话,不如先去医院挂个脑科或者精神科好吗?”我扭头就走,懒得和她废话。 “纪辛瑜,你直到现在依然不把我放在眼里是吧?”岑笙有些恼怒地拦住了我。 我视若无睹,拨开她便继续往前走。 岑笙拽我的手,我拎着的礼盒被她扯落在地上,发出一声闷响。 岑笙还想上前抓我的手,我抬手挡了一下,她竟然直接跌坐在地上,仿佛我用了极大的力气一样。 陶叶急忙去扶岑笙,然后指责我,“纪辛瑜你有病吧?你推她干什么!” 我蹲下身子把礼盒捡起来,起身时却看到季烛正站在不远处看着我。 “抱歉,我不是故意的。” 当我们的动静引来了别人的关注,岑笙一改刚才的气急败坏,反而是开口道歉。 我起身,不免有些好笑,“岑笙,你不知道这种地方四处都有监控吗?装什么无辜呢? 一听到监控,岑笙不自然地看了一眼四周,最后视线落在了季烛身上。 季烛却只是看着我,我略有心虚。 昨天的事我都还没太敢仔细去想,本来打算这段时间疏远一点,大家都清醒一下。 没想到今天又在这里碰上了,真是有毒,干脆就假装没看到? 我心一横,拎着礼盒转身便走,准备去找何远之,把贺礼带到以后就离开这里,毕竟同时遇到了岑笙和季烛,证明此地不宜久留。 “纪辛瑜!”季烛的声音不算高,却清晰地传入我的耳中,他三两步跟上了我的步伐,与我并肩。子而後厌然,掩其不善,而著其善。人之视己,如见其肺肝然,则何益矣?此谓诚於中,形於外。故君子必慎其独也。曾子曰:“十目所视,十手所指,其严乎!”富润屋,德润身,心广体胖,故君子必诚其意。诗云:“瞻彼淇澳(音郁),菉(绿)竹猗猗。有斐君子,如切如磋,如琢如磨。瑟兮僩兮!赫兮喧兮!有斐君子,终不可諠兮。”如切如磋者,道学也。如琢如磨者,自修也。瑟兮僩兮者,恂慄也。赫兮喧兮者,威仪也。有斐君子,终不可諠兮者,道盛德至善,民之不能忘也。诗云:“於戏(呜呼)!前王不忘。”君子贤其贤而亲其亲,小人乐其乐而利其利,此以没世不忘也。
‼阅读岑笙季烛全文请到蚣/众/呺【岁月书摘】发送一个6648即可!
书名:《岑笙季烛》
主角:岑笙,季烛
以下非文章原文:“岑笙,你现在真有钱的话,不如先去医院挂个脑科或者精神科好吗?”我扭头就走,懒得和她废话。 “纪辛瑜,你直到现在依然不把我放在眼里是吧?”岑笙有些恼怒地拦住了我。 我视若无睹,拨开她便继续往前走。 岑笙拽我的手,我拎着的礼盒被她扯落在地上,发出一声闷响。 岑笙还想上前抓我的手,我抬手挡了一下,她竟然直接跌坐在地上,仿佛我用了极大的力气一样。 陶叶急忙去扶岑笙,然后指责我,“纪辛瑜你有病吧?你推她干什么!” 我蹲下身子把礼盒捡起来,起身时却看到季烛正站在不远处看着我。 “抱歉,我不是故意的。” 当我们的动静引来了别人的关注,岑笙一改刚才的气急败坏,反而是开口道歉。 我起身,不免有些好笑,“岑笙,你不知道这种地方四处都有监控吗?装什么无辜呢? 一听到监控,岑笙不自然地看了一眼四周,最后视线落在了季烛身上。 季烛却只是看着我,我略有心虚。 昨天的事我都还没太敢仔细去想,本来打算这段时间疏远一点,大家都清醒一下。 没想到今天又在这里碰上了,真是有毒,干脆就假装没看到? 我心一横,拎着礼盒转身便走,准备去找何远之,把贺礼带到以后就离开这里,毕竟同时遇到了岑笙和季烛,证明此地不宜久留。 “纪辛瑜!”季烛的声音不算高,却清晰地传入我的耳中,他三两步跟上了我的步伐,与我并肩。子而後厌然,掩其不善,而著其善。人之视己,如见其肺肝然,则何益矣?此谓诚於中,形於外。故君子必慎其独也。曾子曰:“十目所视,十手所指,其严乎!”富润屋,德润身,心广体胖,故君子必诚其意。诗云:“瞻彼淇澳(音郁),菉(绿)竹猗猗。有斐君子,如切如磋,如琢如磨。瑟兮僩兮!赫兮喧兮!有斐君子,终不可諠兮。”如切如磋者,道学也。如琢如磨者,自修也。瑟兮僩兮者,恂慄也。赫兮喧兮者,威仪也。有斐君子,终不可諠兮者,道盛德至善,民之不能忘也。诗云:“於戏(呜呼)!前王不忘。”君子贤其贤而亲其亲,小人乐其乐而利其利,此以没世不忘也。
✋热门推荐