区块链安全—一则蜜罐DAPP欺骗手段分析

一、前言叙述

最近,我通过一些相关文章的阅读发现了几个有趣的DAPP。而深入研究后我准备将分析过程记录下来,并分享给读者。本文包括两则DAPP,第一个通过代码审计发现了其中存在的一处溢出漏洞;第二个为一则答题类游戏,然而深入分析后发现,这款游戏不仅仅只简单的问答接口,然而对于了解以太坊的人是一个陷阱。所以我对其进行了复现、分析操作,并记录下来引以为戒。

二、合约分析与测试

1 蜜罐合约漏洞

我们首先根据代码来对合约进行分析。

//Question and answer honeypot.

pragma solidity ^0.4.20;

contract QUESTION
{
    function Play(string _response)
    external
    payable
    {
        require(msg.sender == tx.origin);
        if(responseHash == keccak256(_response) && msg.value>1 ether)
        {
            msg.sender.transfer(this.balance);
        }
    }
    
    string public question;
 
    address questionSender;
  
    bytes32 responseHash;
 
    function StartGame(string _question,string _response)
    public
    payable
    {
        if(responseHash==0x0)
        {
            responseHash = keccak256(_response);
            question = _question;
            questionSender = msg.sender;
        }
    }
    
    function StopGame()
    public
    payable
    {
       require(msg.sender==questionSender);
       msg.sender.transfer(this.balance);
    }
    
    function NewQuestion(string _question, bytes32 _responseHash)
    public
    payable
    {
        require(msg.sender==questionSender);
        question = _question;
        responseHash = _responseHash;
    }
    
    function() public payable{}
}

根据代码内容,我们对游戏分析:

合约只拥有四个函数。首先是play函数。此函数需要msg.sender == tx.origin。这句话的意思就是说我函数的调用方不能是由合约进行中间调用的,而是需要我直接调用。关于msg.sender与tx.origin的区别,我在前面的文章中讲述过,这里就不再继续详细讲述了。

之后,合约对传入的答案进行判断,并且需要要求传入的value大于1 etherresponseHash == keccak256(_response) && msg.value>1 ether。如果传入的内容判定成功,也就是说回答问题正确。那么我们就可以提取出合约中的所有余额。而这函数也是人人可以参与的。

之后我们看StartGame函数。此函数为游戏开始函数,仅能够调用一次。如何进行调用呢?我们来看看代码。首先代码先对传入的参数进行判断:if(responseHash==0x0)。这里的含义是什么呢?由于默认情况下,该参数如果不进行赋值操作那么它就等于0x0 。然而倘若问题与答案进行过更新后,那么responseHash==0x0就变得很低了,几乎没有可能。所以只有第一次调用的时候能够满足这个条件。

进入函数后,合约对三个变量进行赋值。包括问题、答案以及问题发出者。

之后是游戏终止函数:StopGame ()

在此函数中,合约判断需要问题调用者为问题提出者。当满足条件时,该合约中的余额将被转到提出问题的人账户中。

最后是更新问题NewQuestion()

此函数也需要满足调用者为问题发起者,满足条件后将更新问题与答案。这些函数分析起来并不复杂。我们总结下过程。

游戏规则如下:

  • 合约创建者会设置一个问题;
  • 任何玩家都可以通过向合约打入不低于 1ETH 的手续费参与作答;
  • 若猜中答案,将得到合约里所有的 ETH 作为奖励;
  • 若猜不中,无任何奖励,且事先支付的 ETH 会转入该合约

然而同学们有没有发现,由于以太坊的特性,所以如果合约创建者调用了play函数那么由于传入的参数是string,所以在以太坊中可以完美的寻找到其痕迹。但是聪明的蜜罐合约创建者才不会就让用户轻松的取走余额。下面我们来对相关蜜罐进行复现测试。

这里我是以蜜罐合约部署者的身份进行测试

首先将合约版本调整为4.20,并部署合约。

之后,我们在rop上部署合约。

image.png

得到合约地址0xb4769ece1229d32cb6e94ec69b8018e42b043640

image.png

然而,我们并不需要直接进行使用创建者账户直接进行调用play来创建合约问题。我们通过中间合约来进行跳板进行调用。

中间合约如下:

contract middle{
    address addr = 0xb4769ece1229d32cb6e94ec69b8018e42b043640;
    
    QUESTION target =  QUESTION(addr);
    
    function process() public{
        target.StartGame("Who am i?","Pinging");
        target.NewQuestion("Who am i?","balbalbalbabal");
    }
}
image.png

调用process函数之后,我们查看:

image.png

然而我们对问答合约进行交易查询,发现其并不会对中间合约的调用进行记录。

image.png

然而当我们查看参数发现问题已经更新成功。

image.png

之后我们再次调用play()合约。(用于迷惑用户)

image.png

之后我们对合约交易详细进行查看:

image.png

对第一条内容进行查看:

image.png

此时我们刚才的调用被记录下来了,这样就意味着我们已经成功做好了陷阱。然而真正的问题答案是target.NewQuestion("Who am i?","balbalbalbabal");。而非I am a white hat@@@!。然而这样会使大批用户不断的投入以太币去进行尝试。

尤其是针对那些对以太坊机制十分熟悉的人来说,他们在查看到string后以为自己成功找到了创建者的漏洞,不曾想到,这也是创建者设计的陷阱。

2 原合约分析

上述内容为我进行本地测试的情况。而原蜜罐合约是如此进行欺骗的。下面我们查看其交易情况:

image.png

之后我们查看其第二笔交易:

image.png
image.png

合约交易将问题设置为:Imagine you are swimming in the sea and a bunch of hungry sharks surround you. How do you get out alive?�答案设置为:Stop Imagining

image.png

然而这个操作如同我们上述执行的陷阱操作一样,只是为了对用户进行欺骗。

这个操作也确实有用户上钩了:

image.png

这个用户调用了play()函数:

image.png

解码后为:

image.png

果然不出所料,他传入了陷阱string,然而并没有得到转账。

三、总结

对不同的用户有不同的蜜罐合约。而此蜜罐针对的就是对以太坊有一定基础的专业人士设计的。本合约具有很浓厚的讽刺韵味,使很多专业人士都陷入到陷阱中来。所以本文为分析者提供了一种分析思路。希望大家以后能够对此类型的合约有所判断,不要轻易的占小便宜。

四、相关链接

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,658评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,482评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,213评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,395评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,487评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,523评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,525评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,300评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,753评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,048评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,223评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,905评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,541评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,168评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,417评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,094评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,088评论 2 352

推荐阅读更多精彩内容