forked from yagol2020/CrossFuzz
-
Notifications
You must be signed in to change notification settings - Fork 0
/
CrossFuzz.py
executable file
·141 lines (126 loc) · 7.26 KB
/
CrossFuzz.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
import json
import shutil
import sys
import os
import config
from comp import analysis_depend_contract, analysis_main_contract_constructor
'''
Chương trình bắt đầu bằng việc gọi hàm run() để thực hiện fuzzing trên hợp đồng thông minh với các tham số cấu hình cụ thể.
Kết quả từ quá trình fuzzing được sao chép đến vị trí lưu trữ để phân tích sau này.
Nếu tệp được chạy trực tiếp, nó sẽ thiết lập môi trường cần thiết bằng cách xác định đường dẫn Python và fuzzer.
Hàm test_run() được gọi hai lần để thực hiện các phiên kiểm thử, có thể với mục đích khác nhau hoặc để xác nhận tính ổn định.
Dòng gọi hàm cli() bị chú thích có thể cho thấy người phát triển đang thử nghiệm và chưa muốn sử dụng giao diện dòng lệnh tại thời điểm này.
'''
def run(_file_path: str, _main_contract, solc_version: str, evm_version: str, timeout: int, _depend_contracts: list,
max_individual_length: int, _constructor_args: list, _solc_path: str, _duplication: str = '0'):
'''
Gọi hàm run và lưu kết quả vào biến res:
1. Mục đích: Chạy quá trình fuzzing trên hợp đồng thông minh bằng cách gọi hàm run với các tham số cần thiết.
2. Các tham số:
p: Đường dẫn tới tệp hợp đồng thông minh.
c_name: Tên của hợp đồng chính cần fuzzing.
solc_version: Phiên bản của trình biên dịch Solidity.
"byzantium": Phiên bản EVM được sử dụng.
fuzz_time: Thời gian chạy fuzzer.
_depend_contracts: Danh sách các hợp đồng phụ thuộc.
max_trans_length: Độ dài tối đa của chuỗi giao dịch.
_constructor_args: Tham số khởi tạo cho constructor của hợp đồng.
_solc_path: Đường dẫn tới trình biên dịch Solidity.
_duplication: Tham số tùy chọn về nhân đôi giao dịch.
'''
depend_contracts_str = " ".join(_depend_contracts)
constructor_str = " ".join(_constructor_args)
cmd = (f"{PYTHON} {FUZZER}"
f" -s {_file_path}"
f" -c {_main_contract}"
f" --solc v{solc_version}"
f" --evm {evm_version}"
f" -t {timeout}"
f" --result fuzzer/result/res.json"
f" --cross-contract 1"
f" --open-trans-comp 1"
f" --depend-contracts {depend_contracts_str}"
f" --constructor-args {constructor_str}"
f" --constraint-solving 1"
f" --max-individual-length {max_individual_length}"
f" --solc-path-cross {_solc_path}"
f" --p-open-cross 80"
f" --cross-init-mode 1"
f" --trans-mode 1"
f" --duplication {_duplication}")
print(cmd)
os.popen(cmd).readlines() # run CrossFuzz.py
return "fuzzer/result/res.json"
def test_run():
# absolute path
_file_path = "./examples/T.sol"
_main_contract = "E"
solc_version = "0.4.26"
evm_version = "byzantium"
timeout = 10
solc_path = config.SOLC_BIN_PATH
_depend_contracts, _sl = analysis_depend_contract(file_path=_file_path, _contract_name=_main_contract,
_solc_version=solc_version, _solc_path=solc_path)
max_individual_length = 10
_constructor_args = analysis_main_contract_constructor(file_path=_file_path, _contract_name=_main_contract, sl=_sl)
run(_file_path, _main_contract, solc_version, evm_version, timeout, _depend_contracts, max_individual_length,
_constructor_args, _solc_path=config.SOLC_BIN_PATH)
def cli():
if len(sys.argv) < 2:
print("Usage: python3 CrossFuzz.py <option>")
print("Please enter: \n 'python3 CrossFuzz.py demo_test' for demo \n 'python3 CrossFuzz.py --help' for using CLI app.")
sys.exit(1)
option = sys.argv[1]
if option.lower() == "demo_test":
test_run()
sys.exit(0) # Kết thúc chương trình sau khi thực hiện test_run()
# Hiển thị hướng dẫn sử dụng khi không có đủ tham số hoặc gọi `-help`
if len(sys.argv) < 10 or sys.argv[1] in ("-help", "--help"):
print(
f"Usage: python {sys.argv[0]} <file_path> <contract_name> <solc_version> <max_trans_length> "
"<fuzz_time> <res_saved_path> <solc_path> <constructor_params_path> <trans_duplication>\n\n"
"Arguments:\n"
" file_path Path to the Solidity file to be fuzzed\n"
" contract_name Name of the contract to be fuzzed\n"
" solc_version Supported Solidity compiler version (0.4.24, 0.4.26, 0.6.12, 0.8.4)\n"
" max_trans_length Maximum transaction length (e.g., 10)\n"
" fuzz_time Fuzzing duration in seconds (e.g., 60)\n"
" res_saved_path Path to save the result JSON (e.g., ./result.json)\n"
" solc_path Path to the Solidity compiler (solc)\n"
" constructor_params_path Path to constructor parameters (e.g., 'auto' or './examples/p.json')\n"
" trans_duplication Duplicate transactions: 0 (no), 1 (yes)\n"
)
sys.exit(1) # Kết thúc chương trình khi hiển thị hướng dẫn
# Gán các tham số
p = sys.argv[1] # sol file path, which is the file path to be fuzzed
c_name = sys.argv[2] # contract name, which is the contract to be fuzzed
solc_version = sys.argv[3] # only support 0.4.24, 0.4.26, 0.6.12, 0.8.4
max_trans_length = int(sys.argv[4]) # max transaction length, e.g., 10
fuzz_time = int(sys.argv[5]) # fuzz time, e.g., 60(s)
res_saved_path = sys.argv[6] # e.g., ./xxxx.json
solc_path = sys.argv[7] # solc path
constructor_params_path = sys.argv[8] # e.g., Auto or "examples/p.json"
trans_duplication = sys.argv[9] # e.g., 0 if you don't want to duplicate transactions, otherwise 1
print(f"Running fuzzing for contract {c_name} in file {p}...")
_depend_contracts, _sl = analysis_depend_contract(file_path=p, _contract_name=c_name, _solc_version=solc_version,
_solc_path=solc_path)
if len(_depend_contracts) <= 0:
print("No depend contracts")
sys.exit(-1)
if constructor_params_path != "auto":
_constructor_args = []
for p_name, p_detail in json.load(open(constructor_params_path, "r", encoding="utf-8")).items():
_constructor_args.append(f"{p_name} {p_detail['type']} {p_detail['value']}")
else:
_constructor_args = analysis_main_contract_constructor(file_path=p, _contract_name=c_name, sl=_sl)
if _constructor_args is None:
print("No constructor")
sys.exit(-2)
res = run(p, c_name, solc_version, "byzantium",
fuzz_time, _depend_contracts, max_trans_length, _constructor_args, _solc_path=solc_path,
_duplication=trans_duplication)
shutil.copyfile(res, res_saved_path) # move result json file to the specified path
if __name__ == "__main__":
PYTHON = "python3" # đường dẫn tới python3 của bạn
FUZZER = "fuzzer/main.py" # đường dẫn đến fuzzer của bạn trong repo
cli()