# 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)