BOME只用了3天上币安,币圈一直在创造神话
#比特币[超话]##区块链##元宇宙#
BTC ETH USDT BNB LUNA XRP SOL ADA DOGE BUSD DOT AVAX SHIB WBTC CRO MATIC ENAR LTC TRX APE ATOM LINK BCH UNI FTT LEO OKB XLM ALGO ETC XMR ICP MANA VET EGLD SAND THETA FTM HBAR XTZ RUNE KLAY AXS GMT EOS AAVE ZEC FIL CAKE BTCB FLOW HNT GRT MIOTA WAVES CVX MKR KCS XEC BSV HT STX KSM NEO AR NEXO CHZ CELO ONE QNT GALA ZIL ENJ LRC CRV DASH BAT KNC AMP XEM GT COMP DCR TFUEL KDA HOT ROSE ZRX GLMR SCRT XDC SKL IOTX AUDIO ICX YFI SNX QTUM GNO ANC PAXG BOAR OMG ANKR BNT SRM XYM ELON BTG LPT TT RVN STD 区块链比特币以太坊币圈元宇宙加密圈
#比特币[超话]##区块链##元宇宙#
BTC ETH USDT BNB LUNA XRP SOL ADA DOGE BUSD DOT AVAX SHIB WBTC CRO MATIC ENAR LTC TRX APE ATOM LINK BCH UNI FTT LEO OKB XLM ALGO ETC XMR ICP MANA VET EGLD SAND THETA FTM HBAR XTZ RUNE KLAY AXS GMT EOS AAVE ZEC FIL CAKE BTCB FLOW HNT GRT MIOTA WAVES CVX MKR KCS XEC BSV HT STX KSM NEO AR NEXO CHZ CELO ONE QNT GALA ZIL ENJ LRC CRV DASH BAT KNC AMP XEM GT COMP DCR TFUEL KDA HOT ROSE ZRX GLMR SCRT XDC SKL IOTX AUDIO ICX YFI SNX QTUM GNO ANC PAXG BOAR OMG ANKR BNT SRM XYM ELON BTG LPT TT RVN STD 区块链比特币以太坊币圈元宇宙加密圈
海外养老金,投资中国!
英国养老保障基金委员会拿到合格境外投资者资格,这意味着这家海外养老金机构可以进入中国市场进行投资。今年以来,已有4家外资机构陆续拿下中国市场入场券。其他三家分别是凯德商用产业有限公司、一翎资本私人有限公司、国家共同基金管理有限公司。其中,国家共同基金管理有限公司是澳大利亚领先的金融投资服务机构之一,为安保集团(AMP Limited)旗下子公司。
外资机构认为有望好于去年,美债收益率进入下降通道后,A股成长板块一般会跑赢价值板块。美元进入贬值通道,会为中国货币政策提供更多空间以支持2024年的经济增长,高盛,大摩等纷纷看多A股,
维持对中国A股的高配评级!
英国养老保障基金委员会拿到合格境外投资者资格,这意味着这家海外养老金机构可以进入中国市场进行投资。今年以来,已有4家外资机构陆续拿下中国市场入场券。其他三家分别是凯德商用产业有限公司、一翎资本私人有限公司、国家共同基金管理有限公司。其中,国家共同基金管理有限公司是澳大利亚领先的金融投资服务机构之一,为安保集团(AMP Limited)旗下子公司。
外资机构认为有望好于去年,美债收益率进入下降通道后,A股成长板块一般会跑赢价值板块。美元进入贬值通道,会为中国货币政策提供更多空间以支持2024年的经济增长,高盛,大摩等纷纷看多A股,
维持对中国A股的高配评级!
**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位的问题。
✋热门推荐