二 Syzkaller学习笔记---更新syz-manager(13)


/defs.h 示例:
// AUTOGENERATED FILEstruct call_attrs_t { uint64_t disabled;uint64_t timeout;uint64_t prog_timeout;uint64_t ignore_return;uint64_t breaks_returns;};struct call_props_t { int fail_nth;};#define read_call_props_t(var, reader) { \(var).fail_nth = (int)(reader); \}#if GOOS_akaros#define GOOS "akaros"#if GOARCH_amd64#define GOARCH "amd64"#define SYZ_REVISION "361c8bb8e04aa58189bcdd153dc08078d629c0b5"#define SYZ_EXECUTOR_USES_FORK_SERVER 1#define SYZ_EXECUTOR_USES_SHMEM 0#define SYZ_PAGE_SIZE 4096#define SYZ_NUM_PAGES 4096#define SYZ_DATA_OFFSET 536870912#endif#endif...#if GOOS_linux#define GOOS "linux"...#if GOARCH_amd64#define GOARCH "amd64"#define SYZ_REVISION "e61403f96ca19fc071d8e9c946b2259a2804c68e"#define SYZ_EXECUTOR_USES_FORK_SERVER 1#define SYZ_EXECUTOR_USES_SHMEM 1#define SYZ_PAGE_SIZE 4096#define SYZ_NUM_PAGES 4096#define SYZ_DATA_OFFSET 536870912#endif...#endif...#if GOOS_windows#define GOOS "windows"#if GOARCH_amd64#define GOARCH "amd64"#define SYZ_REVISION "8967babc353ed00daaa6992068d3044bad9d29fa"#define SYZ_EXECUTOR_USES_FORK_SERVER 0#define SYZ_EXECUTOR_USES_SHMEM 0#define SYZ_PAGE_SIZE 4096#define SYZ_NUM_PAGES 4096#define SYZ_DATA_OFFSET 536870912#endif#endif
模板
说明:/.h 下会存放着各个中所声明的名与 调用号的映射关系,以及可能有的。同时,也是使用宏定义来控制使用哪个OS哪个Arch下的映射关系 。
模板如下:
// nolint: lllvar syscallsTempl = template.Must(template.New("").Parse(`// AUTOGENERATED FILE// clang-format offz{{range $os := $.OSes}}#if GOOS_{{$os.GOOS}}{{range $arch := $os.Archs}}#if GOARCH_{{$arch.GOARCH}}const call_t syscalls[] = {{{range $c := $arch.Calls}}{"{{$c.Name}}", {{$c.NR}}{{if or $c.Attrs $c.NeedCall}}, { {{- range $attr := $c.Attrs}}{{$attr}}, {{end}}}{{end}}{{if $c.NeedCall}}, (syscall_t){{$c.CallName}}{{end}}},{{end}}};#endif{{end}}#endif{{end}}`))
/.h 示例:
...#if GOOS_linux...#if GOARCH_amd64const call_t syscalls[] = {{"accept", 43},{"accept$alg", 43},{"accept$ax25", 43},{"accept$inet", 43},{"accept$inet6", 43},{"accept$netrom", 43},{"accept$nfc_llcp", 43},....,{"bind", 49},{"bind$802154_dgram", 49},{"bind$802154_raw", 49},{"bind$alg", 49},{"bind$ax25", 49},{"bind$bt_hci", 49},{"bind$bt_l2cap", 49},....{"prctl$PR_CAPBSET_DROP", 167, {0, 0, 0, 1, 1, }},{"prctl$PR_CAPBSET_READ", 167, {0, 0, 0, 1, 1, }},{"prctl$PR_CAP_AMBIENT", 167, {0, 0, 0, 1, 1, }},....}#endif...#endif...
结构体
type SyscallData struct {NamestringCallName stringNRint32NeedCall boolAttrs[]uint64}
小结
当执行完 syz- 为每个文件生成一个常量映射表 .const 文件后,syz- 便会利用常量映射表,来彻底的解析源码,获取到其中声明的类型信息与参数依赖关系 。
当这些信息全都收集完毕后,syz- 便会将这些数据全部序列化为 go 文件,以供后续 syz- 所使用 。除此之外,syz- 还会创建 /defs.h 和 /.h,将部分信息导出至 C 头文件,以供后续 syz- 编译使用 。
简单地说,syz- 解析文件,并为 syz- 和 syz- 的编译运行做准备 。
参考
%%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90/
源码阅读笔记-2 前言
我们上一篇分析了syz- 和 syz-
用于解析,提取 和参数
syz- 用于解析常量
本次主要分析syz-
syz-
syz- 的功能 是 负责 各种的启动,HTTP,RPC,,调用fuzz 以及repro(可重现性的测试结果)的生成
我们在开始的 时候都是
./syz-manager -config=4.14.cfg -vv 10
参数 我们可以见安装的文章
{"target": "linux/amd64", //目标架构"http": "0.0.0.0:8080",//http的端口"workdir": "/home/test/go/src/github.com/google/syzkaller/bin/workdir",//syz-namager的工作目录"kernel_obj": "/home/test/桌面/cheche/kernel/linux-4.4.146/", //内核的目录,主要是去寻找vmlinux"image": "../image/stretch.img",//文件系统镜像"sshkey": "../image/stretch.id_rsa",//私钥"syzkaller": "/home/test/go/src/github.com/google/syzkaller",//syzkaller 的目录"disable_syscalls": ["keyctl", "add_key", "request_key"], // 禁用的系统调用列表"enable_syscalls": ["chmod"],//syzkaller使用的系统调用列表"suppressions": ["some known bug"],// 已知错误的正则表达式列表"procs": 1,// 每个VM中的并行测试进程数,一般是4或8"type": "qemu",// 要使用的虚拟机类型,例如qemu"vm": {// 特定VM类型相关的参数"count": 1,// 并行运行的VM数"kernel": "/home/test/桌面/cheche/kernel/linux-4.4.146/arch/x86/boot/bzImage",// 要测试的内核的bzImage文件的位置"cpu": 1,// 要在VM中模拟的CPU数"mem": 1024// VM的内存大小,以MB为单位}}