Pwn

unbrevable

1
2
3
4
5
6
7
8
9
  seccomp_rule_add(v1, 0x7FFF0000, 2, 0);
  seccomp_rule_add(v1, 0x7FFF0000, 257, 0);
  seccomp_rule_add(v1, 2147418112, 0, 0);
  seccomp_rule_add(v1, 2147418112, 1, 0);
  seccomp_rule_add(v1, 2147418112, 14, 0);
  seccomp_rule_add(v1, 2147418112, 15, 0);
  seccomp_rule_add(v1, 2147418112, 60, 0);
  seccomp_rule_add(v1, 2147418112, 231, 0);
  seccomp_rule_add(v1, 2147418112, 322, 0);

0x7FFF0000 == 2147418112 == SCMP_ACT_ALLOW

1
2
3
4
5
6
7
8
9
0	read	read from a file descriptor
1	write	write to a file descriptor
2	open	open a file
14	rt_sigprocmask	manipulate blocked signal mask
15	rt_sigreturn	return from signal handler
60	exit	terminate current thread/process
231	exit_group	terminate all threads in process
257	openat	open a file relative to a directory fd
322	execveat	execute a program relative to a directory fd

主函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int __fastcall main(int argc, const char **argv, const char **envp)
{
  char *s; // [rsp+8h] [rbp-18h] BYREF
  int n[2]; // [rsp+10h] [rbp-10h] BYREF
  unsigned __int64 v6; // [rsp+18h] [rbp-8h]

  v6 = __readfsqword(0x28u);
  init(argc, argv, envp);
  setup_seccomp();
  printf("%p\n", &setvbuf);
  __isoc99_scanf("%zu %zu ", &s, n);
  fgets(s, n[0], stdin);
  fork();
  return 0;
}

向任意地址写入任意长度数据 & 给出libc基地址.

从沙箱来看,用ORW? SROP? 执行到execveat?

比较奇怪的是最后的fork, 理论上他会调用57号系统调用,但是这一题沙箱允许的syscall中并不包含,所以会报:

1
zsh: invalid system call (core dumped)  ./vuln_patched
  1. 是否有方法在调用fork的时候,执行SIG_RETURN?
  2. 或者是否在出现invalid system call的时候,拦截异常signal, 题换成我们自己的逻辑?(rt_sigprocmask就和signal有关)

Reverse