一、前言

作为不太成熟的编程语言,Solidity函数由于其运行机制等问题目前能找到很多的安全问题。在之前的分析中,我们针对共识、合约等方向进行过概括性的研究,而最近区块链安全的研究热也激起了研究者对以太坊的深入了解。

最近的几次CTF比赛中,区块链的题目出现的频率也越来越高,也逐渐进入大家的视野中。今天,我们就针对部分区块链的CTF题目以及生产环境中的实例进行一些相关技术分析,并带领读者一步一步模拟这些漏洞的出现情况。并在以太坊平台上进行相关合约部署,方便研究者更进一步的研究。

在分析开始之前,我们先对智能合约有一个基础的概念了解。

智能合约就是运行在区块链网络上的程序,智能合约与合约执行的结果都会储存在区块链上。在区块链的背景下,智能合约不只是一个计算机程序:它自己就是一个参与者,对接收到的信息进行回应并在同时接受和存储相应的价值。除此之外,它也能同外部地址合约进行交互,向外发送信息和价值。智能合约与一般程序的差异主要体现在以下四个方面:

  • 整合资金流程度

智能合约通过以太坊自带的以太币可以非常容易的整合资金流系统。

  • 部署以及后续费用

一般程序部署在服务器上,程序部署成功后,除了需要花费一些维护费用外不需要其他的额外花费。智能合约在部署的时候需要一笔费用,这些费用将分给参与交易验证的人。而在合约部署成功后,合约会作为不可更改的区块链的一部分,分散地存储在全球各地的以太坊节点上。因此,智能合约部署后,并不需要定期提供维持费用,同时查询已写入区块链的静态数据时也不需要费用,只有在每次通过智能合约写入数据的时候才需要交易费用。

例如:

上述图片为查询owner的信息,而此次查询点击即可获得信息,并不需要支付交易费用。

然而对于根据智能合约写入信息来说,我们则需要进行手续费的提供。

  • 存储成本不同

一般的应用程序需要将数据存储到服务器上,需要数据时需要从服务器上读取。然而智能合约将数据存储在区块链上,存储数据所需的成本相对比较昂贵,需要根据存储数据的大小支付相当的费用情况。

  • 部署后无法更改

一般的程序可以通过版本升级的方式进行更改,而智能合约一旦部署到区块链上后,就无法更改这个智能合约。

二、关键威胁函数分析

根据知道,在Solidity合约的书写中,跨合约调用是经常出现危险的地方。而我们就要在这里对调用函数进行一些详细的分析。这里我们分别对call()以及delegatecall()函数进行实验分析,之后对某些函数存在的上下文问题进行深入的理论探讨。

在实验中,我部署了

pragma solidity ^0.4.23;
contract subFun {

    address public addr;

    function subTest() public returns (address a){
        addr = address(this);


    }
}
contract callAndDelegatecall {
    address public b;

    address public testaddress;
    constructor(address _address) public {
        testaddress = _address;
    }
    function withcall() public {
        testaddress.call(bytes4(keccak256("subTest()")));
    }
    function withdelegatecall() public {
        testaddress.delegatecall(bytes4(keccak256("subTest()")));
    }
}

并以此代码进行实验。

1 call()函数

开始的时候,我们传入地址信息并对此函数进行部署。

由下图,我们通过此函数部署了两个contract。

此时,我们查看两个合约对应的addr参数的值,我们知道初始时的值均为Ox0000000。

之后我们调用callAndDelegatecall合约中的withcall()函数,将addr的值更改后我们进行查看。

我们发现subFun合约中的地址被修改,而下面的地址仍然是0x00000。

这就可以很好地说明,调用call()时,上下文环境是被调用的合约的环境。

2 delegatecall()函数

二者执行代码的上下文环境的不同,当使用call调用其它合约的函数时,代码是在被调用的合约的环境里执行,对应的,使用delegatecall进行函数调用时代码则是在调用函数的合约的环境里执行。

对于delegatecall()函数来说,我们同样进行试验。

点击运行函数后,我们发现了不同的现象。

我们下面的地址有了改变。我们根据代码进行分析:

由于我调用了

点击收藏 | 0 关注 | 1
  • 动动手指,沙发就是你的了!
登录 后跟帖