实践内容

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

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

该程序同时包含另一个代码片段,getShell,会返回一个可用Shell。正常情况下这个代码是不会被运行的。我们实践的目标就是想办法运行这个代码片段。

实践方法

  1. 利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。
  2. 手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。

这几种思路,基本代表现实情况中的攻击目标

    (1)运行原本不可访问的代码片段(2)强行修改程序执行流(3)以及注入运行任意代码。

实践要求

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

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

3. 能正确修改机器指令改变程序执行流程

4. 能正确构造payload进行bof攻击

5. Optional:进阶,Shellcode编程与注入

实践基础知识

  • (1)NOP指令即“空指令”(机器码:90)。执行到NOP指令时,CPU什么也不做,仅仅当做一个指令执行过去并继续执行NOP后面的一条指令。所以NOP指令自然也会占用执行一个指令的CPU时间片。
  • (2)JNE是一个条件转移指令(机器码:75)。当ZF=0,转至标号处执行。
  • (3)JE是一个条件转移指令(机器码:74)。如果相等则跳转。
  • (4)JMP是无条件转移指令。段内直接短转Jmp short(机器码:EB)段内直接近转移Jmp near(机器码:E9)段内间接转移Jmp word(机器码:FF)段间直接(远)转移Jmp far(机器码:EA)
  • (5)CMP为比较指令,功能相当于减法指令,只是对操作数之间运算比较,不保存结果(机器码:39)。cmp指令执行后,将对标志寄存器产生影响。其他相关指令通过识别这些被影响的标志寄存器位来得知比较结果。

实践过程

方法一 直接修改可执行文件的机器指令

  • 键入指令objdump -d hf0145234 | more
  • 找到程序关键函数(即去除运行所添加的各种库函数), getShell , foo , main
  • 从图中可以看出该程序正常运行顺序是从main函数入口开始进行执行,而后调用foo函数,并没有对getShell函数进行调用,而我们可以通过修改main函数中call指令来将原本程序对于foo函数的调用改为对getShell函数的调用。

  • 首先我们要了解call指令是通过修改eip寄存器的值来实现对于函数的调用的,因为eip寄存器永远指向下一条指令的地址,call指令的汇编代码与机器指令间的关系为 0x8048491 = 0x80484ba + 0xd7ffffff,其中 0x80484ba是原本下一条指令的地址, 0x8048491 为经过call指令修改后下一条指令的地址,机器指令中的 e8 是call指令的机器码
  • 因此想要调用getShell,只要修改 d7ffffff 为, getShell-80484ba 对应的补码 c3ffffff 就行了。

  • 接下来输入 vi hf20145234 打开可执行文件hf20145234;
  • 输入 :%!xxd 将文件转换成16进制显示
  • 输入 /e8 d7 搜索查询需要修改的机器码位置,锁定位置后按 i 进入插入模式进行将 e8 d7 修改为 e8 c3 (04b0行)
  • 输入 :%!xxd -r取消16进制显示,并输入 :wq 对文件的修改进行保存并退出(注:若不退出16进制显示直接保存,运行文件会出错
  • 再次使用反汇编指令objdump -d pwnx | more进行查看 发现call 后发生了变化
  • 键入 ./hf20145234 查看运行结果

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

  • 第一步依旧是输入反汇编指令objdump -d hf2 | more进行分析,内容同上

  • 第二步,确认输入字符串中哪几个字符会覆盖到返回地址
    • 输入指令 gdb hf2 调试程序,
    • 如果输入字符串1111111122222222333333334444444412345678,那 1234 那四个数最终会覆盖到堆栈上的返回地址,进而CPU会尝试运行这个位置的代码。那只要把这四个字符替换为 getShell 的内存地址,输给pwn1,pwn1就会运行getShell。
  • 第三步,确认用什么值来覆盖返回地址
    • getShell的内存地址,在未启用ALSR的主机上是固定不变的,通过反汇编时可以看到,即 0x804847d 。接下来要确认下字节序,简单说是输入 11111111222222223333333344444444\x08\x04\x84\x7d ,还是输入 11111111222222223333333344444444\x7d\x84\x04\x08 。
    • 对比之前 eip 0x34333231 0x34333231 ,正确应用输入11111111222222223333333344444444\x7d\x84\x04\x08
  • 第四步,构造输入字符串
    • 由为我们没法通过键盘输入 \x7d\x84\x04\x08 这样的16进制值,所以先生成包括这样字符串的一个文件。\x0a表示回车,如果没有的话,在程序运行时就需要手工按一下回车键。
    • 利用Perl构建input文件进行输入,键入指令 perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"' > input
    • 使用16进制查看指令xxd查看input文件的内容是否如预期
    • 然后将input的输入,通过管道符“|”,作为pwn1的输入。

20145234黄斐《网络对抗技术》实验一,逆向及Bof基础实践的更多相关文章

  1. 20145311王亦徐《网络对抗技术》MAL_逆向与Bof基础

    20145311王亦徐<网络对抗技术>MAL_逆向与Bof基础 实践目标 运行一个可执行文件,通过逆向或者Bof技术执行原本不应该执行的代码片段采用的两种方法: 1.利用foo函数的Bof ...

  2. 20165101刘天野 2018-2019-2《网络对抗技术》Exp1 逆向与Bof基础

    20165101刘天野 2018-2019-2<网络对抗技术>Exp1 逆向与Bof基础 1. 逆向及Bof基础实践说明 1.1 实践目标 本次实践的对象是一个名为pwn1的linux可执 ...

  3. 20155235 《网络攻防》 实验一 逆向及Bof基础实践说明

    20155235 <网络攻防> 实验一 逆向及Bof基础实践说明 实验目的 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函 ...

  4. 2018-2019-2 20165114《网络对抗技术》Exp1 逆向与Bof基础

    逆向及Bof基础实践 目录 一.实践目标 二.实验操作和步骤 1.直接修改程序机器指令 2.通过构造输入参数,造成BOF攻击. 3.注入Shellcode并执行 三.实验总结 四.实验遇到的错误和问题 ...

  5. 20165218 《网络对抗技术》Exp1 逆向及Bof基础

    Exp1 逆向及Bof基础 基础知识 1. NOP, JNE, JE, JMP, CMP汇编指令的机器码 指令 机器码 NOP NOP指令即"空指令",在x86的CPU中机器码为0 ...

  6. 20145222黄亚奇 《网络对抗技术》 MAL_逆向与Bof基础

    学习目的 通过一些方法,使能够运行本不该被运行的代码部分,或得到shell的使用: 将正常运行代码部分某处call后的目标地址,修改为另一部分我们希望执行.却本不应该执行的代码部分首地址(这需要我们有 ...

  7. 20145324王嘉澜 《网络对抗技术》 MAL_逆向与Bof基础

    实践目标 •本次实践的对象是一个名为pwn1的linux可执行文件. •该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串. •该程序同时包含另一个代码片段,get ...

  8. 20145314郑凯杰《网络对抗技术》实验1 逆向及Bof基础实践

    20145314郑凯杰<网络对抗技术>实验1 逆向及Bof基础实践 1.1 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数 ...

  9. 网络对抗实验一 逆向及Bof基础实践

    网络对抗实验一 逆向及Bof基础实践 一.实验目的 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串. ...

  10. 20145230熊佳炜《网络对抗》实验九:web安全基础实践

    20145230熊佳炜<网络对抗>实验九:web安全基础实践 webgoat webgoat的中文是代罪羔羊的意思,而它是一个有很多漏洞的web应用程序,我们可以利用它来研究关于web应用 ...

随机推荐

  1. 自开发Web应用和SAP Customer Data Cloud Identity服务的集成

    今天的文章继续由SAP成都研究院的云时代女王,Aviva给大家分享关于SAP Customer Data Cloud的一些使用经验. Aviva之前的文章可以在本文末尾处获得. 下面是她的正文. 大家 ...

  2. 基于IDEA的JavaWeb开发环境搭建

    基于IDEA的JavaWeb开发环境搭建 基于IDEA的JavaWeb开发环境搭建 jdk下载安装配置环境变量 下载 安装 配置环境变量 下载安装激活使用IntelliJ IDEA 下载 安装 激活 ...

  3. VGG使用重复元素的网络

    由5个卷积层块(2个单卷积层,3个双卷积层),3个全连接层组成——VGG-11 from mxnet import gluon,init,nd,autograd from mxnet.gluon im ...

  4. php------中文出现乱码解决方法

    中文出现乱码解决方法:原因编码格式不一致 [1]  建立数据库的时候,字符集选择utf-8  数据库,点表名,点右键,数据库属性…. [2]  修改myspl的配置,在[myspld]模块下面添加ch ...

  5. js获取当前URL、参数、端口、IP等信息

    以下列出均为常用(转自地址为:https://blog.csdn.net/pengShuai007/article/details/78357238?locationNum=9&fps=1 1 ...

  6. java8的4大核心函数式接口

    //java8的4大核心函数式接口//1.Consumer<T>:消费性接口//需求:public void happy(double money, Consumer<Double& ...

  7. maven学习利用Profile构建不同环境的部署包

    项目开发好以后,通常要在多个环境部署,象我们公司多达5种环境:本机环境(local).(开发小组内自测的)开发环境(dev).(提供给测试团队的)测试环境(test).预发布环境(pre).正式生产环 ...

  8. jquery遍历数组

    示例: ajax返回的数组进行遍历 $.ajax({ type:"POST", url:"<?php echo base_url(); ?>public_re ...

  9. iOS原生混合RN开发最佳实践

    iOS原生混合RN开发详解 做过原生iOS开发或者Android开发的同学们肯定也都了解Hybrid,有一些Hybrid的开发经验,目前我们企业开发中运用最广泛的Hybrid App技术就是原生与H5 ...

  10. SQL 存储过程生成

    use workflow; GO /****** 对象: StoredProcedure [dbo].[pro_GenerateProGet] 脚本日期: 08/03/2012 11:26:43 ** ...