solidity 安全 合约的短地址攻击——这个锅谁来背

    前一段时间,有个用户用说发交易的时候提示地址错误,后来发现发送的地址少了一字节;所以钱包检测发送地址时,会提示错误。当时也没当回事,以为是用户自己搞错了。最近研究solidity的时候,才明白了当时是怎么回事,原来这个用户遇到了短地址攻击。今天就来分析一下短地址攻击,玩ERC20的“韭菜们”都需要注意一下,否则你会发现,你的token被自己莫奇妙的都送给别人了,到时候可没地方说理去。

    我们先来看一下正常的ERC20转账的交易结构是什么样子的。正常的ERC20的转账交易,from地址是你自己,to地址是你要转账的token合约地址,而你要转账账户地址其实是写在input data里;随便找一个erc20的转账地址大家看一下,

https://etherscan.io/tx/0xc6f6d2e9ebabe1b160fde3bd51507903cc0f40bdf4813c99d138d57b8b345f1f

大家可以看一下,我红色标注的地址;我们着重分析一下,input data结构;如果你看了我写的omni协议分析,有没有觉得input data和OP_Return有点类似呢;我们把input data用两种形势表达一下。

解析形式:

solidity 安全 合约的短地址攻击——这个锅谁来背_第1张图片

原始形式:

solidity 安全 合约的短地址攻击——这个锅谁来背_第2张图片

对比一下两种形式,你会发现,其实是一样的,也就明白了input data是个什么样的结构;主要分为三部分。

1)四个字节,函数名称,transfer(address _to, uint256 _amount),这个是把函数名字做keccak256,之后取前四个字节。

0xa9059cbb

2)32字节,你要转账的地址,不足32字节,需要补零。

000000000000000000000000641988625108585185752230bde001b3ebd0fc7a

3)32字节,你要转账的数量,不足32字节,需要补零。

00000000000000000000000000000000000000000000000000000451e804f0e0

短地址攻击是什么原理呢?

第一步,你的有一个地址以00结尾的账户地址,为什么?暂且不表;先说说怎么得到这种地址,你要是牛逼点,自己写个代码,很快就生成里,笔者实验了一下也就生产了2000个地址就会出现这种地址;你要是不会呢,有个叫“币合钱包”的工具打开后,选择“靓号生成器选项卡”就可以生产你想要的地址了。就以上例地址为例,你获得了一个641988625108585185752230bde001b3ebd0fc00的地址。

第二步,你把这个地址发给别人,但是以这种形式641988625108585185752230bde001b3ebd0fc;发现没有最后的两个零没写,为啥呢?接着看。

第三步,这就和你没关系啦,对方拿到这个地址后要转erc20的代币,他会创建input data,但是结果确实这样的。

0xa9059cbb

000000000000000000000000641988625108585185752230bde001b3ebd0fc

00000000000000000000000000000000000000000000000000000451e804f0e000

第二部分少了两个零,怎么办,后边补啊;相当于蓝色这两个补到了地址上,地址后边又补了两个;学过计算机的都知道,左移8位相当于乘256,就是你原来想转一个,变成了转256了。

如果钱包、交易所做地址校验了,那应该就不会有啥大问题。

你可能感兴趣的:(solidity合约那点事儿,ERC20,短地址攻击,solidity,智能合约漏洞)