@@ -101,8 +101,9 @@ void Fuzzer::showStats(Mutation mutation) {
101
101
auto int2 = to_string (fuzzStat.stageFinds [STAGE_INTEREST16]) + " /" + to_string (mutation.stageCycles [STAGE_INTEREST16]);
102
102
auto int4 = to_string (fuzzStat.stageFinds [STAGE_INTEREST32]) + " /" + to_string (mutation.stageCycles [STAGE_INTEREST32]);
103
103
auto knownInts = padStr (int1 + " , " + int2 + " , " + int4, 30 );
104
+ auto addrDict1 = to_string (fuzzStat.stageFinds [STAGE_EXTRAS_AO]) + " /" + to_string (mutation.stageCycles [STAGE_EXTRAS_AO]);
104
105
auto dict1 = to_string (fuzzStat.stageFinds [STAGE_EXTRAS_UO]) + " /" + to_string (mutation.stageCycles [STAGE_EXTRAS_UO]);
105
- auto dictionary = padStr (dict1, 30 );
106
+ auto dictionary = padStr (dict1 + " , " + addrDict1 , 30 );
106
107
auto hav1 = to_string (fuzzStat.stageFinds [STAGE_HAVOC]) + " /" + to_string (mutation.stageCycles [STAGE_HAVOC]);
107
108
auto havoc = padStr (hav1, 30 );
108
109
auto random1 = to_string (fuzzStat.stageFinds [STAGE_RANDOM]) + " /" + to_string (mutation.stageCycles [STAGE_RANDOM]);
@@ -193,6 +194,7 @@ FuzzItem Fuzzer::saveIfInterest(TargetExecutive& te, bytes data, int depth) {
193
194
/* Start fuzzing */
194
195
void Fuzzer::start () {
195
196
TargetContainer container;
197
+ Dictionary codeDict, addressDict;
196
198
for (auto contractInfo : fuzzParam.contractInfo ) {
197
199
ContractABI ca (contractInfo.abiJson );
198
200
auto bin = fromHex (contractInfo.bin );
@@ -202,17 +204,18 @@ void Fuzzer::start() {
202
204
auto data = ca.randomTestcase ();
203
205
auto revisedData = ContractABI::postprocessTestData (data);
204
206
executive.deploy (revisedData);
207
+ addressDict.fromAddress (executive.addr .asBytes ());
205
208
} else {
206
209
auto contractName = contractInfo.contractName ;
207
210
boost::filesystem::remove_all (contractName);
208
211
boost::filesystem::create_directory (contractName);
209
- Dictionary dict (bin);
212
+ codeDict. fromCode (bin);
210
213
211
214
saveIfInterest (executive, ca.randomTestcase (), 0 );
212
215
int origHitCount = queues.size ();
213
216
while (true ) {
214
217
FuzzItem curItem = queues[fuzzStat.idx ];
215
- Mutation mutation (curItem, dict );
218
+ Mutation mutation (curItem, make_tuple (codeDict, addressDict) );
216
219
auto save = [&](bytes data) {
217
220
auto item = saveIfInterest (executive, data, curItem.depth );
218
221
if (fuzzStat.totalExecs % REFRESH_RATE == 0 ) showStats (mutation);
@@ -229,45 +232,63 @@ void Fuzzer::start() {
229
232
mutation.singleWalkingBit (save);
230
233
fuzzStat.stageFinds [STAGE_FLIP1] += queues.size () - origHitCount;
231
234
origHitCount = queues.size ();
235
+
232
236
mutation.twoWalkingBit (save);
233
237
fuzzStat.stageFinds [STAGE_FLIP2] += queues.size () - origHitCount;
234
238
origHitCount = queues.size ();
239
+
235
240
mutation.fourWalkingBit (save);
236
241
fuzzStat.stageFinds [STAGE_FLIP4] += queues.size () - origHitCount;
237
242
origHitCount = queues.size ();
243
+
238
244
mutation.singleWalkingByte (save);
239
245
fuzzStat.stageFinds [STAGE_FLIP8] += queues.size () - origHitCount;
240
246
origHitCount = queues.size ();
247
+
241
248
mutation.twoWalkingByte (save);
242
249
fuzzStat.stageFinds [STAGE_FLIP16] += queues.size () - origHitCount;
243
250
origHitCount = queues.size ();
251
+
244
252
mutation.fourWalkingByte (save);
245
253
fuzzStat.stageFinds [STAGE_FLIP32] += queues.size () - origHitCount;
246
254
origHitCount = queues.size ();
255
+
247
256
mutation.singleArith (save);
248
257
fuzzStat.stageFinds [STAGE_ARITH8] += queues.size () - origHitCount;
249
258
origHitCount = queues.size ();
259
+
250
260
mutation.twoArith (save);
251
261
fuzzStat.stageFinds [STAGE_ARITH16] += queues.size () - origHitCount;
252
262
origHitCount = queues.size ();
263
+
253
264
mutation.fourArith (save);
254
265
fuzzStat.stageFinds [STAGE_ARITH32] += queues.size () - origHitCount;
255
266
origHitCount = queues.size ();
267
+
256
268
mutation.singleInterest (save);
257
269
fuzzStat.stageFinds [STAGE_INTEREST8] += queues.size () - origHitCount;
258
270
origHitCount = queues.size ();
271
+
259
272
mutation.twoInterest (save);
260
273
fuzzStat.stageFinds [STAGE_INTEREST16] += queues.size () - origHitCount;
261
274
origHitCount = queues.size ();
275
+
262
276
mutation.fourInterest (save);
263
277
fuzzStat.stageFinds [STAGE_INTEREST32] += queues.size () - origHitCount;
264
278
origHitCount = queues.size ();
279
+
265
280
mutation.overwriteWithDictionary (save);
266
281
fuzzStat.stageFinds [STAGE_EXTRAS_UO] += queues.size () - origHitCount;
267
282
origHitCount = queues.size ();
283
+
284
+ mutation.overwriteWithAddressDictionary (save);
285
+ fuzzStat.stageFinds [STAGE_EXTRAS_AO] += queues.size () - origHitCount;
286
+ origHitCount = queues.size ();
287
+
268
288
mutation.havoc (tracebits, save);
269
289
fuzzStat.stageFinds [STAGE_HAVOC] += queues.size () - origHitCount;
270
290
origHitCount = queues.size ();
291
+
271
292
queues[fuzzStat.idx ].wasFuzzed = true ;
272
293
} else {
273
294
mutation.havoc (tracebits, save);
0 commit comments