这道题和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
具体的文件名是:(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