08.注入漏洞
2023-06-23 20:42:06
# 00.security
注入漏洞
这个方法的形参_extraData可以注入任意的数据。比如:假如这个合约生成代币,并且有一个方法transfer(_to,_value)
,那么我们可以通过这个地方进行攻击。
1 | function approveAndCallcode(address _spender,uint256 _value,bytes _extraData) returns (bool succcess){ |
对下图的说明:
- 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。