实验代码

https://github.com/TouwaErioH/security/tree/master/stack%20overflow

实验目的

Buffer over flow 漏洞利用实践

实验内容

编写exploits攻击漏洞程序

实验结果

获取具有root权限的shell

实验环境

Windows10

Oracle VM VirtualBox

Ubuntu16.04 i386

Sudo apt-get prelink

Exploits 攻击程序。Vulnerables 目标程序

准备

Vulnerable 文件夹 编译,安装   Make  Sudo make install

安装到了根目录 /tmp 文件夹。

Exploits 编译   Make

先关闭地址随机化 sudo sh -c "echo 0 > /proc/sys/kernel/randomize_va_space"

七、实验步骤

1.vul[1-6]的简单描述

1.1 vul 1

查看Vul1 源代码可知其中存在strcpy函数,当各种保护机制未开启时,容易利用strcpy实现缓冲区溢出。Vul 1 没有做边界的检查,直接拷贝argv[1]数组到buf数组,当argv[1]数组大小大于buf数组时,超出的字节会覆盖掉foo函数的ebp,返回地址等内容,当函数返回时读取返回地址,只要修改返回地址为shellcode的起始地址,就可以执行shellcode,进而获得shell。

2.shellcode(构造过程)

原理是运行/bin/sh 来得到shell,构造过程是将具有运行/bin/sh的C代码转换成有相同功能的机器码。注意代码中用到  0  的地方改成用 xor  eax,eax,这样可以避免复制字符串时遇到/0 中断。

下面的shellcode长度为45字节(不含/0)

/*

* Aleph One shellcode.

*/

static const char shellcode[] =

"\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b"

"\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd"

"\x80\xe8\xdc\xff\xff\xff/bin/sh";

3.exploit[1-6]攻击方式描述(攻击原理,payload构造方式,攻击过程描述)

3.1 exploit1

查看exploit1,框架已经搭建好,只需要替换其中的”hi there”为设计的payload

Payload由三部分组成,shellcode(获取shell的机器码),目标地址(返回地址设置为shellcode),nop(填充,使得能返回到shellcode)

下面是shellcode。执行exec(“/bin/sh”)的机器码。执行/bin/sh 可以获得root权限

如图,payload要覆盖调buf数组,长度要大于256,所以需要填充nop

vul1为例介绍如何获得地址

安装git-peda

其含有漏洞的代码如下。由源码可见Buf256字节,向上覆盖foo的返回地址还需要覆盖ebp(4字节),ret(4字节),所以payload需要256+8=264字节

Exploits.c先填充shellcode,再填充nop,最后填充地址

Shellcode 45字节(除最后的\0)

先填充shellcode再填充nop是因为内存中数组地址从低到高,栈方向从高到低,覆盖掉返回地址后返回到shellcode地址。

45+(256-45)*NOP覆盖到buf,+4nop覆盖ebp,最后四字节覆盖ret

修改exploits1.c

修改exploits1.c后重新make生成生成新的exploit可执行文件

这里最后覆盖的地址0xbffffc4c获取方法见下。一开始随便填都可以。

在vul目录下,调试vul1 可执行文件。

含有strcpy的函数为bar(第一句直接调用),foo调用,先找到foo调用bar的地址

找到调用bar位置为0x080484fc

换到exploitmulu,调试

gdb –e exploit1 –s /tmp/vul1      执行exploit1,从指定文件vul1读取符号表

  • catch exec   在exploit执行exec的位置设断点
  • r
  • b *0x80484fc
  • c
  • ni
  • find 0xd231c931

报错"/home/erio/Desktop/proj1/exploits/exploit1" is not a core dump: File format not recognized

检查源文件meiwent。发现是输入的时候直接copy的,可能有干扰。手打gdb -e exploit1 -s /tmp/vul1就没问题了

Run

执行到exec刚刚知道bar的地址是 0x080484fc,在这里设置断点,c运行

此时暂停到foo调用bar的位置,因为strcpy就在bar第一句,只执行一步就可以得到地址。

使用ni 进入bar函数内部

现在在strcpy内部

Payload中最开始是shellcode,shellicode前4字节为 0x895e1feb (注意小端)

Find 0x895e1feb

找到地址在0xbffff1c4c,所以刚刚的payload最后四字节填 0xbfff1c4c。因为payload最后四字节溢出覆盖掉了foo的返回地址(不是bar的),strcpy是直接填了foo中buf。然后bar结束,栈回收只是esp,ebp改变,shellcode其实还在内存中,foo返回时eip跳到shellcode起始处,然后把shellcode的字符串当成机器码执行,eip++。

正确修改payload最后四位为0xbffff1c4c后,执行exploit1,效果如下,得到了root权限

还可以参考:

https://blog.csdn.net/qq_36779888/article/details/89682728

缓冲区溢出实验 1 strcpy的更多相关文章

  1. 使用Linux进行缓冲区溢出实验的配置记录

    在基础的软件安全实验中,缓冲区溢出是一个基础而又经典的问题.最基本的缓冲区溢出即通过合理的构造输入数据,使得输入数据量超过原始缓冲区的大小,从而覆盖数据输入缓冲区之外的数据,达到诸如修改函数返回地址等 ...

  2. 2017-2018-2 20179215《网络攻防实践》seed缓冲区溢出实验

    seed缓冲区溢出实验 有漏洞的程序: /* stack.c */ /* This program has a buffer overflow vulnerability. */ /* Our tas ...

  3. SEED缓冲区溢出实验笔记

    缓冲区溢出实验(Linux 32位) 参考教程与材料:http://www.cis.syr.edu/~wedu/seed/Labs_12.04/Software/Buffer_Overflow/ (本 ...

  4. 20191310Lee_yellow缓冲区溢出实验

    缓冲区溢出实验 1.什么是缓冲区溢出 ​ 缓冲区溢出是指程序试图向缓冲区写入超出预分配固定长度数据的情况.这一漏洞可以被恶意用户利用来改变程序的流控制,甚至执行代码的任意片段.这一漏洞的出现是由于数据 ...

  5. 与内存有关的那些事儿(数组分配空间不够,导致缓冲区溢出,从而strcpy会出现异常)

    这日,我写下如下代码:#include <iostream>int main(void){ char *p = new char[5]; char *t = new char[5]; st ...

  6. 2018-2019-2 20165232《网络对抗技术》Exp1 缓冲区溢出实验

    2018-2019-2 20165232<网络对抗技术>Exp1 缓冲区溢出实验 实验点1:逆向及Bof基础实践 实践任务 用一个pwn1文件. 该程序正常执行流程是:main调用foo函 ...

  7. 2018-2019-2 20165225《网络对抗技术》Exp1 缓冲区溢出实验

    2018-2019-2 20165225<网络对抗技术>Exp1 缓冲区溢出实验 声明 虽然老师在邮箱中要求要把虚拟机名改为个人名字缩写,但是我的kali好像不是很听话...重启数次也没用 ...

  8. Kali学习笔记33:Linux系统缓冲区溢出实验

    之前做过一个Windows应用SLmail的缓冲区溢出的实验 这次来做一个Linux平台的缓冲区溢出实验: 缓冲区溢出是什么? 学过汇编的应该知道,当缓冲区边界限制不严格时,由于变量传入畸形数据或程序 ...

  9. Kali学习笔记21:缓冲区溢出实验(漏洞发现)

    上一篇文章,我已经做好了缓冲区溢出实验的准备工作: https://www.cnblogs.com/xuyiqing/p/9835561.html 下面就是Kali虚拟机对缓冲区溢出的测试: 已经知道 ...

随机推荐

  1. KeepAlive安装以及简单配置

    操作系统:Centos7.3 一.依赖安装 首先安装相关依赖: yum install -y gcc openssl-devel popt-devel yum -y install libnl lib ...

  2. layui表格前端格式化时间戳字段

    layui.use(['util','table'], function(){   var table = layui.table;   var util = layui.util;   //... ...

  3. Linux操作系统相关资料

    玩转Linux操作系统 操作系统发展史 只有硬件没有软件的计算机系统被称之为"裸机",我们很难用"裸机"来完成计算机日常的工作(如存储和运算),所以必须用特定的 ...

  4. 使用remix实现给合约账户转账

    实现内容:从remix上的虚拟账户上转账给自己编写的智能合约账户 前提基础:对solidity有一些基础了解,对以太坊的账户机制有一定了解. 账户 在以太坊中账户的唯一标识是地址(address). ...

  5. 改变JavaScript中函数的内部this指向!

    改变JavaScript中函数的内部this指向! 第一种方法 call call 可以 调用函数 + 改变函数内的this指向! var obj = { name: 'lvhang' } funct ...

  6. OAuth2.0是干什么的?

    OAuth2.0是干什么的? 首先用户有一些数据: 将数据存储在服务器上: 这时候有一个应用要访问数据: 如果这个应用是一个恶意程序呢?所以需要一个检验来判断请求是不是安全的: 如何判断是不是安全的? ...

  7. 1.4.1 对象与JSON转化 1.4.2 JSON与List集合转化 1.1.1 获取json中的属性 day10-05

    1.1.1 对象与JSON转化 @Test public void toJSON() throws IOException{ Jedis jedis = new Jedis("192.168 ...

  8. 那些我们不知道的 Python 免费学习资料

    作者:小R编辑:AI 兔兔 Python 语言因为其易学,以及强大的功能,是很多刚开始学习编程的入门语言的选择之一. Python 语言被列入中小学教材后引起了越来越多人的关注. 希望孩子学习编程的家 ...

  9. POJ 3461__KMP算法

    [题目描述] 法国作家乔治·佩雷克(Georges Perec,1936-1982)曾经写过一本书,<敏感字母>(La disparition),全篇没有一个字母'e'.他是乌力波小组(O ...

  10. 最简单直接地理解Java软件设计原则之开闭原则

    写在前面 本文属于Java软件设计原则系列文章的其中一篇,后续会继续分享其他的原则.想以最简单的方式,最直观的demo去彻底理解设计原则.文章属于个人整理.也欢迎大家提出不同的想法. 首先是一些理论性 ...