1.逆向及Bof基础实践说明

1.1 实践目标

实验对象:一个名为pwn1的linux可执行文件。

实验流程:main调用foo函数,foo函数会简单回显任何用户输入的字符串。该程序同时包含另一个代码片段,getShell,会返回一个可用Shell。正常情况下这个代码是不会被运行的。

实验目标:想办法运行这个代码片段。我们将学习两种方法运行这个代码片段,然后学习如何注入运行任何Shellcode。

三个实践内容如下:

  • 手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。
  • 利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。
  • 注入一个自己制作的shellcode并运行这段shellcode。
  • 这几种思路,基本代表现实情况中的攻击目标:
    • 运行原本不可访问的代码片段
    • 强行修改程序执行流
    • 以及注入运行任意代码

1.2 基础知识

  • 熟悉Linux基本操作

    • 能看懂常用指令,如管道(|),输入、输出重定向(>)等。
  • 理解Bof的原理。
    • 能看得懂汇编、机器指令、EIP、指令地址。
  • 会使用gdb,vi。
  • 指令参数:

    • 一些具体的问题可以边做边查,但最重要的思路、想法不能乱。
    • 要时刻知道,我是在做什么?现在在查什么数据?改什么数据?要改成什么样?每步操作都要单独实践验证,再一步步累加为最终结果。
  • 理解思路:

    • 看指导理解思路,然后抛开指导自己做。
    • 碰到问题才能学到知识。
    • 具体的指令可以回到指导中查。

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

  • 知识要求:

    • Call指令,EIP寄存器,指令跳转的偏移计算,补码,反汇编指令objdump,十六进制编辑工具

    • 学习目标:理解可执行文件与机器指令

    • 进阶:掌握ELF文件格式,掌握动态技术

2.1下载目标文件pwn1,反汇编。

将pwn1可执行文件复制到共享文件夹中,然后复制到kali的主目录中,重命名为4312,然后使用反汇编语言 objdump -d 4312 | more 对其进行反汇编,得到结果: 

  • "call 8048491 "是汇编指令

    • 是说这条指令将调用位于地址8048491处的foo函数;
    • 其对应机器指令为“e8 d7ffffff”,e8即跳转之意。
      • 本来正常流程,此时此刻EIP的值应该是下条指令的地址,即80484ba,但如一解释e8这条指令呢,CPU就会转而执行 “EIP + d7ffffff”这个位置的指令。“d7ffffff”是补码,表示-41,41=0x29,80484ba +d7ffffff= 80484ba-0x29正好是8048491这个值
  • main函数调用foo,对应机器指令为“ e8 d7ffffff”,

    • 那我们想让它调用getShell,只要修改“d7ffffff”为,"getShell-80484ba"对应的补码就行。
    • 用Windows计算器,直接 47d-4ba就能得到补码,是c3ffffff。
  • 下面我们就修改可执行文件,将其中的call指令的目标地址由d7ffffff变为c3ffffff。

2.2使用vi打开文件,找到应修改位置完成修改

输入 :%!xxd 将文件转为16进制编码显示:

找到e8d7然后将其修改为e8c3

完成修改,输入:wq存盘退出。

2.3参看文件修改情况并运行。

运行可执行文件test4312,发现程序能够调用shell,完成任务1。

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

知识要求:堆栈结构,返回地址

学习目标:理解攻击缓冲区的结果,掌握返回地址的获取

进阶:掌握ELF文件格式,掌握动态技术

3.1 反汇编,了解程序的基本功能

注意这个函数getShell,我们的目标是触发这个函数该可执行文件正常运行是调用如下函数foo,这个函数有Buffer overflow漏洞这里读入字符串,但系统只预留了4字节的缓冲区,

超出部分会造成溢出,我们的目标是覆盖返回地址

3.2 确认输入字符串哪几个字符会覆盖到返回地址

输入info r 查看寄存器信息,通过查询ascll表,发现eip中存放数据为4567(3多输了一个),就可以立即判定哪四位会覆盖到返回地址。

3.3 确认用什么值来覆盖返回地址

getShell的内存地址,通过反汇编时可以看到,即0804847d。

接下来要确认下字节序,简单说是输入11111111222222223333333344444444\x08\x04\x84\x7d,还是输入11111111222222223333333344444444\x7d\x84\x04\x08。

由于我们没法通过键盘输入\x7d\x84\x04\x08这样的16进制值,所以先生成包括这样字符串的一个文件。\x0a表示回车,如果没有的话,在程序运行时就需要手工按一下回车键。

4. 注入Shellcode并执行

 4.1准备一段Shellcode

  • shellcode就是一段机器指令(code)

    • 通常这段机器指令的目的是为获取一个交互式的shell(像linux的shell或类似windows下的cmd.exe),
    • 所以这段机器指令被称为shellcode。
    • 在实际的应用中,凡是用来注入的机器指令段都通称为shellcode,像添加一个用户、运行一条指令。

参考同学的文章Shellcode入门生成的shellcode。如下:

4.2 准备工作

修改些设置。这部分的解释请看第5小节Bof攻击防御技术.

安装execstack:

按实验进行配置:

4.3 构造要注入的payload。

  • Linux下有两种基本构造攻击buf的方法:

    • retaddr+nop+shellcode
    • nop+shellcode+retaddr。
  • 因为retaddr在缓冲区的位置是固定的,shellcode要不在它前面,要不在它后面。
  • 简单说缓冲区小就把shellcode放后边,缓冲区大就把shellcode放前边

按照retaddr+nop+shellcode模式进行注入:

在打开另外一个终端,用gdb来调试mxt4312这个文件:(需要先找到mxt4312执行的进程号)

通过info r esp 查看寄存器,找到01020304,即返回地址,shellcode就在该地址之后,因此,将\x4\x3\x2\x1改为\x90\xd3\xff\xff即可:

实验收获与感想:

这次的实验我不是在上课之前做的,在老师讲解之前我对这次实验可以说是毫无头绪,不知道该如何下手,上完课之后,我对该怎么实现有了大概的了解但是自己也没动手做,其实大部分的细节,我都不是很熟悉,比如说命令,实验顺序都不是很懂,对于为什么这么做也是一知半解,然后我就去博客看了很多别的同学的作业,进行一个比对,然后自己在虚拟机上先按照已经做好了的同学的步骤来做,当然这样很简单,但我也不是简单的抄代码,每输入一行代码,我都会对这一步骤进行思考,为什么这么做,在做完一遍之后,我终于对整个实验有了整体上的把握,并完成了本次实验的报告,除此之外,我还打算再多看几遍自己写的博客,做到对实验的每个步骤都聊熟于心,当然,这次实验我肯定是有所收获的,在基于基本的linux的基础上,我又对网络漏洞等有了新的了解,总的来说,自己动手做实验比看老师做实验更加重要,能让自己学到更多,而不是只懂理论,不会动手做的一知半解。

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

我觉得漏洞就是是计算机安全方面的缺陷,一个可执行文件中代码的不规范性或者说是不确定性,这些代码可能存在某些缺陷,在执行文件时可能会出现漏洞,针对程序设计缺陷,向程序输入缓冲区写入使之溢出的内容,从而破坏程序运行、趁着中断之际获取程序。用心不良的人会仔细研究你的代码,可能并且很可能会找到代码中的漏洞,借助这些漏洞,黑客可以执行自己的代码,在你的电脑中植入后门或者病毒从而达到自己的目的。

2018-2019-2 20164312 Exp1 PC平台逆向破解的更多相关文章

  1. 20155339平措卓玛 Exp1 PC平台逆向破解(5)M

    20155339平措卓玛 Exp1 PC平台逆向破解(5)M 实践内容 手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数. 利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖 ...

  2. 20155324《网络对抗》Exp1 PC平台逆向破解(5)M

    20155324<网络对抗>Exp1 PC平台逆向破解(5)M 实验目标 本次实践的对象是一个名为~pwn1~的~linux~可执行文件. 该程序正常执行流程是:~main~调用~foo~ ...

  3. 2018-2019-2 20165237《网络攻防技术》Exp1 PC平台逆向破解

    2018-2019-2 20165237<网络攻防技术>Exp1 PC平台逆向破解 一.实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调 ...

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

    20165221 <网络对抗技术>EXP1 PC平台逆向破解 一.实验内容 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函 ...

  5. 2018-2019-2 网络对抗技术 20165325 Exp1 PC平台逆向破解

    2018-2019-2 网络对抗技术 20165325 Exp1 PC平台逆向破解(BOF实验) 实验有三个模块: (一)直接修改程序机器指令,改变程序执行流程: (二)通过构造输入参数,造成BOF攻 ...

  6. 2018-2019-2 20165206《网络对抗技术》Exp1 PC平台逆向破解

    - 2018-2019-2 20165206<网络对抗技术>Exp1 PC平台逆向破解 - 实验任务 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:mai ...

  7. Exp1 PC平台逆向破解 20165235 祁瑛

    Exp1 PC平台逆向破解 20165235 祁瑛 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件.该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字 ...

  8. 2018-2019-2 20165317《网络对抗技术》Exp1 PC平台逆向破解

    2018-2019-2 20165317<网络对抗技术>Exp1 PC平台逆向破解 实验目的 掌握NOP, JNE, JE, JMP, CMP汇编指令的机器码 NOP:无作用,英文&quo ...

  9. 2018-2019-2 网络对抗技术 20165336 Exp1 PC平台逆向破解

    2018-2019-2 网络对抗技术 20165336 Exp1 PC平台逆向破解 1. 逆向及Bof基础实践说明 1.1 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件.该程序正常 ...

随机推荐

  1. PAT1084:Broken Keyboard

    1084. Broken Keyboard (20) 时间限制 200 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue On a ...

  2. 关于java多线程关键字volatile的理解

    volatile关键字的作用是强制从公共堆栈中取得变量的值,而不是从线程私有数据栈中取得变量的值. 使用volition关键字增加了实例变量在多个线程间的可见性.但volition有个致命的缺点就是不 ...

  3. 二十六、Hadoop学习笔记————Hadoop Yarn的简介复习

    1. 介绍 YARN(Yet Another Resource Negotiator)是一个通用的资源管理平台,可为各类计算框架提供资源的管理和调度. 之前有提到过,Yarn主要是为了减轻Hadoop ...

  4. SSM-SpringMVC-10:SpringMVC中PropertiesMethodNameResolver属性方法名称解析器

    ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 上次的以继承MultiActionController可以实现一个处理器中多个处理方法,但是局限出来了,他们的 ...

  5. testng实现场景恢复

    自动化测试过程中存在很多的不稳定性,例如网络的不稳定,浏览器无响应等等,这些失败往往并不是产品中的错误.那么这时我们需要对执行失败的场景恢复重新执行,确认其是否确实失败. 以前使用QTP的时候也使用了 ...

  6. Ambiguous mapping found

    If you have a single default method (without explicit path mapping), then all requests without a mor ...

  7. Extjs 上传文件 IE不兼容的问题[提示下载保存]

    我最不喜欢的浏览器的是IE,但无奈很多项目的客户使用的是IE. 在使用Extjs做文件上传时,其他浏览器没有问题,但IE却一个劲提示保存文件,看服务端运行,它其实是运行成功了已经,但客户端的进度条却一 ...

  8. 使用jvisualvm

    jvisualvm是java开发,调试,监控,分析内存的一个可视化工具,可以在安装完JDK中找到,一般在bin目录下 之前调试tomca内存分配,现在总结下心得, windows下的tomcat修改c ...

  9. C++中的静态类型和动态类型的定义

    当我们使用存在继承关系的类型时,必须将一个变量或者其他表达式的静态类型与该表达式表示对象的动态类型区分开来. 表达式的静态类型在编译时总是已知的,它是变量声明时的类型或者表达式生成的类型: 而动态类型 ...

  10. 面试阿里前端P6血和泪换来的收获

      我的一个朋友在前端耕耘一段时间,也在网上进行了高度培训学习,最近一段时间他打算跳槽去阿里面试前端P6开发岗位,结果被痛虐了一回,估计从此以后会给他留下不可磨灭的阴影啊 真是十年生死两茫茫,一鲁代码 ...