zoukankan      html  css  js  c++  java
  • 缓冲区溢出实验 1 strcpy

    实验代码

    https://github.com/TouwaErioH/security/tree/master/stack%20overflow

    实验目的

    Buffer over flow 漏洞利用实践

    实验内容

    编写exploits攻击漏洞程序

    实验结果

    获取具有root权限的shell

    实验环境

    Windows10

    Oracle VM VirtualBox

    Ubuntu16.04 i386

    Sudo apt-get prelink

    Exploits 攻击程序。Vulnerables 目标程序

    准备

    Vulnerable 文件夹 编译,安装   Make  Sudo make install

    安装到了根目录 /tmp 文件夹。

    Exploits 编译   Make

    先关闭地址随机化 sudo sh -c "echo 0 > /proc/sys/kernel/randomize_va_space"

    七、实验步骤

    1.vul[1-6]的简单描述

    1.1 vul 1

     

     

    查看Vul1 源代码可知其中存在strcpy函数,当各种保护机制未开启时,容易利用strcpy实现缓冲区溢出。Vul 1 没有做边界的检查,直接拷贝argv[1]数组到buf数组,当argv[1]数组大小大于buf数组时,超出的字节会覆盖掉foo函数的ebp,返回地址等内容,当函数返回时读取返回地址,只要修改返回地址为shellcode的起始地址,就可以执行shellcode,进而获得shell。

     

    2.shellcode(构造过程)

    原理是运行/bin/sh 来得到shell,构造过程是将具有运行/bin/sh的C代码转换成有相同功能的机器码。注意代码中用到  0  的地方改成用 xor  eax,eax,这样可以避免复制字符串时遇到/0 中断。

    下面的shellcode长度为45字节(不含/0)

     

    /*

     * Aleph One shellcode.

     */

    static const char shellcode[] =

      "xebx1fx5ex89x76x08x31xc0x88x46x07x89x46x0cxb0x0b"

      "x89xf3x8dx4ex08x8dx56x0cxcdx80x31xdbx89xd8x40xcd"

      "x80xe8xdcxffxffxff/bin/sh";

     

    3.exploit[1-6]攻击方式描述(攻击原理,payload构造方式,攻击过程描述)

    3.1 exploit1

    查看exploit1,框架已经搭建好,只需要替换其中的”hi there”为设计的payload

    Payload由三部分组成,shellcode(获取shell的机器码),目标地址(返回地址设置为shellcode),nop(填充,使得能返回到shellcode)

    下面是shellcode。执行exec(“/bin/sh”)的机器码。执行/bin/sh 可以获得root权限

    如图,payload要覆盖调buf数组,长度要大于256,所以需要填充nop

    vul1为例介绍如何获得地址

    安装git-peda

    其含有漏洞的代码如下。由源码可见Buf256字节,向上覆盖foo的返回地址还需要覆盖ebp(4字节),ret(4字节),所以payload需要256+8=264字节

     

    Exploits.c先填充shellcode,再填充nop,最后填充地址

    Shellcode 45字节(除最后的)

    先填充shellcode再填充nop是因为内存中数组地址从低到高,栈方向从高到低,覆盖掉返回地址后返回到shellcode地址。

    45+(256-45)*NOP覆盖到buf,+4nop覆盖ebp,最后四字节覆盖ret

     修改exploits1.c

    修改exploits1.c后重新make生成生成新的exploit可执行文件

    这里最后覆盖的地址0xbffffc4c获取方法见下。一开始随便填都可以。

    在vul目录下,调试vul1 可执行文件。

    含有strcpy的函数为bar(第一句直接调用),foo调用,先找到foo调用bar的地址

    找到调用bar位置为0x080484fc

    换到exploitmulu,调试

    gdb –e exploit1 –s /tmp/vul1      执行exploit1,从指定文件vul1读取符号表

    • catch exec   在exploit执行exec的位置设断点
    • r
    • b *0x80484fc
    • c
    • ni
    • find 0xd231c931

    报错"/home/erio/Desktop/proj1/exploits/exploit1" is not a core dump: File format not recognized

    检查源文件meiwent。发现是输入的时候直接copy的,可能有干扰。手打gdb -e exploit1 -s /tmp/vul1就没问题了

    Run

    执行到exec刚刚知道bar的地址是 0x080484fc,在这里设置断点,c运行

     

    此时暂停到foo调用bar的位置,因为strcpy就在bar第一句,只执行一步就可以得到地址。

    使用ni 进入bar函数内部

     

    现在在strcpy内部

    Payload中最开始是shellcode,shellicode前4字节为 0x895e1feb (注意小端)

    Find 0x895e1feb

     

    找到地址在0xbffff1c4c,所以刚刚的payload最后四字节填 0xbfff1c4c。因为payload最后四字节溢出覆盖掉了foo的返回地址(不是bar的),strcpy是直接填了foo中buf。然后bar结束,栈回收只是esp,ebp改变,shellcode其实还在内存中,foo返回时eip跳到shellcode起始处,然后把shellcode的字符串当成机器码执行,eip++。

    正确修改payload最后四位为0xbffff1c4c后,执行exploit1,效果如下,得到了root权限

     

    还可以参考:

    https://blog.csdn.net/qq_36779888/article/details/89682728

  • 相关阅读:
    SQL“多字段模糊匹配关键字查询”[转载] Virus
    [转载]分页存储过程 Virus
    质因数 Virus
    由传值引发的思考 Virus
    RFID票务系统调研报告 Virus
    以人为中心还是以事为中心 Virus
    IOC容器 Virus
    [导入]数据库设计三大范式应用实例剖析 Virus
    电子商务B2B调研报告 Virus
    心情不是太好 Virus
  • 原文地址:https://www.cnblogs.com/lqerio/p/12870834.html
Copyright © 2011-2022 走看看