这里不止讨论侧信道,还包括各种其他方法来绕过stdout/stderr被关闭的情况。

仅关闭了stdout

你当然可以去使用stderr输出,如果用IO_FILE可以将 _IO_2_1stdout_中的fileno改为2

仅关闭了stdout和stderr

可以尝试输出到stdin

可用的原因是tcp是双工的,发送接收实际上共享一个fd,所以各种xinetd/socat/nc一类的程序实际上会把进程的stdin/stdout/stderr全部绑定到同一个fd上,三者没有实际区别。

本地使用pwntools process运行的时候是不可用的,因为此时进程的stdin和stdout实际上是被重定向到了两个不同的pipe中,可以使用socat在本地搭建tcp环境测试。

关闭了stdin/stdout/stderr

如果对面容器有外网,可以尝试反弹shell(能execve),或者使用socket通信(能执行shellcode)

若无外网,那就没救了(,经测试,socat和xinetd在这三者都关闭后tcp连接会直接断开,无法侧信道。

seccomp禁止read

先看看syscall table有无其他作用相似、未被禁用的syscall,如readv、pread64、preadv、preadv2

不行的话可以参考seccomp 绕过

seccomp禁止write

writev、pwrite64、pwritev、pwritev2

或者侧信道(前提是三个标准IO起码有一个开着,也就是说tcp连接未断开)

基本思路就是暴力枚举flag的每一位,用shellcode/ROP比对flag是否正确,再用一些侧信道方法返回正确/不正确的信息。

最简单的:正确就无限循环,保持tcp连接,错误就立刻断开连接,exp可以通过连接是否主动断开判断正确与否

快一些的:利用sleep直接leak出一个字符,sleep对应秒数(ascii之类的),exp通过连接保持时间判断该位字符

使用io_uring: