1. exec seccomp
  2. read syscall 的地址检查

exec seccomp

λ giacomo tmp 13:50 → seccomp-tools dump ./main2
>
 line  CODE  JT   JF      K
=================================
 0000: 0x20 0x00 0x00 0x00000004  A = arch
 0001: 0x15 0x00 0x04 0xc000003e  if (A != ARCH_X86_64) goto 0006
 0002: 0x20 0x00 0x00 0x00000000  A = sys_number
 0003: 0x15 0x03 0x00 0x00000000  if (A == read) goto 0007
 0004: 0x15 0x02 0x00 0x0000003c  if (A == exit) goto 0007
 0005: 0x25 0x01 0x00 0x00000200  if (A > 0x200) goto 0007
 0006: 0x06 0x00 0x00 0x00000000  return KILL
 0007: 0x06 0x00 0x00 0x7fff0000  return ALLOW

如果直接 x32abi 调用 execve 会报 bad syscall。因为启动新的进程的时候会调用其他 syscall…

read syscall 的地址检查

https://elixir.bootlin.com/linux/latest/source/fs/read_write.c#L459

这里检查楽 buf + count 是不是一个合理的地址