以太坊(EVM)智能合约逆向工程辅助工具
作者:Sec-Labs | 发布时间:
项目地址
https://github.com/Decurity/abi-decompiler
abi-decompiler项目简介
相关技术点
- EVM智能合约ABI恢复
- 函数签名暴力破解
- Python2编程语言
项目用途
- 该项目的目的是实现一种简单的工具来恢复EVM智能合约的ABI,包括函数名称。
- 可以作为智能合约反向工程和安全评估的辅助工具。
- 该工具可以进行函数签名暴力破解,使用了多个函数签名字典,包括来自真实智能合约和前100k个英语单词的字典。
- 该工具还导入了来自https://github.com/trailofbits/ethersplay的签名数据库。
更新 06/2022
- 旧Python版本非常慢且有错误。请查看仅能进行多线程签名暴力破解的有限C++版本。
使用
- 编译:clang++ -O3 -std=c++11 -pthread sha3.c sig-bruteforcer.cpp -o sig-bruteforcer
- 参数:./sig-bruteforcer
- 示例:./sig-bruteforcer 2e1a7d4d solnames.txt 4 5
TODO
- 实现不同数据类型和大小以及数组的广义暴力破解。
项目描述
abi-decompiler的目的是实现一个简单的工具,以恢复EVM智能合约的ABI,包括函数名称。
这个副项目还不是一个完整的Solidity反编译器,但它可以用作智能合约逆向工程和安全评估的辅助工具。
该工具使用Python2编写,并配备了几个函数签名暴力破解的单词表。单词表是从真实的智能合约和前100k个英文单词编译而来的。此外,签名数据库也从https://github.com/trailofbits/ethersplay导入。
更新 06/2022
旧的Python版本非常缓慢和有缺陷。请查看仅能进行多线程签名暴力破解的有限C++版本。
编译
clang++ -O3 -std=c++11 -pthread sha3.c sig-bruteforcer.cpp -o sig-bruteforcer
用法
参数:
./sig-bruteforcer <十六进制编码的函数选择器> <函数名称的路径> <线程数量> <最大函数参数数>
例如:
% ./sig-bruteforcer 2e1a7d4d solnames.txt 4 5
从0开始的线程已启动
从432开始的线程已启动
从864开始的线程已启动
从1296开始的线程已启动
找到 => withdraw(uint256)
待办事项
实现不同数据类型和大小以及数组的广义暴力破解。
[已弃用] 用法参数:
$ python abi-decompiler.py
用法: abi-decompiler.py [options]
选项:
-h, --help 显示此帮助消息并退出
-w DICT, --wordlist=DICT
输入文件函数名称列表
-f FILE, --file=FILE 包含EVM字节码的文件
-e EXHAUST, --exhaustive=EXHAUST
尝试常见类型或所有(0/1)
-a ARGS, --args=ARGS 函数参数的最大数量
-d DISASM, --disasm=DISASM
仅反汇编字节码(0 / 1)
-v VERBOSE, --verbose=VERBOSE
冗长程度(0-2)
示例运行:
$ python abi-decompiler.py -f /root/blockchain/contract.bin -w ./solnames1.txt
INFO:root:开始反汇编
DEBUG:root:在偏移量103处发现函数28657aa5
DEBUG:root:在偏移量146处发现函数2e1a7d4d
DEBUG:root:在偏移量191处发现函数a5c12f79
DEBUG:root:在偏移量265处发现函数d87aa643
WARNING:root:找到的函数为:28657aa5、2e1a7d4d、a5c12f79、d87aa643
INFO:root:现在处理函数28657aa5
DEBUG:root:已处理0个名称
INFO:root:现在处理函数2e1a7d4d
DEBUG:root:已处理0个名称
WARNING:root:找到函数2e1a7d4d的原型:withdraw(uint256)
INFO:root:现在处理函数a5c12f79
DEBUG:root:已处理0个名称
INFO:root:现在处理函数d87aa643
DEBUG:root:已处理0个名称
WARNING:root:找到函数d87aa643的原型:invest(uint256,uint256)
==================================================
生成的ABI:
[{'constant': False,
'inputs': [{'name': 'param1', 'type': 'uint256'},
{'name': 'param2', 'type': 'uint256'}],
'name': 'invest',
'outputs': [],
'payable': False,
'stateMutability': 'nonpayable',
'type': 'function'},
{'constant': False,
'inputs': [{'name': 'param1', 'type': 'uint256'}],
'name': 'withdraw',
'outputs': [],
'payable': False,
'stateMutability': 'nonpayable',
'type': 'function'},
{'constant': False,
'inputs': [],
'name': 'function_a5c12f79',
'outputs': [],
'payable': True,
'stateMutability': 'payable',
'type': 'function'},
{'constant': False,
'inputs': [],
'name': 'function_28657aa5',
'outputs': [],
'payable': True,
'stateMutability': 'payable',
'type': 'function'}]
==================================================
生成的接口:
contract DecompiledContract {
function invest(uint256 param1, uint256 param2) {}
function withdraw(uint256 param1) {}
function function_a5c12f79() payable {}
function function_28657aa5() payable {}
}
反汇编:
$ python abi-decompiler.py -f /root/blockchain/contract.bin -w ./solnames1.txt -d 1 | more
0x00000000 60... PUSH1 0x80
0x00000002 60... PUSH1 0x40
0x00000004 52 MSTORE
0x00000005 60... PUSH1 0x40
0x00000007 51 MLOAD
0x00000008 60... PUSH1 0x40
0x0000000A 80 DUP1
0x0000000B 61... PUSH2 0x9407
0x0000000E 83 DUP4
0x0000000F 39 CODECOPY
0x00000010 81 DUP2
0x00000011 1 ADD
0x00000012 80 DUP1
0x00000013 60... PUSH1 0x40
0x00000015 52 MSTORE
0x00000016 81 DUP2
0x00000017 1 ADD
0x00000018 90 SWAP1
. . .
已知的错误
这个工具的目的是保持非常简单,所以没有花哨的聪明数学分析、符号执行。
这意味着这个肮脏的工具缺少一些功能,不能准确地计算一些功能(返回值类型、可支付修改器)。
我将尝试解决这个挑战,使其在没有巨大依赖关系的情况下工作 =)
待办事项
- 修复错误的可支付修饰符计算
- 实现返回值检测
- 添加内联汇编到接口,生成可用于调试的源代码
- 在反汇编中添加堆栈详细信息
标签:工具分享, 钓鱼, 区块链安全