在缓冲区溢出的情况下利用C中的strcpy()

时间:2018-01-20 13:03:44

标签: c linux buffer overflow root

我是计算机安全主题的新手,我遇到了这个表

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()来获取root shell。

我在使用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 个答案:

答案 0 :(得分:1)

任何溢出(缓冲区,堆栈,堆,......)都需要 shell代码才能导致漏洞利用。

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

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

一起使用

如果不这样做并且模块在内存中处于静态位置(就像过去那样),可能会有一个静态地址,其中包含特定的功能,这些地址可以作为入口点。 shellcode执行,因为任何溢出漏洞利用的目标都是将shellcode放入内存并通过指向内存中特定位置的指针执行此shellcode

我不会在这里告诉你更多关于灰色技术的内容,但是可能会看一下面向返回的编程什么是溢出技术的变体仍然是高效的

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