逆向及Bof基础实践

1.1 实践目标

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

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

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

我们将学习两种方法

  • 利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。

  • 手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。

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

  • (1)运行原本不可访问的代码片段

  • (2)强行修改程序执行流

  • (3)以及注入运行任意代码

1.2 基础知识

该实践需要同学们熟悉Linux基本操作,能看懂常用指令,如管道(|),输入、输出重定向(>)等。

  • 管道是Linux中很重要的一种通信方式,是把一个程序的输出直接连接到另一个程序的输入,数据只能由一个进程流向另一个进程(其中一个读管道,一个写管道);如果要进行双工通信,需要建立两个管道;管道只能用于父子进程或者兄弟进程间通信。

  • Linux重定向操作符 功能描述

  >将命令输出写入文件或设备,而不是命令提示符或句柄

  < 从文件而不是从键盘或句柄读入命令输入

  >> 将命令输出添加到文件末尾而不删除文件中已有的信息

  >& 将一个句柄的输出写入到另一个句柄的输入中

  <& 从一个句柄读取输入并将其写入到另一个句柄输出中

  | 从一个命令中读取输出并将其写入另一个命令的输入中;也称为管道操作符

能看得懂汇编、机器指令、EIP、指令地址。

汇编指令

MOV传送字或字节.

MOVSX先符号扩展,再传送.

MOVZX先零扩展,再传送.

PUSH把字压入堆栈.

POP把字弹出堆栈.

PUSHA把AX,CX,DX,BX,SP,BP,SI,DI依次压入堆栈.

POPA把DI,SI,BP,SP,BX,DX,CX,AX依次弹出堆栈.

机器指令

  • 是CPU能直接识别并执行的指令,它的表现形式是二进制编码。机器指令通常由操作码和操作数两部分组成,操作码指出该指令所要完成的操作,即指令的功能,操作数指出参与运算的对象,以及运算结果所存放的位置等。

寄存器

  • EIP寄存器里存储的是CPU下次要执行的指令的地址。

  • EBP寄存器里存储的是是栈的栈底指针,通常叫栈基址。

  • ESP寄存器里存储的是在调用函数fun()之后,栈的栈顶。

实验中用到的linux指令

  • cp:复制

  • objdump -d test:反汇编test

  • info r:查看寄存器

  • %!xxd:查看二进制文件

会使用gdb,vi。

1.3实践

备份

功能

  • foo函数功能如下

方法一:直接修改程序机器指令,改变程序执行流程

修改可执行文件,将其中的call指令的目标地址由d7ffffff变为c3ffffff

  • vi进入文件看到的则是乱码,如图

  • 输入:%!xxd将显示模式切换为16进制模式,如图

  • 输入/e8 d7查找需要改动的地方,按i进入文本编辑模式,改为e8 c3

  • 存盘退出vi,:wq再运行结果如图

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

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

  • 通过观察foo函数的汇编代码,我们可以发现其存在Buffer overflow漏洞,

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

进入gdb调试

  • 观看eip的值,是ASCII 1234,也就是说我们输入的1234覆盖了它的地址,所以我们只需要将getshell的内存地址替换这4个字符,就可以达到程序向getshell函数转移的目的。

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

  • getShell的内存地址,在未启用ALSR的主机上是固定不变的,通过反汇编时可以看到,即0804847d。

  • 接下来要构造字符串的一个文件,perl -e 'print "12345678123456781234567812345678\x7d\x84\x04\x08\x0a"' > input(\0a代表回车键)

  • (cat input; cat) | ./20145218,将input文件作为输入:

20145240《网络对抗》逆向及Bof基础实践的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    20145302张薇 <网络对抗技术>逆向及BOF基础实践 实验内容 实践对象:名为20145302的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单 ...

随机推荐

  1. json序列化懒加载问题

    如果框架使用了json序列化对象,当配置了hibernate懒加载时,可能会抛出异常,或者出现N+1的问题,或者出现无限循环的问题.网上很多解决方案, 基本是这些:@JsonIgnore忽略可能出问题 ...

  2. myeclipse 代码提示(alt+/)

    windows -->preference-->general-->keys找到 alt+/ 解除绑定 windows -->preference-->general-- ...

  3. Android 满屏显示自定义的View,并进行移动

    新建一个类,继承View package com.topcrab.mygame; import android.content.Context; import android.graphics.Bit ...

  4. 第八周课上测试ch03

    测试-1-ch03 任务详情 通过输入gcc -S -o main.s main.c,将下面c程序"week04学号.c"编译成汇编代码 int g(int x){ return ...

  5. Exchange Database Status(Copy Status ,Content Index State,QueueLength,Move Status...)

    Copy Status Description Mounted The active copy is online and accepting client connections. Only the ...

  6. 【keras框架】

    更高级别的封装.更简单的api,以tensorflow.theano为后端,支持更多的平台 读取网络模型后生成网络结构图 读取 from keras.models import load_model ...

  7. Python并行编程(五):线程同步之信号量

    1.基本概念 信号量是由操作系统管理的一种抽象数据类型,用于在多线程中同步对共享资源的使用.本质上说,信号量是一个内部数据,用于标明当前的共享资源可以有多少并发读取. 同样在threading中,信号 ...

  8. docker+MySQL+读写分离

    一.拉取mysql镜像文件docker pull mysql二.查看镜像docker images三.创建配置文件目录mkdir /data/docker/mysql/{master,slave} - ...

  9. centos 解决error: rpmdbNextIterator问题 (转)

    昨天重装RedHat4以后出现了下面这个问题 [root@RedHat4 ~]# rpm -qa |grep vimerror: rpmdbNextIterator: skipping h#      ...

  10. MongoDB简单CRUD场景

    MongoDB简单CRUD命令操作 (1)新建数据库:use 数据库名 (2)显示所有数据库:show dbs; (3)新建集合(两种方式)  隐式创建:在创建集合的同时往集合里面添加数据---db. ...