syzkaller--->syscalldescription语法
syzkaller
Syzkaller具有豐富的官方文檔,其中包括以下幾個(gè)方面:
使用Syzkaller的介紹:這部分介紹了如何安裝和配置Syzkaller,并提供了詳細(xì)的操作手冊(cè)。該文檔還介紹了如何運(yùn)行Syzkaller的示例和常用的測(cè)試命令。
Syzkaller測(cè)試策略:該文檔介紹了Syzkaller使用的測(cè)試策略,包括隨機(jī)測(cè)試策略、覆蓋率優(yōu)化策略、死鎖檢測(cè)策略等。該文檔詳細(xì)介紹了不同策略的原理和使用方法,并提供了配置樣例。
Syzkaller規(guī)則系統(tǒng):Syzkaller的規(guī)則系統(tǒng)是生成系統(tǒng)調(diào)用序列的重要部分。該文檔介紹了規(guī)則系統(tǒng)的結(jié)構(gòu)和機(jī)制,演示了如何編寫自定義規(guī)則,以及如何將規(guī)則集成到測(cè)試過(guò)程中。
錯(cuò)誤報(bào)告和調(diào)試:Syzkaller在測(cè)試過(guò)程中會(huì)抓取內(nèi)核崩潰信息,并生成詳細(xì)的錯(cuò)誤報(bào)告。該文檔介紹了如何解析錯(cuò)誤報(bào)告和定位問題。此外,該文檔還介紹了Syzkaller內(nèi)置的調(diào)試和分析工具的使用方法。
Syzkaller開發(fā):該文檔介紹了Syzkaller源代碼結(jié)構(gòu)、API接口、擴(kuò)展點(diǎn)和開發(fā)工具鏈。該文檔還提供了一些常見擴(kuò)展和案例,如如何增加系統(tǒng)調(diào)用支持、如何自定義fuzzer策略等。
所有官方文檔均可在Syzkaller GitHub倉(cāng)庫(kù)的doc目錄下找到,并提供了詳細(xì)的使用說(shuō)明。此外,Syzkaller的官方網(wǎng)站還提供了社區(qū)支持論壇、Bug報(bào)告頁(yè)面、GitHub Issue等多種支持方式。
本身是個(gè)較強(qiáng)大的fuzz工具,使用方法較簡(jiǎn)單, syz-manager -config my.cfg
但難點(diǎn)是編輯特異性的語(yǔ)法魔板,用于特定模塊和系統(tǒng)調(diào)用的fuzz。
公開git上已經(jīng)包含了說(shuō)明,但感覺比較晦澀,先按字面意思理一下
syscall_descriptions_syntax.md
- 文本1
syscall_descriptions_syntax.md
上來(lái)先定義了一套怪異的語(yǔ)法規(guī)則,和一般的程序不太一樣,光看文字有點(diǎn)不明吧,對(duì)照binfmt.txt文本來(lái)大致猜測(cè)了下。
- 文本2
/sys/linux/binfmt.txt
文本2用來(lái)描述fuzz系統(tǒng)調(diào)用的原則,file ptr[in, filename] 描述了參數(shù)名字文件,屬于指針,輸入類型,文件名類型
argv ptr[in, array[ptr[in, string]] 描述了指針類型的參數(shù), 指針指向數(shù)組指針, 數(shù)組指針包含一些字符串。
len bytesize[data]描述 了data的長(zhǎng)度。
其他參數(shù)類似。
總之參數(shù)定義完成后就是變異參數(shù)fuzz內(nèi)核的過(guò)程,參數(shù)定義還可包含復(fù)雜的結(jié)構(gòu)體,可以自行查看sys/linux目錄下的各種文檔。
syscallname 包含兩種形式,一種直接調(diào)用,類似execve這種,另一種 write$binfmt_script 對(duì)特定數(shù)據(jù)的系統(tǒng)調(diào)用,估計(jì)給每個(gè)調(diào)用起了新的名字。
總之,核心就是給系統(tǒng)調(diào)用設(shè)置各種參數(shù), argv ptr[in, array[ptr[in, string]]] ,這種。約束了參數(shù)后,對(duì)系統(tǒng)調(diào)用的fuzz就是有針對(duì)性的。
常見數(shù)據(jù)類型
對(duì)類型作一些解釋,intN標(biāo)識(shí)多少位的整型,還有一些根據(jù)名字可以猜到大概。說(shuō)一些不太明白的。
- “flags”: a set of values, type-options:
reference to flags description (see below), underlying int type (e.g. “int32”)
定義的一系列選項(xiàng),估計(jì)是宏定義啥的
-
“glob”: glob pattern to match on the target files, type-options:
a pattern string in quotes (syntax: https://golang.org/pkg/path/filepath/#Match)
(e.g. “/sys/” or “/sys/**/*”),
類似正則匹配的東西應(yīng)該 -
“proc”: per process int (see description below), type-options:
value range start, how many values per process, underlying type
這個(gè)其實(shí)有點(diǎn)疑問,但是例子中大部分用法都是這樣:
類似調(diào)用號(hào),不過(guò)我感覺應(yīng)該這兩個(gè)proc好像代表的意思不太一樣,
type signalno int32[0:65]
type net_port proc[20000, 4, int16be]
這里應(yīng)該是正解,代表了一系列的以4為步長(zhǎng)的整形變量。
foo(a const[10], b const[-10]) foo(a const[0xabcd]) foo(a int8['a':'z']) foo(a const[PATH_MAX]) foo(a ptr[in, array[int8, MY_PATH_MAX]]) define MY_PATH_MAX PATH_MAX + 2還有這個(gè),應(yīng)該都是參數(shù)變異的依據(jù)。
- “text”: machine code of the specified type, type-options:
text type (x86_real, x86_16, x86_32, x86_64, arm64)
使用
編寫完文本后就是生成對(duì)應(yīng)的fuzz工具,
$ bin/syz-extract -os linux -arch amd64 -sourcedir /home/fanrong/Computer/kernel/linux-5.1 proc_operation.txt $ bin/syz-sysgen $ make clean $ make all最后啟動(dòng)fuzz
備注(一些例子收集)
cgroup_freezer_states = "THAWED", "FREEZING", "FROZEN" openat$cgroup_freezer_state(fd fd_cgroup, file ptr[in, string["freezer.state"]], flags const[O_RDWR], mode const[0]) fd_cgroup_freezer_state write$cgroup_freezer_state(fd fd_cgroup_freezer_state, buf ptr[in, string[cgroup_freezer_states]], len bytesize[buf]) # devices (.allow, .deny) cgroup_devices_files = "devices.allow", "devices.deny"# device types: (a)ll, (c)har, (b)lock cgroup_devices_type = "a", "c", "b"# access: (r)ead, (w)rite, (m)knod, or a combination of them cgroup_devices_access = "r", "w", "m", "rw", "rm", "wm", "rwm"# TODO: device_major_minor is in form MAJOR:MINOR, where '*' is used for all. # It is non-trivial to describe valid MAJOR:MINOR as MAJOR takes values from # a wide range while not all such devices might exist in the system. cgroup_devices_towrite {dev stringnoz[cgroup_devices_type]device_major_minor stringnoz[" *:* "]access string[cgroup_devices_access] } [packed]openat$cgroup_devices(fd fd_cgroup, file ptr[in, string[cgroup_devices_files]], flags const[O_RDWR], mode const[0]) fd_cgroup_devices write$cgroup_devices(fd fd_cgroup_devices, buf ptr[in, cgroup_devices_towrite], len bytesize[buf])總結(jié)
以上是生活随笔為你收集整理的syzkaller--->syscalldescription语法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: TortoiseSVN 如何去掉文件夹
- 下一篇: Hie with the Pie(Flo