这里不止讨论侧信道,还包括各种其他方法来绕过stdout/stderr被关闭的情况。
你当然可以去使用stderr输出,如果用IO_FILE可以将 _IO_2_1stdout_
中的fileno改为2
可以尝试输出到stdin
可用的原因是tcp是双工的,发送接收实际上共享一个fd,所以各种xinetd/socat/nc一类的程序实际上会把进程的stdin/stdout/stderr全部绑定到同一个fd上,三者没有实际区别。
本地使用pwntools process运行的时候是不可用的,因为此时进程的stdin和stdout实际上是被重定向到了两个不同的pipe中,可以使用socat在本地搭建tcp环境测试。
如果对面容器有外网,可以尝试反弹shell(能execve),或者使用socket通信(能执行shellcode)
若无外网,那就没救了(,经测试,socat和xinetd在这三者都关闭后tcp连接会直接断开,无法侧信道。
先看看syscall table有无其他作用相似、未被禁用的syscall,如readv、pread64、preadv、preadv2
不行的话可以参考seccomp 绕过
writev、pwrite64、pwritev、pwritev2
或者侧信道(前提是三个标准IO起码有一个开着,也就是说tcp连接未断开)
基本思路就是暴力枚举flag的每一位,用shellcode/ROP比对flag是否正确,再用一些侧信道方法返回正确/不正确的信息。
最简单的:正确就无限循环,保持tcp连接,错误就立刻断开连接,exp可以通过连接是否主动断开判断正确与否
快一些的:利用sleep直接leak出一个字符,sleep对应秒数(ascii之类的),exp通过连接保持时间判断该位字符
使用io_uring: