20145302张薇 《网络对抗技术》逆向及BOF基础实践

实验内容

  • 实践对象:名为20145302的linux可执行文件。
  • 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串。
  • 该程序同时包含另一个代码片段,getShell,会返回一个可用Shell。但是正常情况下这个代码是不会被运行的。我们实践的目标就是想办法运行这个代码片段。
  • 实践两种方法:
    • 手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。
    • 利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。

实验原理

  • 缓冲区溢出:计算机程序一般都会使用到一些内存,这些内存或是程序内部使用,或是存放用户的输入数据,这样的内存一般称作缓冲区。溢出是指盛放的东西超出容器容量而溢出来了,在计算机程序中,就是数据使用到了被分配内存空间之外的内存空间。而缓冲区溢出,简单的说就是计算机对接收的输入数据没有进行有效的检测(理想的情况是程序检查数据长度并不允许输入超过缓冲区长度的字符),向缓冲区内填充数据时超过了缓冲区本身的容量,而导致数据溢出到被分配空间之外的内存空间,使得溢出的数据覆盖了其他内存空间的数据。

实践1、手工修改可执行文件

  • 先运行一下此文件,应该实现的是foo函数的功能:

  • 将此文件进行反汇编:

- 第一列表示内存中的地址,第二列是机器指令的十六进制代码,第三列是反汇编后的汇编指令。
- 在main函数中我们发现有一条call指令调用了地址为8048491的foo函数
- 为了使函数不运行foo函数,二是运行getshell函数,我们想要把main函数的call指令后的地址改为getshell函数的地址。
- call指令的机器代码为“e8 d7 ffffff”,为了调用为getshell的地址,我们需要将“e8 d7 ffffff”改为“getshell-80484ba”对应的补码,即“e8 c3 ffffff”。
  • 开始手动修改可执行文件

  • 利用vi进入文件:

  • 此时文件界面显示的是ASCⅡ码形式,我们输入命令:%!xxd,将显示模式切换为16进制模式

  • 由于数据太多,我们使用查找功能,输入“/e8 d7”,查找我们所需修改的内容:

  • 利用vi的修改功能,点击i键进入插入模式,并将d7修改为c3:

  • 使用命令:%!xxd -r将16进制转换为原格式,随后再用:wq命令存盘退出vi。(这一步很重要,否则无法成功运行)

  • 验证运行是否修改成功:

  • 再次使用反汇编指令观察机器代码的改变:

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

  • 反汇编查看文件汇编代码

  • 我们发现foo函数只为该文件留了38字节的缓冲区,超出部分会造成溢出,我们的目标是覆盖返回地址

  • 进入gdb模式用r来运行,再使用info r来查看寄存器中的值。在此使用测试数字:1111111122222222333333334444444455555555.(我们完全可以使用其他数字来进行测试,只要自己易于区分即可)

  • 我们观察到eip的值为"0x35353535 0x35353535",而十六进制的35换算成ASCⅡ码是5,由此得知溢出部分是在5这一部分发生的,为了进一步详细确认地址发生覆盖的位置,我们将测试数字更变为:1111111122222222333333334444444412345678

  • 观察得知:eip的值更变为“0x34333231 0x34333231”,换算成ASCⅡ码即为1234。意味着字符串1111111122222222333333334444444412345678中1234那四个位置上的数最终会覆盖到堆栈上的返回地址,进而CPU会尝试运行这个位置的代码

  • 由此,我们将这4个位置上的数替换为getShell的内存地址,就可以让文件运行getShell

  • 确认字节序:

  • 输入我们构造的字符串来进行攻击,验证攻击成功:


Perl是一门解释型语言,不需要预编译,可以在命令行上直接使用。
使用输出重定向“>”将perl生成的字符串存储到文件input中。

实践问题

  • 为何进入vi后,在16进制模式下修改后直接保存退出会导致文件无法运行?

20145302张薇 《网络对抗技术》逆向及BOF基础实践的更多相关文章

  1. 20145304 网络对抗技术 逆向与Bof基础

    20145304 网络对抗技术 逆向与Bof基础 实践目标 学习以下两种方法,运行正常情况下不会被运行的代码: 手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数. 利用foo函数的 ...

  2. 20145317 网络对抗技术 逆向与Bof基础

    20145317 网络对抗技术 逆向与Bof基础 实践要求 1. 掌握NOP,JNE,JE,JMP,CMP汇编指令的机器码 2. 掌握反汇编与十六进制编程器 3. 能正确修改机器指令改变程序执行流程 ...

  3. 20145312《网络对抗》 逆向及Bof基础实践

    20145312 <网络对抗> 逆向及Bof基础实践 1 逆向及Bof基础实践说明 1.1 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:mai ...

  4. 20145308 《网络对抗》 逆向及BOF基础实践 学习总结

    20145308 <网络对抗> 逆向及BOF基础实践 学习总结 实践目的 通过两种方法,实现程序能够运行原本并不会被运行的代码 实践原理 利用foo函数的Bof漏洞,构造一个攻击输入字符串 ...

  5. 20145206邹京儒《网络对抗》逆向及Bof基础实践

    20145206邹京儒<网络对抗>逆向及Bof基础实践 1 逆向及Bof基础实践说明 1.1 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:ma ...

  6. 20145216《网络对抗》逆向及BOF基础实践

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

  7. 20145327 《网络对抗》逆向及BOF基础实践

    20145327 <网络对抗>逆向及BOF基础实践 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任 ...

  8. 20145204《网络对抗》逆向及bof基础实践

    20145204<网络对抗>逆向及bof基础实践 实践目的说明 实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何 ...

  9. 20145208蔡野 《网络对抗》逆向及BOF基础实践

    20145208蔡野 <网络对抗>逆向及BOF基础实践 逆向及Bof基础实践 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函 ...

  10. 《网络对抗》——逆向及Bof基础实践

    <网络对抗>--逆向及Bof基础实践 原理 利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数. 手工修改可执行文件,改变程序执行流程,直接跳转到g ...

随机推荐

  1. 十分钟理解Java中的动态代理

    十分钟理解 Java 中的动态代理   一.概述 1. 什么是代理 我们大家都知道微商代理,简单地说就是代替厂家卖商品,厂家“委托”代理为其销售商品.关于微商代理,首先我们从他们那里买东西时通常不知道 ...

  2. 罗云彬win32汇编教程笔记 子函数的声明, 定义与调用

    在主程序中用call指令来调用子程序. Win32汇编中的子程序也采用堆栈来传递参数,这样就可以用invoke伪指令来进行调用和语法检查工作. 一. 子程序的定义 子程序的定义方式如下所示. 子程序名 ...

  3. LeetCode——Add and Search Word - Data structure design

    Description: Design a data structure that supports the following two operations: void addWord(word) ...

  4. 百度地图api定位和导航简写

    function locate() { // 百度地图API功能 var map = new BMap.Map("allmap"); // 创建Map实例 var point = ...

  5. ASP.NET的页面执行过程

    对于ASP.NET来说,用户访问的页面,都由服务器IIS处理,具体的处理过程如下图: 对于用户模块还是有很多的东西没有写,未完待续...

  6. C#学习笔记之(Hellow,WORLD;常量和变量;键盘输入和输出;数据类型转换;计算器)

    HELLO,WORLD Console.Write 表示向控制台直接写入字符串,不进行换行,可继续接着前面的字符写入. Console.WriteLine 表示向控制台写入字符串后换行. Consol ...

  7. SQL的子查询操作

    对于表中的每一个记录,我们有时候需要提取特殊的或者你需要的记录,要提前做一个表的筛选,之后再对你选出的记录做一个修改,此时你必须使用SQL的子查询操作.如:修改id=5的记录的strContent字段 ...

  8. Python量化教程 常用函数

    # -*- coding: utf-8 -*- # @Author: fangbei # @Date: 2017-08-26 # @Original: price_str = '30.14, 29.5 ...

  9. Django - 常用配置

    一.logging配置 Django项目常用的logging配置 settings.py LOGGING = { 'version': 1, 'disable_existing_loggers': F ...

  10. Python开发【笔记】:git&github 快速入门

    github入门 简介: 很多人都知道,Linus在1991年创建了开源的Linux,从此,Linux系统不断发展,已经成为最大的服务器系统软件了. Linus虽然创建了Linux,但Linux的壮大 ...