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. springboot中配置文件application.properties的理解

    前言 Spring Boot使用"习惯优于配置"(项目中存在大量的配置,此外还内置了一个习惯性的配置,让你无需手动进行配置)的理念让你的项目快速运行起来.所以,我们要想把Sprin ...

  2. SSM-Spring-17:Spring中aspectJ注解版

    ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- AspectJ AspectJ是一个面向切面的框架,它扩展了Java语言,定义了AOP 语法,能够在编译期提供 ...

  3. API Gateway性能比较:NGINX vs. ZUUL vs.Cloud Gateway vs. Linkerd[译]

      2018-03-04 15:07 联发科的反思 前几天拜读了 OpsGenie 公司(一家致力于 Dev & Ops 的公司)的资深工程师 Turgay elik 博士写的一篇文章(链接在 ...

  4. repr调试python程序

    一般调试程序的时候都比较倾向print,利用直接打印的方法作出判断,但是print只能打印出结果,对类型无法作出判断.例如: a = 5 b = ' print(a) print(b) 结果为: 5 ...

  5. JavaScript 设计模式之----单体(单例)模式

    设计模式之--单体(单例)模式 1.介绍 从本章开始,我们会逐步介绍在JavaScript里使用的各种设计模式实现,在这里我不会过多地介绍模式本身的理论,而只会关注实现.OK,正式开始. 在传统开发工 ...

  6. 20.如何从app业务逻辑提炼api接口

    在app后端的工作中,设计api是一个很考验设计能力的工作.在项目的初始阶段,只知道具体的业务逻辑,那怎么把业务逻辑抽象和提炼,设计出api呢?通过阅读本文,可解答以上疑惑. 在本文中,是用以前做过的 ...

  7. mongoDB身份验证

    超级管理员 为了更安全的访问mongodb,需要访问者提供用户名和密码,于是需要在mongodb中创建用户 采用了角色-用户-数据库的安全管理方式 常用系统角色如下:root:只在admin数据库中可 ...

  8. 问题(一) DebugAugmenter

    问题: DebugAugmenter的作用是什么?是任何一个自创建的变量都可以取代它还是它有特定含义? public class DebugAugmenter Test { @Test public ...

  9. create_volume.go

    package api import (     "net/http"     "io/ioutil"     "errors"     & ...

  10. Python多版本管理-pyenv

    经常遇到这样的情况: 系统自带的Python是2.x,自己需要Python 3.x,此时需要在系统中安装多个Python,但又不能影响系统自带的Python,即需要实现Python的多版本共存,pye ...