首页
社区
课程
招聘
[原创]syzkaller源码分析(一) syz-manager.go
发表于: 2021-6-20 17:19 9801

[原创]syzkaller源码分析(一) syz-manager.go

2021-6-20 17:19
9801

关于syzkaller的资料以安装居多,代码分析比较少,把自己的关于代码的理解稍微写一下,有理解错误的函数也请指正。下面内容主要就是syz-manager.go的主要流程,去掉了对核心流程不重要的部分以及具体实现,要是了解具体的实现还要去看源码。源码地址如下:https://github.com/google/syzkaller

md文件会附在最后

对syzkaller的简介可以去看 https://xz.aliyun.com/t/5079

syzkaller正常情况下都以syz-manager作为入口,syz-manager.go主要负责各种工作的启动(HTTP、RPC、dashboard等等)、调用fuzz以及repro的生成。

重点函数 minimizeCorpus()

重点函数repro.Run()

重点函数 ctx.repro

 
 
 
manager.go
 
func main() {
    RunManager(cfg)
}
 
func RunManager(cfg *mgrconfig.Config) {
    初始化: 文件 corpus.db &Manager HTTP RPC prometheus参数 dash
    go func() {
        log()
    }
 
    if *flagBench != ""  //bench: write execution statistics into this file periodically
        go func(){
            mgr.minimizeCorpus()
            写入文件
        }
 
    if mgr.dash != nil {
        go mgr.dashboardReporter()
    }
    mgr.vmLoop()
}
 
func (mgr *Manager) vmLoop() {
        启动instance
        初始化pendingRepro reproducing reproInstances
 
        //可以复现并且有剩余的instances
        for canRepro() && len(instances) >= instancesPerRepro {
            go func() {
                repro.Run()
            }
        }
 
        //没有可以复现的但是有剩余的instances
        for !canRepro() && len(instances) != 0 {
            go func(){
                //调用mgr.runInstanceInner;
                //mgr.runInstanceInner()调用了FuzzerCmd()启动fuzz; 有调用MonitorExecution()监控信息并返回Report对象
                //返回crash信息
                mgr.runInstance(idx)
            }
        }
        // 下面进行结果处理
        ...
    }
}
manager.go
 
func main() {
    RunManager(cfg)
}
 
func RunManager(cfg *mgrconfig.Config) {
    初始化: 文件 corpus.db &Manager HTTP RPC prometheus参数 dash
    go func() {
        log()
    }
 
    if *flagBench != ""  //bench: write execution statistics into this file periodically
        go func(){
            mgr.minimizeCorpus()
            写入文件
        }
 
    if mgr.dash != nil {
        go mgr.dashboardReporter()
    }
    mgr.vmLoop()
}
 
func (mgr *Manager) vmLoop() {
        启动instance
        初始化pendingRepro reproducing reproInstances
 
        //可以复现并且有剩余的instances
        for canRepro() && len(instances) >= instancesPerRepro {
            go func() {
                repro.Run()
            }
        }
 
        //没有可以复现的但是有剩余的instances
        for !canRepro() && len(instances) != 0 {
            go func(){
                //调用mgr.runInstanceInner;
                //mgr.runInstanceInner()调用了FuzzerCmd()启动fuzz; 有调用MonitorExecution()监控信息并返回Report对象
                //返回crash信息
                mgr.runInstance(idx)
            }
        }
        // 下面进行结果处理
        ...
    }
}
func (mgr *Manager) minimizeCorpus() {
    ...
 
    //返回的signal有elemType相同的,取其中prio最高的
    for _, ctx := range signal.Minimize(inputs) {
        ...
    }
    ...
 
    //为了防止出现corpus explosion,需要统计call的cov和count情况
    for call, info := range mgr.collectSyscallInfoUnlocked() {
        if 出现corpus explosion情况
            mgr.saturatedCalls[call] = true
    }
    写回db.filename
}
func (mgr *Manager) minimizeCorpus() {
    ...
 
    //返回的signal有elemType相同的,取其中prio最高的
    for _, ctx := range signal.Minimize(inputs) {
        ...
    }
    ...
 
    //为了防止出现corpus explosion,需要统计call的cov和count情况
    for call, info := range mgr.collectSyscallInfoUnlocked() {
        if 出现corpus explosion情况
            mgr.saturatedCalls[call] = true
    }
    写回db.filename

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

上传的附件:
收藏
免费 2
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//