mirror of
https://github.com/microsoft/onefuzz.git
synced 2025-06-15 11:28:09 +00:00
Fix MSVC Libfuzzer coverage reporting (#324)
This PR fixes two issues: - First, in MSVC compiled binaries both the LLVM _and_ MSVC symbols are present, but only the MSVC symbols have correct values. For example: ``` 0:000> cdb: Reading initial command '.scriptload DumpCountersOld.js ; !dumpcounters "cov" ; q' JavaScript script successfully loaded from 'DumpCountersOld.js' [+] not disabling sympath INFO: Seed: 58715679 INFO: Loaded 1 modules (3968 inline 8-bit counters): 3968 [00007FF70DB4B000, 00007FF70DB4BF80), # XXX Note xxx.exe: Running 1 inputs 1 time(s) each. Running: inp [+] processing xxx.exe [+] using LLVM 10 symbols - 0x7ff70db72b00:0x7ff70db72b08 # XXX These are wrong ``` This means the order we search for the coverage symbols is important. - Secondly, this enables support for MSVC 8bit counter coverage. ## Validation Steps Performed Running any recent MSVC compiled libfuzzer target should fail to actually collect coverage, instead just returning the 8 null bytes described in the linked issue.
This commit is contained in:
@ -20,15 +20,16 @@ function readU8Array(addr, len) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// For future research: Other tables of interest in MSVC 16.8
|
// For future research: Other tables of interest in MSVC 16.8
|
||||||
// _Sancov8bitUsed - __sancov$8bitCountersStart & __sancov$8bitCountersEnd
|
|
||||||
// _SancovPcGuardUsed - __sancov$TracePCGuardStart & __sancov$TracePCGuardEnd
|
// _SancovPcGuardUsed - __sancov$TracePCGuardStart & __sancov$TracePCGuardEnd
|
||||||
// _SancovPcTableUsed - __sancov$PCTableStart & __sancov$PCTableEnd
|
// _SancovPcTableUsed - __sancov$PCTableStart & __sancov$PCTableEnd
|
||||||
|
|
||||||
function findCounterSymbols(exe) {
|
function findCounterSymbols(exe) {
|
||||||
var symbols = [
|
var symbols = [
|
||||||
{ name: "LLVM 10", start: "__start___sancov_cntrs", end: "__stop___sancov_cntrs" },
|
{ name: "MSVC 16.8 bool flag", start: "__sancov$BoolFlagStart", end: "__sancov$BoolFlagEnd" },
|
||||||
{ name: "MSVC 16.8", start: "__sancov$BoolFlagStart", end: "__sancov$BoolFlagEnd" },
|
{ name: "MSVC 16.8 8bit counters", start: "__sancov$8bitCountersStart", end: "__sancov$8bitCountersEnd" },
|
||||||
{ name: "MSVC pre-16.8", start: "SancovBitmapStart", end: "SancovBitmapEnd" },
|
{ name: "MSVC pre-16.8", start: "SancovBitmapStart", end: "SancovBitmapEnd" },
|
||||||
|
// MSVC compiled libfuzzer targets _also_ include the LLVM symbols, so this needs to be checked after MSVC
|
||||||
|
{ name: "LLVM 10", start: "__start___sancov_cntrs", end: "__stop___sancov_cntrs" },
|
||||||
];
|
];
|
||||||
|
|
||||||
for (let entry of symbols) {
|
for (let entry of symbols) {
|
||||||
|
Reference in New Issue
Block a user