Skip to content

Commit 039f3cc

Browse files
committed
overflow
1 parent 35b9bb5 commit 039f3cc

File tree

7 files changed

+41
-5
lines changed

7 files changed

+41
-5
lines changed

libfuzzer/Fuzzer.cpp

+2-1
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,8 @@ void Fuzzer::showStats(Mutation mutation, OracleResult oracleResult) {
147147
printf(" " bH "\n");
148148
printf(bH " ");
149149
printfWithColor(oracleResult.integerOverflow, " Integer-Overflow");
150-
printf("%s" bH "\n", padStr(" ", 48).c_str());
150+
printfWithColor(oracleResult.integerUnderflow, " Integer-Underflow");
151+
printf("%s" bH "\n", padStr(" ", 30).c_str());
151152
printf(bBL bV50 bV5 bV2 bV20 bV2 bV2 bBR "\n");
152153
}
153154

libfuzzer/TargetContainer.cpp

+8-4
Original file line numberDiff line numberDiff line change
@@ -90,16 +90,20 @@ namespace fuzzer {
9090
inst == Instruction::NUMBER ||
9191
inst == Instruction::TIMESTAMP ||
9292
inst == Instruction::INVALID ||
93-
inst == Instruction::ADD
93+
inst == Instruction::ADD ||
94+
inst == Instruction::SUB
9495
) {
96+
vector<u256>::size_type stackSize = vm->stack().size();
97+
auto left = vm->stack()[stackSize - 1];
98+
auto right = vm->stack()[stackSize - 2];
9599
if (inst == Instruction::ADD) {
96-
vector<u256>::size_type stackSize = vm->stack().size();
97-
auto left = vm->stack()[stackSize - 1];
98-
auto right = vm->stack()[stackSize - 2];
99100
auto total256 = left + right;
100101
auto total512 = (u512) left + (u512) right;
101102
payload.isOverflow = total512 != total256;
102103
}
104+
if (inst == Instruction::SUB) {
105+
payload.isUnderflow = left < right;
106+
}
103107
oracleFactory->save(CallLogItem(ext->depth + 1, payload));
104108
}
105109
oracleFactory->log(CallLogItem(ext->depth + 1, payload));

liboracle/Common.h

+2
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ namespace fuzzer {
1616
bytes data;
1717
bytes code;
1818
bool isOverflow = false;
19+
bool isUnderflow = false;
1920
string noted = "";
2021
};
2122
struct CallLogItem {
@@ -33,6 +34,7 @@ namespace fuzzer {
3334
u256 reentrancy = 0;
3435
u256 freezingEther = 0;
3536
u256 integerOverflow = 0;
37+
u256 integerUnderflow = 0;
3638
};
3739

3840
using CallLogs = vector<vector<CallLogItem>>;

liboracle/IntegerUnderflow.cpp

+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
#include "IntegerUnderflow.h"
2+
3+
namespace fuzzer {
4+
bool IntegerUnderflow::analyze(CallLog callLog) {
5+
for (auto callLogItem : callLog) {
6+
auto isUnderflow = callLogItem.payload.isUnderflow;
7+
if (isUnderflow) return true;
8+
}
9+
return false;
10+
}
11+
}

liboracle/IntegerUnderflow.h

+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
#include <iostream>
2+
#include "Common.h"
3+
4+
using namespace dev;
5+
using namespace eth;
6+
using namespace std;
7+
8+
namespace fuzzer {
9+
class IntegerUnderflow : public Oracle {
10+
public:
11+
bool analyze(CallLog callLog);
12+
};
13+
}

liboracle/OracleFactory.cpp

+3
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,9 @@ namespace fuzzer {
5555
if (!oracleResult.integerOverflow) {
5656
oracleResult.integerOverflow += integerOverflow.analyze(callLog) ? 1 : 0;
5757
}
58+
if (!oracleResult.integerUnderflow) {
59+
oracleResult.integerUnderflow += integerUnderflow.analyze(callLog) ? 1 : 0;
60+
}
5861
if (!oracleResult.freezingEther) {
5962
oracleResult.freezingEther += freezingEther.analyze(callLog) ? 1 : 0;
6063
}

liboracle/OracleFactory.h

+2
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
#include "DangerDelegateCall.h"
99
#include "FreezingEther.h"
1010
#include "IntegerOverflow.h"
11+
#include "IntegerUnderflow.h"
1112

1213
using namespace dev;
1314
using namespace eth;
@@ -25,6 +26,7 @@ namespace fuzzer {
2526
DangerDelegateCall dangerDelegateCall;
2627
FreezingEther freezingEther;
2728
IntegerOverflow integerOverflow;
29+
IntegerUnderflow integerUnderflow;
2830
public:
2931
OracleResult oracleResult;
3032
OracleFactory();

0 commit comments

Comments
 (0)