08.注入漏洞
2023-06-23 20:42:06 # 00.security

注入漏洞

这个方法的形参_extraData可以注入任意的数据。比如:假如这个合约生成代币,并且有一个方法transfer(_to,_value),那么我们可以通过这个地方进行攻击。

1
2
3
4
5
6
7
8
9
function approveAndCallcode(address _spender,uint256 _value,bytes _extraData) returns (bool succcess){
allowed[msg.sender][_spender] = _value;
Approval(msg.sender,_spender,_value);

//Call the contract code
if(!_spender.call(_extraData)){
revert;
}
}

对下图的说明:

  • 5a9bXXXXX是这个问题合约的地址,因为这个合约还在用,因此隐去相关信息
  • 攻击的结果:从合约地址向我的地址160个代币(因为单位问题是0.几几16)
  • MethodID:这个方法的函数签名
  • 【0】:合约的地址
  • 【1】:因为我们要对if中的call漏洞进行攻击,所以_value没什么意义,设置为0
  • 【2】:类如bytes、string和数组这一类参数,没固定长度。60是offset,即偏移量。我们可以知道,【0】的偏移量是0,【1】的偏移量是256bits,即32bytes,换成16进制就是20bytes。同理【2】的偏移量是40。同理【3】的偏移量是60。
  • 【3】:44是bytes _extraData的长度。即从a9059cbb一直到000000a0,一共44bytes(16进制)。
  • 【4】:前面4字节是transfer(_to,_value)的函数签名。
  • 【5】【6】:因为函数签名的缘故,这两个位置的数据不整齐,其实也是32bytes(10进制)。后面补0。

image-20221210214025031

Prev
2023-06-23 20:42:06 # 00.security
Next