代码之家  ›  专栏  ›  技术社区  ›  user7241550

利用C中的strcpy()进行缓冲区溢出,[关闭]

  •  1
  • user7241550  · 技术社区  · 6 年前

    我对计算机安全这门学科还不熟悉,我偶然发现了这张桌子

    char *
    isdn_net_newslave(char *parm)
    {
        char *p = strchr(parm, ',');
        isdn_net_dev *n;
        char newname[10];
        if (p) {
            /* Slave-Name MUST not be empty */
            if (!strlen(p + 1))
                return NULL;
            strcpy(newname, p + 1);
            *p = 0;
            /* Master must already exist */
            if (!(n = isdn_net_findif(parm)))
                return NULL;
            /* Master must be a real interface, not a slave */
            if (n->local->master)
                return NULL;
            /* Master must not be started yet */
            if (isdn_net_device_started(n))
                return NULL;
            return (isdn_net_new(newname, n->dev));
        }
        return NULL;
    }
    

    我想通过利用 strcpy() strchr() .

    我在使用C时遇到了一些麻烦,尽管它有一个 strcpy() strchr() 在它里面,因为这是我第一次利用缓冲区溢出漏洞。


    我的问题:

    我对ASLR不太了解。它是如何用C脚本干扰缓冲区溢出的?我不想禁用它,我正在考虑实际的利用。

    如何操作变量 newname ?

    以及如何定位这段精确的代码?实际上,这段代码从原始代码的第2639行开始。


    请帮帮我!非常感谢。

    原始代码:

    https://kernel.googlesource.com/pub/scm/linux/kernel/git/ralf/linux/+/linux-3.18.19/drivers/isdn/i4l/isdn_net.c

    1 回复  |  直到 6 年前
        1
  •  1
  •   ralf htp    6 年前

    任何溢出(缓冲区、堆栈、堆等)要求 外壳代码 导致利用漏洞。

    ASLR和DEP随机化特定模块的位置(如堆栈、堆、, libc )通过随机偏移量cf在内存中 https://security.stackexchange.com/questions/18556/how-do-aslr-and-dep-work

    在linux上,您可以看到ASLR如何与 cat /proc/self/maps ( With ASLR turned on, are all sections of an image get loaded at the same offsets relative to the image base address every time? )

    如果不这样做,并且模块在内存中处于静态位置(就像以前一样),那么就会有一个静态地址,其中包含特定函数,这些地址可以用作外壳代码执行的入口点,因为任何溢出攻击的目标都是将外壳代码放在内存中,并通过指向内存中特定位置的指针执行此外壳代码

    我不会在这里告诉你更多关于灰色技术的信息,但也许可以看看 面向返回的编程 什么是仍然有效的溢出技术变体

    ( Exploiting a string-based overflow on x86-64 with NX (DEP) and ASLR enabled )