time

本题可以任意文件读取但会检测不能存在flag,使用pthread执行文件内容读取函数。本题主要考察了格式化字符串漏洞以及多线程条件竞争漏洞。

首先由于本题存在格式化字符串漏洞,因此可以利用该漏洞泄漏flag,于是得知道偏移量是多少。

若直接使用gdb.attach(io,’b *$rebase(0x2D08)’)会发现无法触发断点,是因为gdb尝试脱离父进程并附加子进程,就会无法调试父进程,此时可以set follow-fork-mode parent,使gdb始终保持对父进程的附加调试。

可以看出偏移量为22,那么就可以使用%22$p-%23$p-%24$p-%25$p-%26$p-%27$p-%28$p-%29$p泄漏flag。

接着就是条件竞争绕过对flag的检查,因为每次输入文件名后并不是直接执行start_routine函数,而是通过 pthread_create函数创建新的线程执行,那么这里存在时间竞争漏洞,我们先输入合法的文件名绕过检查,接着 pthread_create函数启动一个新线程,并访问全局变量file,然后主线程进入下一次循环,在新线程执行前/期间再次修改该全局变量,最后就会导致新线程读入修改后的file的内容,从而绕过检测,获得flag。