前言
前段时间,PolyNetwork被盗事件的一个小插曲,一地址向黑客地址转账在inputdata中告知其USDT已被冻结,不要使用USDT,黑客知晓后向该地址转账13.37ETH。
事后很多人便通过inputData在区块链上“聊天”向黑客“索要”虚拟货币,那么我们经常在区块链浏览器中看到的inputData到底是什么?知道创宇区块链安全实验室?为您解答。
Inputdata
在以太坊协议中,当交易为合约创建时,inputdata是账户初始化程序的EVM代码;
而当交易为消息调用时,inputdata是合约函数调用数据。
正常情况下简单的消息调用如调用转账函数时需要填写你要转账的地址_to和你要转账的数量_amount,这些基本信息都包含在inputdata里面。
我们通过一个调用合约的转账交易具体分析,来理解消息调用时inputdata的结构。
解析形式:
原始形式:
我们将原始的inputdata分为三个部分进行分析:
0xa9059cbb:函数标识符
000000000000000000000000345d8e3a1f62ee6b1d483890976fd66168e390f2:第一个参数为address即你要转账的地址,并补位到32字节即64个16进制字符
数据:4月份以太坊链上NFT清洗交易超6.35亿美元:5月5日消息,CryptoSlam数据显示,4月份以太坊链上NFT清洗交易超6.35亿美元,占当月该区块链上所有NFT交易的近60%。该媒体分析称,NFT市场Blur的积分挖矿是以太坊NFT清洗交易的主要驱动力,导致今年迄今为止价值34亿美元的NFT交易被标记为清洗交易。[2023/5/5 14:44:34]
0000000000000000000000000000000000000000000054b7d8ed70650b290000:第二个参数为value即你要转账的数量,并补位到32字节即64个16进制字符
通过对比分析我们可以发现inputdata的基本结构为函数标识符参数。
函数标识符
这里的函数标识符即为函数选择器,根据官方文档可知函数选择器是某个函数签名的Keccak哈希的前4字节。
我们可以通过代码?bytess4(keccake256("transfer(adddress,uint256)"))?或者在线工具获取这种函数签名。
下图可以看出加密结果的前四个字节?(a9059cbb)?跟inputdata中函数标识符一致。
这里之所以要将函数签名截断到四个字节是考虑到Gas成本问题。
在一笔交易中0字节需要支付4gas,而非0字节需要68gas也就是0字节的17倍。
Boba Network:Enya Labs将为迪拜DMCC成员提供技术支持:3月22日消息,Boba Network宣布其核心团队Enya Labs与迪拜多种商品交易中心(DMCC)达成合作,将通过Boba Network促进迪拜Web3和区块链企业的扩展,为有兴趣发展其Web3公司的加密中心成员提供访问权限和技术援助。Enya Labs还将通过DMCC加密学院,提供指导计划和进一步的帮助。[2023/3/22 13:19:12]
在SHA-3加密中生成的32字节随机字符串更倾向于多的非0字节,所以大概成本是32x68=2176gas,而截断成本大概为4x68=272gas,可见截断到四个字节能够节省约8倍的gas费。
而函数标识符的作用是指定调用哪一个函数,在同一个合约中两个不同函数的SHA-3签名的前4字节相同的概率是十分小的,所以截断到四个字节实际不会影响函数调用。
参数
在evm执行字节码的约定中,静态类型左补齐零至64长度,而动态类型则是右补齐零至64长度。
归纳下常见的静态类型:uint,bool,Address,bytes,动态数组类型:bytes,string,address,bytes32.....
我们通过?pyethereum的ABI编码函数?来研究不同数据类型的编码方式。
静态类型
由dappOS提供支持的去中心化衍生品交易所平台GMX试点版本即将上线:金色财经报道,由 Web3 操作系统 dappOS 提供支持的去中心化衍生品交易所平台 GMX 试点版本即将上线,旨在降低用户在 Arbitrum 和 Avalanche 区块链上访问 GMX DeFi 功能的门槛,简化跨链 GMX 访问流程。(雅虎财经)[2023/2/1 11:40:47]
先导入encode_abi函数
importrlp?fromethereum.abiimportencode_abi
我们以函数transfer(address,uint256)为例
>encode_abi(,
).hex()
000000000000000000000000345d8e3a1f62ee6b1d483890976fd66168e390f2
0000000000000000000000000000000000000000000000000000000000000001
对于小于32字节的定长数组会被自动填充到32字节:
>encode_abi("],).hex()
//自动填充0
0000000000000000000000000000000000000000000000000000000000000001
三箭资本创始人Zhu Su正寻求甩卖价值2.4亿RMB的新加坡优质洋房:6月30日消息,位于Yarwood Ave的优质洋房(GCB)正在寻求甩卖(Urgent Sell)。这栋房子据信是去年12月由三箭资本创始人Zhu Su花费4880万新币(约2.4亿rmb)买入的,也就是说距离此前购房仅过去半年时间,这也与最近传闻的“三箭资本陷入破产清算”相吻合。
传闻目前该房产售价低于买入价格。如果再算上第一年卖出持有私人地产的12%卖家印花税,屋主或亏损超过1000万新币(5千万rmb)。
据悉,新加坡优质洋房,Good Clas Bungalow,简称GCB,是新加坡最顶尖的私人住宅房地产类别,整个新加坡只有约2800栋。(微信公众号@美港坡笔记)[2022/6/30 1:42:15]
0000000000000000000000000000000000000000000000000000000000000002
0000000000000000000000000000000000000000000000000000000000000003
动态类型
动态类型编码要稍微复杂一些,需要先计算偏移量进行占位处理,我们通过一个简单的例子来具体说明。
>encode_abi(????","uint256","uint256"],
Tether Treasury在波场网络销毁66亿枚USDT:6月20日消息,据Whale Alert数据显示,Tether Treasury于6月20日23:32:51在波场网络销毁6,600,000,000枚USDT。对此,Tether首席技术官Paolo Ardoino表示,这些被销毁的是之前赎回时国库钱包中的TRC-20 USDT。[2022/6/21 4:41:04]
????,,]
).hex()
//参数1的偏移量:32*3=96十六进制0x600000000000000000000000000000000000000000000000000000000000000060
//参数2的偏移量=参数1偏移量参数1数据部分长度=9632*4=224十六进制0xE000000000000000000000000000000000000000000000000000000000000000e0
//参数3的偏移量=参数2偏移量参数2数据部分长度=22432*4=352十六进制0x1600000000000000000000000000000000000000000000000000000000000000160
//偏移量0x60位置开始传入参数1的数据
0000000000000000000000000000000000000000000000000000000000000003//元素个
00000000000000000000000000000000000000000000000000000000000000a1//第一个数组元素
00000000000000000000000000000000000000000000000000000000000000a2//第二个数组元素
00000000000000000000000000000000000000000000000000000000000000a3//第三个数组元素
//0xe0位置。参数2的数据
0000000000000000000000000000000000000000000000000000000000000003
00000000000000000000000000000000000000000000000000000000000000b1
00000000000000000000000000000000000000000000000000000000000000b2
00000000000000000000000000000000000000000000000000000000000000b3
//0x160位置。参数3的数据
0000000000000000000000000000000000000000000000000000000000000003
00000000000000000000000000000000000000000000000000000000000000c1
00000000000000000000000000000000000000000000000000000000000000c2
00000000000000000000000000000000000000000000000000000000000000c3
短地址攻击
经过前面的分析当静态类型如address长度不足32字节时EVM会根据规则将长度补齐到32字节,如果当转账的地址以00结尾,如0x641988625108585185752230bde001b3ebd0fc00,转账时将地址后面的两个零去掉,EVM依然会认为address_to是32位的,所以它会从_value的高位取0来补充,amount的位数会多两位也就是会乘以256。
攻击过程如下:
将恶意转账地址最后一个字节的0去掉
函数标识符:a9059cbb
转账地址:
000000000000000000000000641988625108585185752230bde001b3ebd0fc
转账金额:
00000000000000000000000000000000000000000000000000000000000000001
由于EVM的补位规则,解析结果为:0xa9059cbb000000000000000000000000641988625108585185752230bde001b3ebd0fc0000000000000000000000000000000000000000000000000000000000000000100
我们分解后发现,转账金额已经多了两位也就是多了一个字节,即为原来转账的256倍
函数标识符:a9059cbb
转账地址:
000000000000000000000000641988625108585185752230bde001b3ebd0fc00
转账金额:
00000000000000000000000000000000000000000000000000000000000000100
如何在inputdata附着信息
在以太坊中直接进行转账交易的inputdata字段默认是没有内容的,但是我们可以通过设置钱包实现文章开头的“聊天功能”。
我们以MetaMask钱包为例展示如何通过转账在inputdata字段附着一些额外的信息。
1、首先我们需要打开钱包高级选项的显示十六进制数据开关
2、在转账时将你要附着的信息通过十六进制编码后填入下方十六进制数据中,记得在开头加上0x然后进行转账
3、转账成功后在etherscan中就能够看到附着信息
总结
我们能够通过交易中的inputdata将一些信息永久存储在区块链中,可以通过此项技术在食品药品监管部门的产品防伪溯源、财税部门的电子票据打假验真、学术成果存证等方面实现应用落地。
标签:DATPUTDATAATADatamineintelligencefogcomputerchainoracledataCreata
親愛的用戶:幣安現已完成Solana網絡的USDC、USDT集成,並開放USDC-SPL和USDT-SPL代幣充值提現業務。請在數字貨幣充值頁面選擇Solana轉賬網絡,以取得USDC-SPL和USDT-SPL充值地址.
1900/1/1 0:00:00"给我一个杠杆,我能够撬动地球!"从智人学会善用语言,再到熟练运用各类工具,发现新的支点让人类的杠杆越来越长。然而杠杆所带来的公共福利边际是在不断减少的,不同人使用不同杠杆的能力让这个世界的贫富差距达到了前所未有的高度.
1900/1/1 0:00:00尊敬的用户:?????????????BKEXGlobal即将上线UM,详情如下:上线交易对:UM/USDT币种类型:ERC20?充值功能开放时间:已开放交易功能开放时间:2021年10月13日20:00提现功能开放时间:2021年1.
1900/1/1 0:00:00Gate.io量化信号者训练营(4)活动已圆满结束,根据活动规则,我们已为符合规则的用户发放了活动奖励。用户可进入“钱包—账单明细”查询奖励发放情况。活动详情及规则请点击查看。Gate.io对此次活动保有最终解释权.
1900/1/1 0:00:0009/25-10/0813?期英文版本请关注Medium@snapfingersa16z和红杉等参投的高达2亿美元融资,本周宣布推出5000万美元去中心化社交生态基金,扶持早期区块链社交媒体项目.
1900/1/1 0:00:00亲爱的BitMart用户:BitMart将于2021年10月20日上线代币DogeBull(DOGEBULL)。届时将开通DOGEBULL/USDT交易对.
1900/1/1 0:00:00