hitcxy / BlogComment

blog comments
0 stars 0 forks source link

Balsn CTF 2019 - Bank | pikachu's Blog #57

Open hitcxy opened 2 years ago

hitcxy commented 2 years ago

https://hitcxy.com/2020/balsn2019-bank/

前言 复现 balsn2019 ctf 中的 bank 区块链题目 wtcl ,复现了一个下午 具体分析及官方 WP 如下: https://x9453.github.io/2020/01/16/Balsn-CTF-2019-Bank/ 复现地址为: ropsten@0x85B0446Dc5B5f32cbB674Dc8e49Fc27Ebaff2Ee2 外部账户地址为: 0x785a8D0d84

usherasnick commented 2 years ago

请问0x111111111111110000070f00中070f前面的内容是什么意思呢

hitcxy commented 2 years ago

请问0x111111111111110000070f00中070f前面的内容是什么意思呢

覆盖数组长度

usherasnick commented 2 years ago

按照unused (11) | hash (12) | callback (8) | done (1)的排列,我理解0x111111111111110000070f00中的111111110000070f代表的是callback的值。我理解070f是跳转的位置,可是前面的111111110000是啥意思呢,我这样的理解是对的吗?感谢🙏

hitcxy commented 2 years ago

按照unused (11) | hash (12) | callback (8) | done (1)的排列,我理解0x111111111111110000070f00中的111111110000070f代表的是callback的值。我理解070f是跳转的位置,可是前面的111111110000是啥意思呢,我这样的理解是对的吗?感谢🙏

已做修复,callback是4个字节,你向上追溯看看,相当于修改safeboxes长度

usherasnick commented 2 years ago

internal function应该是8个字节,根据这里说的。另外origin (20) | triedPass (12)中的origin应该才是修改safeboxes长度的作用,因为我们已经确保origin<< (12*8)的值大于idx。主要是我不理解callback的8个字节除了070f这两个字节外,其他六个字节是啥意思

hitcxy commented 2 years ago

internal function应该是8个字节,根据这里说的。另外origin (20) | triedPass (12)中的origin应该才是修改safeboxes长度的作用,因为我们已经确保origin<< (12*8)的值大于idx。主要是我不理解callback的8个字节除了070f这两个字节外,其他六个字节是啥意思

具体记不清了,但我记得当时我调试的时候,它是4个字节,其他细节也记不太清了2333,师傅要不你调试看看其他几个字节都影响了什么,毕竟只有自己调试的才明白的更彻底

usherasnick commented 2 years ago

试了下,不知道为什么现在JUMPDEST的编号变成070e了,所以我是用070e试的。首先我用0x111111111111110000070e00去试,是可以成功的;然后我用0x111111000000000000070e00去试,也是可以成功的。。。。

hitcxy commented 2 years ago

试了下,不知道为什么现在JUMPDEST的编号变成070e了,所以我是用070e试的。首先我用0x111111111111110000070e00去试,是可以成功的;然后我用0x111111000000000000070e00去试,也是可以成功的。。。。

可能版本差异?

nxtanx commented 1 year ago

@usherasnick 试了下,不知道为什么现在JUMPDEST的编号变成070e了,所以我是用070e试的。首先我用0x111111111111110000070e00去试,是可以成功的;然后我用0x111111000000000000070e00去试,也是可以成功的。。。。

请问你那有完整的测试代码吗,我这边感觉位置计算不正确,在第二次withdraw时总是失败,调试时再看加载的box.callback是0x000000000000000000,没有有效值,应该是idx计算有误,不知道怎么计算了,这是我idx计算函数: function passArrayIndex() public view returns (uint256) { uint target = uint(keccak256(abi.encodePacked(keccak256(abi.encodePacked(msg.sender, uint256(3)))))) + 2; uint base = uint(keccak256(2)); uint256 idx = (target - base) / 2; if ((target - base) % 2 == 1) { idx += 2; } return idx; }