aboutsummaryrefslogtreecommitdiffstats
path: root/sys/linux/binfmt.txt
diff options
context:
space:
mode:
authorDmitry Vyukov <dvyukov@google.com>2018-04-02 20:10:48 +0200
committerDmitry Vyukov <dvyukov@google.com>2018-04-02 20:10:48 +0200
commit676bd07e7e80f8a270af7f0276443c68f4a99e25 (patch)
tree97d09aa6c4f6634165d8d12543ec83af7efb46e7 /sys/linux/binfmt.txt
parent3e679c51c03ac13a5b4b601873689925eda3cc16 (diff)
sys/linux: test various binfmt's in execve
Diffstat (limited to 'sys/linux/binfmt.txt')
-rw-r--r--sys/linux/binfmt.txt121
1 files changed, 121 insertions, 0 deletions
diff --git a/sys/linux/binfmt.txt b/sys/linux/binfmt.txt
new file mode 100644
index 000000000..3e86ab61a
--- /dev/null
+++ b/sys/linux/binfmt.txt
@@ -0,0 +1,121 @@
+# Copyright 2018 syzkaller project authors. All rights reserved.
+# Use of this source code is governed by Apache 2 LICENSE that can be found in the LICENSE file.
+
+include <uapi/linux/a.out.h>
+include <uapi/linux/elf.h>
+
+execve(file ptr[in, filename], argv ptr[in, array[ptr[in, string]]], envp ptr[in, array[ptr[in, string]]])
+execveat(dirfd fd_dir, file ptr[in, filename], argv ptr[in, array[ptr[in, string]]], envp ptr[in, array[ptr[in, string]]], flags flags[at_flags])
+
+write$binfmt_script(fd fd, data ptr[in, binfmt_script], len bytesize[data])
+write$binfmt_misc(fd fd, data ptr[in, binfmt_misc], len bytesize[data])
+write$binfmt_aout(fd fd, data ptr[in, binfmt_aout], len bytesize[data])
+write$binfmt_elf32(fd fd, data ptr[in, binfmt_elf32], len bytesize[data])
+write$binfmt_elf64(fd fd, data ptr[in, binfmt_elf64], len bytesize[data])
+
+binfmt_script {
+ hdr stringnoz["#! "]
+ bin stringnoz[filename]
+ args array[binfmt_script_arg]
+ nl const[0xa, int8]
+ data array[int8]
+} [packed]
+
+binfmt_script_arg {
+ sp const[0x20, int8]
+ arg stringnoz
+}
+
+binfmt_misc {
+ hdr stringnoz[binfmt_misc_headers]
+ data array[int8]
+}
+
+binfmt_misc_headers = "syz0", "syz1"
+
+binfmt_aout {
+ exec exec
+ data array[int8]
+# Just to make the file of a non-trivial size.
+ pad array[array[const[0, int64], 32], 0:10]
+} [packed]
+
+exec {
+ magic flags[aouthdr_magics, int16]
+ machtype int8
+ flags int8
+ a_text int32[0:1000]
+ a_data int32[0:1000]
+ a_bss int32
+ a_syms int32[0:1000]
+ a_entry int32
+ a_trsize const[0, int32]
+ a_drsize const[0, int32]
+}
+
+aouthdr_magics = OMAGIC, NMAGIC, ZMAGIC, QMAGIC
+
+type binfmt_elf32 binfmt_elf[int32, elf32_phdr, ELF32_PHDR_SIZE]
+type binfmt_elf64 binfmt_elf[int64, elf64_phdr, ELF64_PHDR_SIZE]
+
+type binfmt_elf[ADDR, PHDR, PHENTSIZE] {
+ hdr elf_hdr[ADDR, PHENTSIZE]
+ phdr array[PHDR, 1:2]
+ data array[int8]
+# Just to make the file of a non-trivial size.
+ pad array[array[const[0, int64], 32], 0:10]
+} [packed]
+
+type elf_hdr[ADDR, PHENTSIZE] {
+ e_ident0 const[0x7f, int8]
+ e_ident1 const[0x45, int8]
+ e_ident2 const[0x4c, int8]
+ e_ident3 const[0x46, int8]
+ e_ident_class int8
+ e_ident_data int8
+ e_ident_ver int8
+ e_ident_osabi int8
+ e_ident_pad int64
+ e_type flags[elf_types, int16]
+ e_machine flags[elf_machines, int16]
+ e_version int32
+ e_entry ADDR[0:1000]
+ e_phoff bytesize[parent, ADDR]
+ e_shoff ADDR[0:1000]
+ e_flags int32
+ e_ehsize int16
+ e_phentsize const[PHENTSIZE, int16]
+ e_phnum int16[1:2]
+ e_shentsize int16
+ e_shnum int16
+ e_shstrndx int16
+}
+
+elf32_phdr {
+ p_type flags[elf_ptypes, int32]
+ p_offset int32
+ p_vaddr int32
+ p_paddr int32
+ p_filesz int32
+ p_memsz int32
+ p_flags int32
+ p_align int32
+} [size[ELF32_PHDR_SIZE]]
+
+elf64_phdr {
+ p_type flags[elf_ptypes, int32]
+ p_flags int32
+ p_offset int64
+ p_vaddr int64
+ p_paddr int64
+ p_filesz int64
+ p_memsz int64
+ p_align int64
+} [size[ELF64_PHDR_SIZE]]
+
+elf_types = ET_EXEC, ET_DYN
+elf_machines = EM_386, EM_486, EM_X86_64
+elf_ptypes = PT_LOAD, PT_DYNAMIC, PT_INTERP, PT_NOTE, PT_SHLIB, PT_PHDR, PT_TLS, PT_LOOS, PT_LOPROC, PT_GNU_STACK
+
+define ELF32_PHDR_SIZE sizeof(struct elf32_phdr)
+define ELF64_PHDR_SIZE sizeof(struct elf64_phdr)