上文中我们分析了蜜罐合约。更重要的内容在本文呈现——如何以攻击者以及防御者角度对蜜罐合约进行渗透或防御。
现在回到这个题目,看看我们应该如何成功攻破。
拿到合约后:
简单解读一下该合约,该用户若想获得flag,那么他必须满足两个条件:
第一个为记录值必须为true第二个为余额必须为0.
满足为true意味着要调用。
而调用了这个合约之后用户的余额则变为1000.
所以我们如何将这1000的余额花掉?
我们在broke.sol函数中能发现转账函数:
但是该函数拥有修饰函数lock。
![]()
而该函数使得该余额需要存储1年才能进行转账,所以该方法跳过。
第二个方法为使用withdraw函数:
而该函数只能onlyOwner调用。
modifier onlyOwner{ if (msg.sender != owner) revert(); _; }。
那么这里需要改变owner的身份。
这里是个坑点。
这个函数看似能改变,当调用了之后会发现owner并不会改变。这是由于继承机制的问题。(蜜罐的精髓)
所以真正的方案是什么?
我们这是需要逆向整个合约。
https://ethervm.io/decompile/ropsten/0xffd1e29ab7ea57836ce43c1089230fb29fd5b27e
既然上述的几种方法我们无法成功,那么我们需要通过逆向来查找是否有其他的函数了辅助我们进行。
其实在合约逆向后很容易能发现approve函数,而熟悉这个函数的用户都知道。ERC20中存在此类函数意味着拥有transferfrom类型的函数。
而我们并没有看到transferfrom函数。而逆向成为我们唯一的切入点,下文中我们详细分析一下如何进行更有深度的逆向操作。
作者:Pinging 原创文章

但是该函数拥有修饰函数lock。









暂无评论内容