From a0717aa661c0b04d5f73879b265da4da05756630 Mon Sep 17 00:00:00 2001 From: Yan Date: Thu, 11 May 2017 12:20:00 -0400 Subject: [PATCH] Syscall table rework (#245) * Script for generating syscall tables from Linux src (pulled from kernel.org) * Add generated syscall table * Update syscall names to match extracted entries * Move to new syscall dispatcher * Add machine def to x86 cpus --- manticore/core/cpu/x86.py | 2 + manticore/platforms/linux.py | 147 +--- manticore/platforms/linux_syscalls.py | 1092 +++++++++++++++++++++++++ scripts/extract_syscalls.py | 60 ++ 4 files changed, 1173 insertions(+), 128 deletions(-) create mode 100644 manticore/platforms/linux_syscalls.py create mode 100755 scripts/extract_syscalls.py diff --git a/manticore/core/cpu/x86.py b/manticore/core/cpu/x86.py index 7eb63e6..74e84ca 100644 --- a/manticore/core/cpu/x86.py +++ b/manticore/core/cpu/x86.py @@ -5723,6 +5723,7 @@ class AMD64Cpu(X86Cpu): #Config max_instr_width = 15 address_bit_size = 64 + machine = 'amd64' arch = CS_ARCH_X86 mode = CS_MODE_64 @@ -5830,6 +5831,7 @@ class I386Cpu(X86Cpu): #Config max_instr_width = 15 address_bit_size = 32 + machine = 'i386' arch = CS_ARCH_X86 mode = CS_MODE_32 diff --git a/manticore/platforms/linux.py b/manticore/platforms/linux.py index e7d5996..e98d68c 100644 --- a/manticore/platforms/linux.py +++ b/manticore/platforms/linux.py @@ -15,6 +15,7 @@ import logging import random from ..core.cpu.arm import * from ..core.executor import SyscallNotImplemented, ProcessExit +from . import linux_syscalls logger = logging.getLogger("PLATFORM") @@ -1076,7 +1077,7 @@ class Linux(Platform): else: return -1 - def sys_uname(self, old_utsname): + def sys_newuname(self, old_utsname): ''' Writes system information in the variable C{old_utsname}. :rtype: int @@ -1093,7 +1094,7 @@ class Linux(Platform): uname += pad('x86_64') uname += pad('(none)') self.current.write_bytes(old_utsname, uname) - logger.debug("sys_uname(...) -> %s", uname) + logger.debug("sys_newuname(...) -> %s", uname) return 0 def sys_brk(self, brk): @@ -1336,7 +1337,7 @@ class Linux(Platform): total+=size return total - def sys_set_thread_area32(self, user_info): + def sys_set_thread_area(self, user_info): ''' Sets a thread local storage (TLS) area. Sets the base address of the GS segment. :rtype: int @@ -1432,121 +1433,19 @@ class Linux(Platform): #Distpatchers... def syscall(self): ''' - 64 bit dispatcher. + Syscall dispatcher. ''' - syscalls = { - 0x0000000000000008: self.sys_lseek, - 0x000000000000000c: self.sys_brk, - 0x000000000000000e: self.sys_sigprocmask, - 0x000000000000009e: self.sys_arch_prctl, - 0x0000000000000002: self.sys_open, - 0x0000000000000000: self.sys_read, - 0x0000000000000003: self.sys_close, - 0x0000000000000005: self.sys_fstat64, - 0x0000000000000009: self.sys_mmap, - 0x0000000000000001: self.sys_write, - 0x0000000000000010: self.sys_ioctl, - 0x0000000000000027: self.sys_getpid, - 0x000000000000003e: self.sys_kill, - 0x0000000000000065: self.sys_ptrace, - 0x0000000000000066: self.sys_getuid, - 0x0000000000000068: self.sys_getgid, - 0x000000000000006b: self.sys_geteuid, - 0x000000000000006c: self.sys_getegid, - 0x00000000000000e7: self.sys_exit_group, - 0x0000000000000015: self.sys_access, - 0x000000000000000a: self.sys_mprotect, - 0x000000000000000b: self.sys_munmap, - 0x0000000000000013: self.sys_readv, - 0x0000000000000014: self.sys_writev, - 0x0000000000000004: self.sys_stat64, - 0x0000000000000059: self.sys_acct, - 0x0000000000000023: self.sys_nanosleep, -# 0x0000000000000029: self.sys_socket, -# 0x000000000000002a: self.sys_connect, -# 0x000000000000002b: self.sys_accept, -# 0x000000000000002c: self.sys_sendto, -# 0x000000000000002d: self.sys_recvfrom, -# 0x000000000000002e: self.sys_sendmsg, -# 0x000000000000002f: self.sys_recvmsg, -# 0x0000000000000030: self.sys_shutdown, -# 0x0000000000000031: self.sys_bind, -# 0x0000000000000032: self.sys_listen, -# 0x0000000000000033: self.sys_getsockname, -# 0x0000000000000034: self.sys_getpeername, -# 0x0000000000000035: self.sys_socketpair, -# 0x0000000000000036: self.sys_setsockopt, -# 0x0000000000000037: self.sys_getsockopt, - 0x000000000000003f: self.sys_uname, - 0x00000000000000c9: self.sys_time, - 0x00000000000000da: self.sys_set_tid_address, - 0x000000000000010d: self.sys_faccessat, - 0x0000000000000111: self.sys_set_robust_list, - 0x00000000000000ca: self.sys_futex, - 0x000000000000000d: self.sys_sigaction, - 0x0000000000000060: self.sys_gettimeofday, - 0x0000000000000061: self.sys_getrlimit, - 0x00000000000000dd: self.sys_fadvise64, - 0x00000000000000e4: self.sys_clock_gettime, - - - } index = self._syscall_abi.syscall_number() - if index not in syscalls: - raise SyscallNotImplemented(64, index) + try: + table = getattr(linux_syscalls, self.current.machine) + name = table[index] + implementation = getattr(self, name) + except AttributeError: + raise SyscallNotImplemented(self.current.address_bit_size, index) - return self._syscall_abi.invoke(syscalls[index]) - - - def int80(self): - ''' - 32 bit dispatcher. - ''' - syscalls = { 0x00000001: self.sys_exit_group, - 0x00000003: self.sys_read, - 0x00000004: self.sys_write, - 0x00000005: self.sys_open, - 0x00000006: self.sys_close, - 0x00000021: self.sys_access, - 0x00000025: self.sys_kill, - 0x0000002d: self.sys_brk, - 0x00000036: self.sys_ioctl, - 0x0000004e: self.sys_gettimeofday, - 0x00000055: self.sys_readlink, - 0x00000059: self.sys_acct, - 0x0000005b: self.sys_munmap, - 0x0000007a: self.sys_uname, - 0x0000007d: self.sys_mprotect, - 0x0000008c: self.sys_setpriority, - 0x0000008d: self.sys_getpriority, - 0x00000091: self.sys_readv, - 0x00000092: self.sys_writev, - 0x000000c0: self.sys_mmap2, - 0x000000c3: self.sys_stat32, - 0x000000c5: self.sys_fstat, - 0x000000c7: self.sys_getuid, - 0x000000c8: self.sys_getgid, - 0x000000c9: self.sys_geteuid, - 0x000000ca: self.sys_getegid, - 0x000000f3: self.sys_set_thread_area32, - 0x000000fc: self.sys_exit_group, - 0x000000ae: self.sys_sigaction, - 0x000000f8: self.sys_exit_group, # XXX -# 0x00000066: self.sys_socketcall, -# 0x000000dd: self.sys_fcntl64, - 0x0000000d: self.sys_time, - 0x00000014: self.sys_getpid, - 0x000f0005: self.sys_ARM_NR_set_tls, - } - - index = self._syscall_abi.syscall_number() - - if index not in syscalls: - raise SyscallNotImplemented(64, index) - - return self._syscall_abi.invoke(syscalls[index]) + return self._syscall_abi.invoke(implementation) def sys_clock_gettime(self, clock_id, timespec): logger.info("sys_clock_time not really implemented") @@ -1686,12 +1585,7 @@ class Linux(Platform): if self.clocks % 10000 == 0: self.check_timers() self.sched() - except Interruption, e: - try: - syscallret = self.int80() - except RestartSyscall: - pass - except Syscall, e: + except (Interruption, Syscall) as e: try: syscallret = self.syscall() except RestartSyscall: @@ -1703,6 +1597,12 @@ class Linux(Platform): #64bit syscalls + def sys_newfstat(self, fd, buf): + ''' + Wrapper for fstat64() + ''' + return self.sys_fstat64(fd, buf) + def sys_fstat64(self, fd, buf): ''' Determines information about a file based on its file descriptor (for Linux 64 bits). @@ -1877,15 +1777,6 @@ class SLinux(Linux): reg_name = self.syscall_arg_regs[e.reg_num] raise ConcretizeRegister(reg_name,e.message,e.policy) - def int80(self): - try: - return super(SLinux, self).int80() - except SymbolicSyscallArgument, e: - self.current.PC = self.current.PC - self.current.instruction.size - reg_name = self.syscall_arg_regs[e.reg_num] - raise ConcretizeRegister(reg_name,e.message,e.policy) - - def sys_read(self, fd, buf, count): if issymbolic(fd): logger.debug("Ask to read from a symbolic file descriptor!!") diff --git a/manticore/platforms/linux_syscalls.py b/manticore/platforms/linux_syscalls.py new file mode 100644 index 0000000..6c8ffc1 --- /dev/null +++ b/manticore/platforms/linux_syscalls.py @@ -0,0 +1,1092 @@ +# +# +# AUTOGENERATED, DO NOT EDIT +# +# From version: 4.11.0 +# + +i386 = { + 0: "sys_restart_syscall", + 1: "sys_exit", + 2: "sys_fork", + 3: "sys_read", + 4: "sys_write", + 5: "sys_open", + 6: "sys_close", + 7: "sys_waitpid", + 8: "sys_creat", + 9: "sys_link", + 10: "sys_unlink", + 11: "sys_execve", + 12: "sys_chdir", + 13: "sys_time", + 14: "sys_mknod", + 15: "sys_chmod", + 16: "sys_lchown16", + 18: "sys_stat", + 19: "sys_lseek", + 20: "sys_getpid", + 21: "sys_mount", + 22: "sys_oldumount", + 23: "sys_setuid16", + 24: "sys_getuid16", + 25: "sys_stime", + 26: "sys_ptrace", + 27: "sys_alarm", + 28: "sys_fstat", + 29: "sys_pause", + 30: "sys_utime", + 33: "sys_access", + 34: "sys_nice", + 36: "sys_sync", + 37: "sys_kill", + 38: "sys_rename", + 39: "sys_mkdir", + 40: "sys_rmdir", + 41: "sys_dup", + 42: "sys_pipe", + 43: "sys_times", + 45: "sys_brk", + 46: "sys_setgid16", + 47: "sys_getgid16", + 48: "sys_signal", + 49: "sys_geteuid16", + 50: "sys_getegid16", + 51: "sys_acct", + 52: "sys_umount", + 54: "sys_ioctl", + 55: "sys_fcntl", + 57: "sys_setpgid", + 59: "sys_olduname", + 60: "sys_umask", + 61: "sys_chroot", + 62: "sys_ustat", + 63: "sys_dup2", + 64: "sys_getppid", + 65: "sys_getpgrp", + 66: "sys_setsid", + 67: "sys_sigaction", + 68: "sys_sgetmask", + 69: "sys_ssetmask", + 70: "sys_setreuid16", + 71: "sys_setregid16", + 72: "sys_sigsuspend", + 73: "sys_sigpending", + 74: "sys_sethostname", + 75: "sys_setrlimit", + 76: "sys_old_getrlimit", + 77: "sys_getrusage", + 78: "sys_gettimeofday", + 79: "sys_settimeofday", + 80: "sys_getgroups16", + 81: "sys_setgroups16", + 82: "sys_old_select", + 83: "sys_symlink", + 84: "sys_lstat", + 85: "sys_readlink", + 86: "sys_uselib", + 87: "sys_swapon", + 88: "sys_reboot", + 89: "sys_old_readdir", + 90: "sys_old_mmap", + 91: "sys_munmap", + 92: "sys_truncate", + 93: "sys_ftruncate", + 94: "sys_fchmod", + 95: "sys_fchown16", + 96: "sys_getpriority", + 97: "sys_setpriority", + 99: "sys_statfs", + 100: "sys_fstatfs", + 101: "sys_ioperm", + 102: "sys_socketcall", + 103: "sys_syslog", + 104: "sys_setitimer", + 105: "sys_getitimer", + 106: "sys_newstat", + 107: "sys_newlstat", + 108: "sys_newfstat", + 109: "sys_uname", + 110: "sys_iopl", + 111: "sys_vhangup", + 113: "sys_vm86old", + 114: "sys_wait4", + 115: "sys_swapoff", + 116: "sys_sysinfo", + 117: "sys_ipc", + 118: "sys_fsync", + 119: "sys_sigreturn", + 120: "sys_clone", + 121: "sys_setdomainname", + 122: "sys_newuname", + 123: "sys_modify_ldt", + 124: "sys_adjtimex", + 125: "sys_mprotect", + 126: "sys_sigprocmask", + 128: "sys_init_module", + 129: "sys_delete_module", + 131: "sys_quotactl", + 132: "sys_getpgid", + 133: "sys_fchdir", + 134: "sys_bdflush", + 135: "sys_sysfs", + 136: "sys_personality", + 138: "sys_setfsuid16", + 139: "sys_setfsgid16", + 140: "sys_llseek", + 141: "sys_getdents", + 142: "sys_select", + 143: "sys_flock", + 144: "sys_msync", + 145: "sys_readv", + 146: "sys_writev", + 147: "sys_getsid", + 148: "sys_fdatasync", + 149: "sys_sysctl", + 150: "sys_mlock", + 151: "sys_munlock", + 152: "sys_mlockall", + 153: "sys_munlockall", + 154: "sys_sched_setparam", + 155: "sys_sched_getparam", + 156: "sys_sched_setscheduler", + 157: "sys_sched_getscheduler", + 158: "sys_sched_yield", + 159: "sys_sched_get_priority_max", + 160: "sys_sched_get_priority_min", + 161: "sys_sched_rr_get_interval", + 162: "sys_nanosleep", + 163: "sys_mremap", + 164: "sys_setresuid16", + 165: "sys_getresuid16", + 166: "sys_vm86", + 168: "sys_poll", + 170: "sys_setresgid16", + 171: "sys_getresgid16", + 172: "sys_prctl", + 173: "sys_rt_sigreturn", + 174: "sys_rt_sigaction", + 175: "sys_rt_sigprocmask", + 176: "sys_rt_sigpending", + 177: "sys_rt_sigtimedwait", + 178: "sys_rt_sigqueueinfo", + 179: "sys_rt_sigsuspend", + 180: "sys_pread64", + 181: "sys_pwrite64", + 182: "sys_chown16", + 183: "sys_getcwd", + 184: "sys_capget", + 185: "sys_capset", + 186: "sys_sigaltstack", + 187: "sys_sendfile", + 190: "sys_vfork", + 191: "sys_getrlimit", + 192: "sys_mmap_pgoff", + 193: "sys_truncate64", + 194: "sys_ftruncate64", + 195: "sys_stat64", + 196: "sys_lstat64", + 197: "sys_fstat64", + 198: "sys_lchown", + 199: "sys_getuid", + 200: "sys_getgid", + 201: "sys_geteuid", + 202: "sys_getegid", + 203: "sys_setreuid", + 204: "sys_setregid", + 205: "sys_getgroups", + 206: "sys_setgroups", + 207: "sys_fchown", + 208: "sys_setresuid", + 209: "sys_getresuid", + 210: "sys_setresgid", + 211: "sys_getresgid", + 212: "sys_chown", + 213: "sys_setuid", + 214: "sys_setgid", + 215: "sys_setfsuid", + 216: "sys_setfsgid", + 217: "sys_pivot_root", + 218: "sys_mincore", + 219: "sys_madvise", + 220: "sys_getdents64", + 221: "sys_fcntl64", + 224: "sys_gettid", + 225: "sys_readahead", + 226: "sys_setxattr", + 227: "sys_lsetxattr", + 228: "sys_fsetxattr", + 229: "sys_getxattr", + 230: "sys_lgetxattr", + 231: "sys_fgetxattr", + 232: "sys_listxattr", + 233: "sys_llistxattr", + 234: "sys_flistxattr", + 235: "sys_removexattr", + 236: "sys_lremovexattr", + 237: "sys_fremovexattr", + 238: "sys_tkill", + 239: "sys_sendfile64", + 240: "sys_futex", + 241: "sys_sched_setaffinity", + 242: "sys_sched_getaffinity", + 243: "sys_set_thread_area", + 244: "sys_get_thread_area", + 245: "sys_io_setup", + 246: "sys_io_destroy", + 247: "sys_io_getevents", + 248: "sys_io_submit", + 249: "sys_io_cancel", + 250: "sys_fadvise64", + 252: "sys_exit_group", + 253: "sys_lookup_dcookie", + 254: "sys_epoll_create", + 255: "sys_epoll_ctl", + 256: "sys_epoll_wait", + 257: "sys_remap_file_pages", + 258: "sys_set_tid_address", + 259: "sys_timer_create", + 260: "sys_timer_settime", + 261: "sys_timer_gettime", + 262: "sys_timer_getoverrun", + 263: "sys_timer_delete", + 264: "sys_clock_settime", + 265: "sys_clock_gettime", + 266: "sys_clock_getres", + 267: "sys_clock_nanosleep", + 268: "sys_statfs64", + 269: "sys_fstatfs64", + 270: "sys_tgkill", + 271: "sys_utimes", + 272: "sys_fadvise64_64", + 274: "sys_mbind", + 275: "sys_get_mempolicy", + 276: "sys_set_mempolicy", + 277: "sys_mq_open", + 278: "sys_mq_unlink", + 279: "sys_mq_timedsend", + 280: "sys_mq_timedreceive", + 281: "sys_mq_notify", + 282: "sys_mq_getsetattr", + 283: "sys_kexec_load", + 284: "sys_waitid", + 286: "sys_add_key", + 287: "sys_request_key", + 288: "sys_keyctl", + 289: "sys_ioprio_set", + 290: "sys_ioprio_get", + 291: "sys_inotify_init", + 292: "sys_inotify_add_watch", + 293: "sys_inotify_rm_watch", + 294: "sys_migrate_pages", + 295: "sys_openat", + 296: "sys_mkdirat", + 297: "sys_mknodat", + 298: "sys_fchownat", + 299: "sys_futimesat", + 300: "sys_fstatat64", + 301: "sys_unlinkat", + 302: "sys_renameat", + 303: "sys_linkat", + 304: "sys_symlinkat", + 305: "sys_readlinkat", + 306: "sys_fchmodat", + 307: "sys_faccessat", + 308: "sys_pselect6", + 309: "sys_ppoll", + 310: "sys_unshare", + 311: "sys_set_robust_list", + 312: "sys_get_robust_list", + 313: "sys_splice", + 314: "sys_sync_file_range", + 315: "sys_tee", + 316: "sys_vmsplice", + 317: "sys_move_pages", + 318: "sys_getcpu", + 319: "sys_epoll_pwait", + 320: "sys_utimensat", + 321: "sys_signalfd", + 322: "sys_timerfd_create", + 323: "sys_eventfd", + 324: "sys_fallocate", + 325: "sys_timerfd_settime", + 326: "sys_timerfd_gettime", + 327: "sys_signalfd4", + 328: "sys_eventfd2", + 329: "sys_epoll_create1", + 330: "sys_dup3", + 331: "sys_pipe2", + 332: "sys_inotify_init1", + 333: "sys_preadv", + 334: "sys_pwritev", + 335: "sys_rt_tgsigqueueinfo", + 336: "sys_perf_event_open", + 337: "sys_recvmmsg", + 338: "sys_fanotify_init", + 339: "sys_fanotify_mark", + 340: "sys_prlimit64", + 341: "sys_name_to_handle_at", + 342: "sys_open_by_handle_at", + 343: "sys_clock_adjtime", + 344: "sys_syncfs", + 345: "sys_sendmmsg", + 346: "sys_setns", + 347: "sys_process_vm_readv", + 348: "sys_process_vm_writev", + 349: "sys_kcmp", + 350: "sys_finit_module", + 351: "sys_sched_setattr", + 352: "sys_sched_getattr", + 353: "sys_renameat2", + 354: "sys_seccomp", + 355: "sys_getrandom", + 356: "sys_memfd_create", + 357: "sys_bpf", + 358: "sys_execveat", + 359: "sys_socket", + 360: "sys_socketpair", + 361: "sys_bind", + 362: "sys_connect", + 363: "sys_listen", + 364: "sys_accept4", + 365: "sys_getsockopt", + 366: "sys_setsockopt", + 367: "sys_getsockname", + 368: "sys_getpeername", + 369: "sys_sendto", + 370: "sys_sendmsg", + 371: "sys_recvfrom", + 372: "sys_recvmsg", + 373: "sys_shutdown", + 374: "sys_userfaultfd", + 375: "sys_membarrier", + 376: "sys_mlock2", + 377: "sys_copy_file_range", + 378: "sys_preadv2", + 379: "sys_pwritev2", + 380: "sys_pkey_mprotect", + 381: "sys_pkey_alloc", + 382: "sys_pkey_free", + 383: "sys_statx", +} +amd64 = { + 0: "sys_read", + 1: "sys_write", + 2: "sys_open", + 3: "sys_close", + 4: "sys_newstat", + 5: "sys_newfstat", + 6: "sys_newlstat", + 7: "sys_poll", + 8: "sys_lseek", + 9: "sys_mmap", + 10: "sys_mprotect", + 11: "sys_munmap", + 12: "sys_brk", + 13: "sys_rt_sigaction", + 14: "sys_rt_sigprocmask", + 15: "sys_rt_sigreturn/ptregs", + 16: "sys_ioctl", + 17: "sys_pread64", + 18: "sys_pwrite64", + 19: "sys_readv", + 20: "sys_writev", + 21: "sys_access", + 22: "sys_pipe", + 23: "sys_select", + 24: "sys_sched_yield", + 25: "sys_mremap", + 26: "sys_msync", + 27: "sys_mincore", + 28: "sys_madvise", + 29: "sys_shmget", + 30: "sys_shmat", + 31: "sys_shmctl", + 32: "sys_dup", + 33: "sys_dup2", + 34: "sys_pause", + 35: "sys_nanosleep", + 36: "sys_getitimer", + 37: "sys_alarm", + 38: "sys_setitimer", + 39: "sys_getpid", + 40: "sys_sendfile64", + 41: "sys_socket", + 42: "sys_connect", + 43: "sys_accept", + 44: "sys_sendto", + 45: "sys_recvfrom", + 46: "sys_sendmsg", + 47: "sys_recvmsg", + 48: "sys_shutdown", + 49: "sys_bind", + 50: "sys_listen", + 51: "sys_getsockname", + 52: "sys_getpeername", + 53: "sys_socketpair", + 54: "sys_setsockopt", + 55: "sys_getsockopt", + 56: "sys_clone/ptregs", + 57: "sys_fork/ptregs", + 58: "sys_vfork/ptregs", + 59: "sys_execve/ptregs", + 60: "sys_exit", + 61: "sys_wait4", + 62: "sys_kill", + 63: "sys_newuname", + 64: "sys_semget", + 65: "sys_semop", + 66: "sys_semctl", + 67: "sys_shmdt", + 68: "sys_msgget", + 69: "sys_msgsnd", + 70: "sys_msgrcv", + 71: "sys_msgctl", + 72: "sys_fcntl", + 73: "sys_flock", + 74: "sys_fsync", + 75: "sys_fdatasync", + 76: "sys_truncate", + 77: "sys_ftruncate", + 78: "sys_getdents", + 79: "sys_getcwd", + 80: "sys_chdir", + 81: "sys_fchdir", + 82: "sys_rename", + 83: "sys_mkdir", + 84: "sys_rmdir", + 85: "sys_creat", + 86: "sys_link", + 87: "sys_unlink", + 88: "sys_symlink", + 89: "sys_readlink", + 90: "sys_chmod", + 91: "sys_fchmod", + 92: "sys_chown", + 93: "sys_fchown", + 94: "sys_lchown", + 95: "sys_umask", + 96: "sys_gettimeofday", + 97: "sys_getrlimit", + 98: "sys_getrusage", + 99: "sys_sysinfo", + 100: "sys_times", + 101: "sys_ptrace", + 102: "sys_getuid", + 103: "sys_syslog", + 104: "sys_getgid", + 105: "sys_setuid", + 106: "sys_setgid", + 107: "sys_geteuid", + 108: "sys_getegid", + 109: "sys_setpgid", + 110: "sys_getppid", + 111: "sys_getpgrp", + 112: "sys_setsid", + 113: "sys_setreuid", + 114: "sys_setregid", + 115: "sys_getgroups", + 116: "sys_setgroups", + 117: "sys_setresuid", + 118: "sys_getresuid", + 119: "sys_setresgid", + 120: "sys_getresgid", + 121: "sys_getpgid", + 122: "sys_setfsuid", + 123: "sys_setfsgid", + 124: "sys_getsid", + 125: "sys_capget", + 126: "sys_capset", + 127: "sys_rt_sigpending", + 128: "sys_rt_sigtimedwait", + 129: "sys_rt_sigqueueinfo", + 130: "sys_rt_sigsuspend", + 131: "sys_sigaltstack", + 132: "sys_utime", + 133: "sys_mknod", + 135: "sys_personality", + 136: "sys_ustat", + 137: "sys_statfs", + 138: "sys_fstatfs", + 139: "sys_sysfs", + 140: "sys_getpriority", + 141: "sys_setpriority", + 142: "sys_sched_setparam", + 143: "sys_sched_getparam", + 144: "sys_sched_setscheduler", + 145: "sys_sched_getscheduler", + 146: "sys_sched_get_priority_max", + 147: "sys_sched_get_priority_min", + 148: "sys_sched_rr_get_interval", + 149: "sys_mlock", + 150: "sys_munlock", + 151: "sys_mlockall", + 152: "sys_munlockall", + 153: "sys_vhangup", + 154: "sys_modify_ldt", + 155: "sys_pivot_root", + 156: "sys_sysctl", + 157: "sys_prctl", + 158: "sys_arch_prctl", + 159: "sys_adjtimex", + 160: "sys_setrlimit", + 161: "sys_chroot", + 162: "sys_sync", + 163: "sys_acct", + 164: "sys_settimeofday", + 165: "sys_mount", + 166: "sys_umount", + 167: "sys_swapon", + 168: "sys_swapoff", + 169: "sys_reboot", + 170: "sys_sethostname", + 171: "sys_setdomainname", + 172: "sys_iopl/ptregs", + 173: "sys_ioperm", + 175: "sys_init_module", + 176: "sys_delete_module", + 179: "sys_quotactl", + 186: "sys_gettid", + 187: "sys_readahead", + 188: "sys_setxattr", + 189: "sys_lsetxattr", + 190: "sys_fsetxattr", + 191: "sys_getxattr", + 192: "sys_lgetxattr", + 193: "sys_fgetxattr", + 194: "sys_listxattr", + 195: "sys_llistxattr", + 196: "sys_flistxattr", + 197: "sys_removexattr", + 198: "sys_lremovexattr", + 199: "sys_fremovexattr", + 200: "sys_tkill", + 201: "sys_time", + 202: "sys_futex", + 203: "sys_sched_setaffinity", + 204: "sys_sched_getaffinity", + 206: "sys_io_setup", + 207: "sys_io_destroy", + 208: "sys_io_getevents", + 209: "sys_io_submit", + 210: "sys_io_cancel", + 212: "sys_lookup_dcookie", + 213: "sys_epoll_create", + 216: "sys_remap_file_pages", + 217: "sys_getdents64", + 218: "sys_set_tid_address", + 219: "sys_restart_syscall", + 220: "sys_semtimedop", + 221: "sys_fadvise64", + 222: "sys_timer_create", + 223: "sys_timer_settime", + 224: "sys_timer_gettime", + 225: "sys_timer_getoverrun", + 226: "sys_timer_delete", + 227: "sys_clock_settime", + 228: "sys_clock_gettime", + 229: "sys_clock_getres", + 230: "sys_clock_nanosleep", + 231: "sys_exit_group", + 232: "sys_epoll_wait", + 233: "sys_epoll_ctl", + 234: "sys_tgkill", + 235: "sys_utimes", + 237: "sys_mbind", + 238: "sys_set_mempolicy", + 239: "sys_get_mempolicy", + 240: "sys_mq_open", + 241: "sys_mq_unlink", + 242: "sys_mq_timedsend", + 243: "sys_mq_timedreceive", + 244: "sys_mq_notify", + 245: "sys_mq_getsetattr", + 246: "sys_kexec_load", + 247: "sys_waitid", + 248: "sys_add_key", + 249: "sys_request_key", + 250: "sys_keyctl", + 251: "sys_ioprio_set", + 252: "sys_ioprio_get", + 253: "sys_inotify_init", + 254: "sys_inotify_add_watch", + 255: "sys_inotify_rm_watch", + 256: "sys_migrate_pages", + 257: "sys_openat", + 258: "sys_mkdirat", + 259: "sys_mknodat", + 260: "sys_fchownat", + 261: "sys_futimesat", + 262: "sys_newfstatat", + 263: "sys_unlinkat", + 264: "sys_renameat", + 265: "sys_linkat", + 266: "sys_symlinkat", + 267: "sys_readlinkat", + 268: "sys_fchmodat", + 269: "sys_faccessat", + 270: "sys_pselect6", + 271: "sys_ppoll", + 272: "sys_unshare", + 273: "sys_set_robust_list", + 274: "sys_get_robust_list", + 275: "sys_splice", + 276: "sys_tee", + 277: "sys_sync_file_range", + 278: "sys_vmsplice", + 279: "sys_move_pages", + 280: "sys_utimensat", + 281: "sys_epoll_pwait", + 282: "sys_signalfd", + 283: "sys_timerfd_create", + 284: "sys_eventfd", + 285: "sys_fallocate", + 286: "sys_timerfd_settime", + 287: "sys_timerfd_gettime", + 288: "sys_accept4", + 289: "sys_signalfd4", + 290: "sys_eventfd2", + 291: "sys_epoll_create1", + 292: "sys_dup3", + 293: "sys_pipe2", + 294: "sys_inotify_init1", + 295: "sys_preadv", + 296: "sys_pwritev", + 297: "sys_rt_tgsigqueueinfo", + 298: "sys_perf_event_open", + 299: "sys_recvmmsg", + 300: "sys_fanotify_init", + 301: "sys_fanotify_mark", + 302: "sys_prlimit64", + 303: "sys_name_to_handle_at", + 304: "sys_open_by_handle_at", + 305: "sys_clock_adjtime", + 306: "sys_syncfs", + 307: "sys_sendmmsg", + 308: "sys_setns", + 309: "sys_getcpu", + 310: "sys_process_vm_readv", + 311: "sys_process_vm_writev", + 312: "sys_kcmp", + 313: "sys_finit_module", + 314: "sys_sched_setattr", + 315: "sys_sched_getattr", + 316: "sys_renameat2", + 317: "sys_seccomp", + 318: "sys_getrandom", + 319: "sys_memfd_create", + 320: "sys_kexec_file_load", + 321: "sys_bpf", + 322: "sys_execveat/ptregs", + 323: "sys_userfaultfd", + 324: "sys_membarrier", + 325: "sys_mlock2", + 326: "sys_copy_file_range", + 327: "sys_preadv2", + 328: "sys_pwritev2", + 329: "sys_pkey_mprotect", + 330: "sys_pkey_alloc", + 331: "sys_pkey_free", + 332: "sys_statx", + 512: "compat_sys_rt_sigaction", + 513: "sys32_x32_rt_sigreturn", + 514: "compat_sys_ioctl", + 515: "compat_sys_readv", + 516: "compat_sys_writev", + 517: "compat_sys_recvfrom", + 518: "compat_sys_sendmsg", + 519: "compat_sys_recvmsg", + 520: "compat_sys_execve/ptregs", + 521: "compat_sys_ptrace", + 522: "compat_sys_rt_sigpending", + 523: "compat_sys_rt_sigtimedwait", + 524: "compat_sys_rt_sigqueueinfo", + 525: "compat_sys_sigaltstack", + 526: "compat_sys_timer_create", + 527: "compat_sys_mq_notify", + 528: "compat_sys_kexec_load", + 529: "compat_sys_waitid", + 530: "compat_sys_set_robust_list", + 531: "compat_sys_get_robust_list", + 532: "compat_sys_vmsplice", + 533: "compat_sys_move_pages", + 534: "compat_sys_preadv64", + 535: "compat_sys_pwritev64", + 536: "compat_sys_rt_tgsigqueueinfo", + 537: "compat_sys_recvmmsg", + 538: "compat_sys_sendmmsg", + 539: "compat_sys_process_vm_readv", + 540: "compat_sys_process_vm_writev", + 541: "compat_sys_setsockopt", + 542: "compat_sys_getsockopt", + 543: "compat_sys_io_setup", + 544: "compat_sys_io_submit", + 545: "compat_sys_execveat/ptregs", + 546: "compat_sys_preadv64v2", + 547: "compat_sys_pwritev64v2", +} +armv7 = { + 0: "sys_restart_syscall", + 1: "sys_exit", + 2: "sys_fork", + 3: "sys_read", + 4: "sys_write", + 5: "sys_open", + 6: "sys_close", + 8: "sys_creat", + 9: "sys_link", + 10: "sys_unlink", + 11: "sys_execve", + 12: "sys_chdir", + 13: "sys_time", + 14: "sys_mknod", + 15: "sys_chmod", + 16: "sys_lchown16", + 19: "sys_lseek", + 20: "sys_getpid", + 21: "sys_mount", + 22: "sys_oldumount", + 23: "sys_setuid16", + 24: "sys_getuid16", + 25: "sys_stime", + 26: "sys_ptrace", + 27: "sys_alarm", + 29: "sys_pause", + 30: "sys_utime", + 33: "sys_access", + 34: "sys_nice", + 36: "sys_sync", + 37: "sys_kill", + 38: "sys_rename", + 39: "sys_mkdir", + 40: "sys_rmdir", + 41: "sys_dup", + 42: "sys_pipe", + 43: "sys_times", + 45: "sys_brk", + 46: "sys_setgid16", + 47: "sys_getgid16", + 49: "sys_geteuid16", + 50: "sys_getegid16", + 51: "sys_acct", + 52: "sys_umount", + 54: "sys_ioctl", + 55: "sys_fcntl", + 57: "sys_setpgid", + 60: "sys_umask", + 61: "sys_chroot", + 62: "sys_ustat", + 63: "sys_dup2", + 64: "sys_getppid", + 65: "sys_getpgrp", + 66: "sys_setsid", + 67: "sys_sigaction", + 70: "sys_setreuid16", + 71: "sys_setregid16", + 72: "sys_sigsuspend", + 73: "sys_sigpending", + 74: "sys_sethostname", + 75: "sys_setrlimit", + 76: "sys_old_getrlimit", + 77: "sys_getrusage", + 78: "sys_gettimeofday", + 79: "sys_settimeofday", + 80: "sys_getgroups16", + 81: "sys_setgroups16", + 82: "sys_old_select", + 83: "sys_symlink", + 85: "sys_readlink", + 86: "sys_uselib", + 87: "sys_swapon", + 88: "sys_reboot", + 89: "sys_old_readdir", + 90: "sys_old_mmap", + 91: "sys_munmap", + 92: "sys_truncate", + 93: "sys_ftruncate", + 94: "sys_fchmod", + 95: "sys_fchown16", + 96: "sys_getpriority", + 97: "sys_setpriority", + 99: "sys_statfs", + 100: "sys_fstatfs", + 102: "sys_socketcall", + 103: "sys_syslog", + 104: "sys_setitimer", + 105: "sys_getitimer", + 106: "sys_newstat", + 107: "sys_newlstat", + 108: "sys_newfstat", + 111: "sys_vhangup", + 113: "sys_syscall", + 114: "sys_wait4", + 115: "sys_swapoff", + 116: "sys_sysinfo", + 117: "sys_ipc", + 118: "sys_fsync", + 119: "sys_sigreturn_wrapper", + 120: "sys_clone", + 121: "sys_setdomainname", + 122: "sys_newuname", + 124: "sys_adjtimex", + 125: "sys_mprotect", + 126: "sys_sigprocmask", + 128: "sys_init_module", + 129: "sys_delete_module", + 131: "sys_quotactl", + 132: "sys_getpgid", + 133: "sys_fchdir", + 134: "sys_bdflush", + 135: "sys_sysfs", + 136: "sys_personality", + 138: "sys_setfsuid16", + 139: "sys_setfsgid16", + 140: "sys_llseek", + 141: "sys_getdents", + 142: "sys_select", + 143: "sys_flock", + 144: "sys_msync", + 145: "sys_readv", + 146: "sys_writev", + 147: "sys_getsid", + 148: "sys_fdatasync", + 149: "sys_sysctl", + 150: "sys_mlock", + 151: "sys_munlock", + 152: "sys_mlockall", + 153: "sys_munlockall", + 154: "sys_sched_setparam", + 155: "sys_sched_getparam", + 156: "sys_sched_setscheduler", + 157: "sys_sched_getscheduler", + 158: "sys_sched_yield", + 159: "sys_sched_get_priority_max", + 160: "sys_sched_get_priority_min", + 161: "sys_sched_rr_get_interval", + 162: "sys_nanosleep", + 163: "sys_mremap", + 164: "sys_setresuid16", + 165: "sys_getresuid16", + 168: "sys_poll", + 170: "sys_setresgid16", + 171: "sys_getresgid16", + 172: "sys_prctl", + 173: "sys_rt_sigreturn_wrapper", + 174: "sys_rt_sigaction", + 175: "sys_rt_sigprocmask", + 176: "sys_rt_sigpending", + 177: "sys_rt_sigtimedwait", + 178: "sys_rt_sigqueueinfo", + 179: "sys_rt_sigsuspend", + 180: "sys_pread64", + 181: "sys_pwrite64", + 182: "sys_chown16", + 183: "sys_getcwd", + 184: "sys_capget", + 185: "sys_capset", + 186: "sys_sigaltstack", + 187: "sys_sendfile", + 190: "sys_vfork", + 191: "sys_getrlimit", + 192: "sys_mmap2", + 193: "sys_truncate64", + 194: "sys_ftruncate64", + 195: "sys_stat64", + 196: "sys_lstat64", + 197: "sys_fstat64", + 198: "sys_lchown", + 199: "sys_getuid", + 200: "sys_getgid", + 201: "sys_geteuid", + 202: "sys_getegid", + 203: "sys_setreuid", + 204: "sys_setregid", + 205: "sys_getgroups", + 206: "sys_setgroups", + 207: "sys_fchown", + 208: "sys_setresuid", + 209: "sys_getresuid", + 210: "sys_setresgid", + 211: "sys_getresgid", + 212: "sys_chown", + 213: "sys_setuid", + 214: "sys_setgid", + 215: "sys_setfsuid", + 216: "sys_setfsgid", + 217: "sys_getdents64", + 218: "sys_pivot_root", + 219: "sys_mincore", + 220: "sys_madvise", + 221: "sys_fcntl64", + 224: "sys_gettid", + 225: "sys_readahead", + 226: "sys_setxattr", + 227: "sys_lsetxattr", + 228: "sys_fsetxattr", + 229: "sys_getxattr", + 230: "sys_lgetxattr", + 231: "sys_fgetxattr", + 232: "sys_listxattr", + 233: "sys_llistxattr", + 234: "sys_flistxattr", + 235: "sys_removexattr", + 236: "sys_lremovexattr", + 237: "sys_fremovexattr", + 238: "sys_tkill", + 239: "sys_sendfile64", + 240: "sys_futex", + 241: "sys_sched_setaffinity", + 242: "sys_sched_getaffinity", + 243: "sys_io_setup", + 244: "sys_io_destroy", + 245: "sys_io_getevents", + 246: "sys_io_submit", + 247: "sys_io_cancel", + 248: "sys_exit_group", + 249: "sys_lookup_dcookie", + 250: "sys_epoll_create", + 251: "sys_epoll_ctl", + 252: "sys_epoll_wait", + 253: "sys_remap_file_pages", + 256: "sys_set_tid_address", + 257: "sys_timer_create", + 258: "sys_timer_settime", + 259: "sys_timer_gettime", + 260: "sys_timer_getoverrun", + 261: "sys_timer_delete", + 262: "sys_clock_settime", + 263: "sys_clock_gettime", + 264: "sys_clock_getres", + 265: "sys_clock_nanosleep", + 266: "sys_statfs64_wrapper", + 267: "sys_fstatfs64_wrapper", + 268: "sys_tgkill", + 269: "sys_utimes", + 270: "sys_arm_fadvise64_64", + 271: "sys_pciconfig_iobase", + 272: "sys_pciconfig_read", + 273: "sys_pciconfig_write", + 274: "sys_mq_open", + 275: "sys_mq_unlink", + 276: "sys_mq_timedsend", + 277: "sys_mq_timedreceive", + 278: "sys_mq_notify", + 279: "sys_mq_getsetattr", + 280: "sys_waitid", + 281: "sys_socket", + 282: "sys_bind", + 283: "sys_connect", + 284: "sys_listen", + 285: "sys_accept", + 286: "sys_getsockname", + 287: "sys_getpeername", + 288: "sys_socketpair", + 289: "sys_send", + 290: "sys_sendto", + 291: "sys_recv", + 292: "sys_recvfrom", + 293: "sys_shutdown", + 294: "sys_setsockopt", + 295: "sys_getsockopt", + 296: "sys_sendmsg", + 297: "sys_recvmsg", + 298: "sys_semop", + 299: "sys_semget", + 300: "sys_semctl", + 301: "sys_msgsnd", + 302: "sys_msgrcv", + 303: "sys_msgget", + 304: "sys_msgctl", + 305: "sys_shmat", + 306: "sys_shmdt", + 307: "sys_shmget", + 308: "sys_shmctl", + 309: "sys_add_key", + 310: "sys_request_key", + 311: "sys_keyctl", + 312: "sys_semtimedop", + 314: "sys_ioprio_set", + 315: "sys_ioprio_get", + 316: "sys_inotify_init", + 317: "sys_inotify_add_watch", + 318: "sys_inotify_rm_watch", + 319: "sys_mbind", + 320: "sys_get_mempolicy", + 321: "sys_set_mempolicy", + 322: "sys_openat", + 323: "sys_mkdirat", + 324: "sys_mknodat", + 325: "sys_fchownat", + 326: "sys_futimesat", + 327: "sys_fstatat64", + 328: "sys_unlinkat", + 329: "sys_renameat", + 330: "sys_linkat", + 331: "sys_symlinkat", + 332: "sys_readlinkat", + 333: "sys_fchmodat", + 334: "sys_faccessat", + 335: "sys_pselect6", + 336: "sys_ppoll", + 337: "sys_unshare", + 338: "sys_set_robust_list", + 339: "sys_get_robust_list", + 340: "sys_splice", + 341: "sys_sync_file_range2", + 342: "sys_tee", + 343: "sys_vmsplice", + 344: "sys_move_pages", + 345: "sys_getcpu", + 346: "sys_epoll_pwait", + 347: "sys_kexec_load", + 348: "sys_utimensat", + 349: "sys_signalfd", + 350: "sys_timerfd_create", + 351: "sys_eventfd", + 352: "sys_fallocate", + 353: "sys_timerfd_settime", + 354: "sys_timerfd_gettime", + 355: "sys_signalfd4", + 356: "sys_eventfd2", + 357: "sys_epoll_create1", + 358: "sys_dup3", + 359: "sys_pipe2", + 360: "sys_inotify_init1", + 361: "sys_preadv", + 362: "sys_pwritev", + 363: "sys_rt_tgsigqueueinfo", + 364: "sys_perf_event_open", + 365: "sys_recvmmsg", + 366: "sys_accept4", + 367: "sys_fanotify_init", + 368: "sys_fanotify_mark", + 369: "sys_prlimit64", + 370: "sys_name_to_handle_at", + 371: "sys_open_by_handle_at", + 372: "sys_clock_adjtime", + 373: "sys_syncfs", + 374: "sys_sendmmsg", + 375: "sys_setns", + 376: "sys_process_vm_readv", + 377: "sys_process_vm_writev", + 378: "sys_kcmp", + 379: "sys_finit_module", + 380: "sys_sched_setattr", + 381: "sys_sched_getattr", + 382: "sys_renameat2", + 383: "sys_seccomp", + 384: "sys_getrandom", + 385: "sys_memfd_create", + 386: "sys_bpf", + 387: "sys_execveat", + 388: "sys_userfaultfd", + 389: "sys_membarrier", + 390: "sys_mlock2", + 391: "sys_copy_file_range", + 392: "sys_preadv2", + 393: "sys_pwritev2", + 394: "sys_pkey_mprotect", + 395: "sys_pkey_alloc", + 396: "sys_pkey_free", + 397: "sys_statx", +} diff --git a/scripts/extract_syscalls.py b/scripts/extract_syscalls.py new file mode 100755 index 0000000..2b85101 --- /dev/null +++ b/scripts/extract_syscalls.py @@ -0,0 +1,60 @@ +#!/usr/bin/env python + +''' +Generate syscall tables from the Linux source. Used to generate +manticore/platforms/linux_syscalls.py. + +This fetches the tables from kernel.org. + +Usage: + + ./extract_syscalls.py [--linux_version linux_version] linux_syscalls.py + +''' + +import os +import sys +import urllib +import argparse + +base_url = 'https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/plain/{}?id=refs/tags/v{}' + +arch_tables = { + 'armv7': 'arch/arm/tools/syscall.tbl', + 'i386': 'arch/x86/entry/syscalls/syscall_32.tbl', + 'amd64': 'arch/x86/entry/syscalls/syscall_64.tbl', +} + + +if __name__=='__main__': + parser = argparse.ArgumentParser(description='Generate syscall tables') + parser.add_argument('output', help='Python output to generate tables') + parser.add_argument('--linux_version', help='Major version of the Linux kernel to use', default='4.11') + args = parser.parse_args() + + output = open(args.output, 'w+') + output.write('#\n#\n# AUTOGENERATED, DO NOT EDIT\n#\n') + output.write('# From version: {}\n#\n\n'.format(args.linux_version)) + + for arch, path in arch_tables.items(): + url = base_url.format(path, args.linux_version) + tbl = urllib.urlopen(url) + + if tbl.code // 100 != 2: + sys.stderr.write("Failed retrieving table; check version and connection.\n") + sys.stderr.write("Url: {}\n".format(url)) + sys.exit(1) + + output.write('{} = {{\n'.format(arch)) + for line in tbl.readlines(): + line = line.strip() + if line.startswith('#'): + continue + columns = line.split() + if len(columns) < 4: + continue + num, abi, name, entry = columns[:4] + output.write(' {}: "{}",\n'.format(num, entry)) + output.write('}\n') + +