0


syzkaller中rawCover输出为空

rawCover输出为空的问题。
image.png
修改源码的pkg/mgrconfig/load.go文件
添加 RawCover:true,
image.png
编译后输出

newInput%v

callName: shmctl$SHM_INFO
info.cover:map[18446744071579356530:{} 18446744071579356579:{} 18446744071579356628:{} 18446744071579850789:{} 18446744071579854854:{} 18446744071579854904:{} 18446744071579854938:{} 18446744071579854957:{} 18446744071579855038:{} 18446744071579856433:{} 18446744071579856494:{} 18446744071593296320:{} 18446744071619603899:{} 18446744071620790990:{}]
info.rawCover:[18446744071581553039 18446744071579356628 18446744071579356579 。。。 18446744071579863355 18446744071579850789]
添加新的条目
Raw cover:[18446744071581553039 18446744071579356628 18446744071579356579 18446744071579356530 18446744071590616553 18446744071590616813 。。。 18446744071584161785 18446744071583501361 18446744071583501254 18446744071579863355 18446744071579850789]
prog%v

安装syz-cover
GOOS=linux GOARCH=amd64 go build -ldflags="-s -w" -o ./bin/syz-cover github.com/google/syzkaller/tools/syz-cover
获取正在运行的syzkaller覆盖到的数据信息rawcover

wget http://127.0.0.1:56745/rawcover

将原始覆盖数据输入 syz-cover 以生成覆盖报告:
./bin/syz-cover --config <location of your syzkaller config> rawcover
导出包含函数覆盖范围的 CSV 文件
./bin/syz-cover --config <location of your syzkaller config> --csv <filename where to export> rawcover
导出包含行覆盖率信息的 JSON 文件:
./bin/syz-cover --config <location of your syzkaller config> --json <filename where to export> rawcover
使用旧版syzkaller来解析rawcover文件
输出的是行号
image.png
使用addr2line

addr2line -e ~/source/kernel/linux-5.4/vmlinux -f -p < rawcover

修改代码输出16进制的rawcover
pkg/fuzz/job.gofmt.Println("info.rawCover:")
for _, value := range info.rawCover {
fmt.Printf("%#x\n", value)
}
fmt.Println("info.rawCover end")
//修改结束
写go代码自动读取地址调用addr2line转换为内核源码行
go代码 addr2line.go

package main

import (
    "bufio"
    "fmt"
    "os"
    "os/exec"
    "regexp"
)

func main() {
    // 检查是否传递了正确数量的命令行参数
    if len(os.Args) != 3 {
       fmt.Println("Usage: program <file_path> <vmlinux_path>")
       return
    }

   // 获取命令行参数
    filePath := os.Args[1]
    vmlinuxPath := os.Args[2]

   // 打开文件
    file, err := os.Open(filePath)
    if err != nil {
       fmt.Println("Error opening file:", err)
       return
    }
    defer file.Close()

   // 定义正则表达式来匹配16进制地址
    hexPattern := regexp.MustCompile(`^0x[0-9a-fA-F]+$`)

   // 创建文件扫描器逐行读取
    scanner := bufio.NewScanner(file)
    for scanner.Scan() {
       line := scanner.Text()

      // 判断是否是16进制地址
       if hexPattern.MatchString(line) {
          // 调用 addr2line 处理16进制地址
          fmt.Printf("Processing hex: %s\n", line)
          processHexAddress(line, vmlinuxPath)
       } else {
          // 直接打印非16进制数据
          fmt.Println(line)
       }
    }

   if err := scanner.Err(); err != nil {
       fmt.Println("Error reading file:", err)
    }
}

func processHexAddress(hexAddress, vmlinuxPath string) {
    // 调用 addr2line 并将结果输出
    cmd := exec.Command("addr2line", "-e", vmlinuxPath, "-f", "-p", hexAddress)
    output, err := cmd.Output()
    if err != nil {
       fmt.Printf("Error running addr2line: %v\n", err)
       return
    }
    fmt.Println(string(output))
}

go build addr2line.go

root@b21bd46e7d4a:/work# ./addr2line 5-11.log source/kernel/linux-5.11/vmlinux > 5-11efp.log

./addr2line 5-11.log source/kernel/linux-5.11/vmlinux > 5-11efp.log

标签: go 安全

本文转载自: https://blog.csdn.net/m0_46618326/article/details/141131493
版权归原作者 m0_46618326 所有, 如有侵权,请联系我们删除。

“syzkaller中rawCover输出为空”的评论:

还没有评论