BUPT CSAPP lab3 缓冲区溢出

一、实验目的
1.理解C语言程序的函数调用机制,栈帧的结构。
2.理解x86-64的栈和参数传递机制
3.初步掌握如何编写更加安全的程序,了解编译器和操作系统提供的防攻击手段。
3.进一步理解x86-64机器指令及指令编码。
二、实验环境
1.SecureCRT(10.120.11.12)
2.Linux
3.Objdump命令反汇编
4.GDB调试工具
5.。。。。。
三、实验内容
登录bupt1服务器,在home目录下可以找到一个targetn.tar文件,解压后得到如下文件:
README.txt;
ctarget;
rtarget;
cookie.txt;
farm.c;
hex2raw。
ctarget和rtarget运行时从标准输入读入字符串,这两个程序都存在缓冲区溢出漏洞。通过代码注入的方法实现对ctarget程序的攻击,共有3关,输入一个特定字符串,可成功调用touch1,或touch2,或touch3就通关,并向计分服务器提交得分信息;通过ROP方法实现对rtarget程序的攻击,共有2关,在指定区域找到所需要的小工具,进行拼接完成指定功能,再输入一个特定字符串,实现成功调用touch2或touch3就通关,并向计分服务器提交得分信息;否则失败,但不扣分。因此,本实验需要通过反汇编和逆向工程对ctraget和rtarget执行文件进行分析,找到保存返回地址在堆栈中的位置以及所需要的小工具机器码。实验2的具体内容见实验2说明,尤其需要认真阅读各阶段的Some Advice提示。
本实验包含了5个阶段(或关卡),难度逐级递增。各阶段分数如下所示:

四、实验步骤及实验分析
准备工作:
登录bupt1服务器,使用ls命令,发现文件压缩包target334.tar。使用tar -xvf target334.tar解压文件压缩包,得到一个目录target334。使用cd target334命令进入目录,使用ls命令,可看到如下文件
README.txt;
ctarget;
rtarget;
cookie.txt;
farm.c;
hex2raw。
在这里插入图片描述
输入cat README命令,阅读README文件内容,确认文件各文件用途。确认实验分为五个部分,1-3实验位于文件ctarget中,实验4-5位于文件rtarget中
阶段一:代码注入攻击
phase1:
目的:通过缓存区溢出和代码注入调用touch1函数
键入gdb ctarget命令,进入gdb调试器,使用disas test,观察test函数的汇编代码,发现其调用了getbuf函数,使用disas命令,查看getbuf函数,发现缓冲区大小为0x28,故需要四十个字节的数据对其进行填充,
在这里插入图片描述在这里插入图片描述
缓冲区后为函数返回地址。因为攻击目标是调用touch1函数,故使用disas touch1命令,发现touch1函数起始地址为0x0040182f,故需要用0x40182f覆盖返回地址。
在这里插入图片描述
另外,x86-64机器采用小端法存储,因此需要在缓冲区填满后,用2f 18 40 00 覆盖内存。所以,创建attack1文件存储原数据,answer2文件存储转化后数据,采用下图数据进行代码注入,无效数据使用66填充。
在这里插入图片描述
采用管道输入,将数据通过hex2raw程序转化后输入ctarget程序,攻击成功,第一个实验结束。
在这里插入图片描述
在这里插入图片描述
阶段二:代码注入攻击
phase2:
目的:通过缓存区溢出和代码注入调用touch2函数
由phase1得,发现缓冲区大小为0x28,后为返回地址。键入disas touch2,观察touch2函数的汇编代码,发现,touch2函数传入一个参数存储在%edi中,该参数需要和cookie值相同.
在这里插入图片描述
随后发现在进行比较操作前,touch函数中没有修改%edi内部值的操作
因此,我们需要注入代码对%edi的操作进行修改,对其赋予cookie值0x45374fee
对应汇编指令为:
mov $0x45374fee, %rdi
该操作应填入缓存区
为了执行这条指令,覆盖的返回地址应对应这条指令在缓存区内的地址
缓存区起始地址为:
在这里插入图片描述
为了进入touch2函数,需要在缓存区内补充指令
pushq $0x401863
ret
将上述汇编代码转换得:
48 c7 c7 ee 4f 37 45 68 63 18 40 00 c3
故所需注入代码为:
在这里插入图片描述
将代码存入attack2文件,采用管道输入,转化后的代码存入answer2文件,数据通过hex2raw程序转化后输入ctarget程序,攻击成功,第二个实验结束。
在这里插入图片描述
阶段三:代码注入攻击
phase3:
目的:通过缓存区溢出和代码注入调用touch3函数
由phase1得,发现缓冲区大小为0x28,后为返回地址。键入disas touch3,观察touch3函数的汇编代码,发现,touch3函数传入一个参数存储在%edi中。
在这里插入图片描述
随后touch3函数调用hexmatch函数,hexmatch函数需要传入两个参数,第一个参数值为cookie值,第二个参数值是touch3接受到的参数 。
在这里插入图片描述
使用disas hexmatch命令,观察其汇编代码,发现,其程序可能会造成getbuf产生的缓冲区内的数据。先覆盖getbuf函数的返回值,使之调用touch3函数。后运行程序,观察hexmatch函数调用前后栈内数据的变化。发现hexmatch函数调用前后0x5560f300-0x5560f30f区域内的数据没有变化。0x5560f300-0x5560f307紧接缓冲区,此为getbuf函数返回地址。
在这里插入图片描述
在这里插入图片描述
在对hexmatch函数进行分析,发现,其第一个参数值为cookie值,第二个参数为一个地址,该地址内的值应为cookie值的ASCII码十六进制表示。所以,应将传入touch3的存储在寄存器%rdi内的值改为一个指向存有cookie值ASCII码十六进制表示的地址。有之前的分析可得,0x5560f308-0x5560f30f内的数据在hexmatch调用前后未发生变化,可以用来存储cookie值ASCII码十六进制表示。
故可得如下汇编指令:
mov $0x5560f308, %rdi
将该命令填入缓存区
为了执行这句汇编命令,需将缓存区后的返回地址改为:0x5560f2d8(缓存区起始)
为了调用touch3函数,需要在缓存区内加入汇编指令
pushq $0x40197c
ret
而cookie的ASCII码十六进制形式为:34 35 33 37 34 66 65 65
故注入代码为:
在这里插入图片描述
将代码存入attack3文件,采用管道输入,转化后的代码存入answer3文件,数据通过hex2raw程序转化后输入ctarget程序,攻击成功,第三个实验结束。
在这里插入图片描述
阶段四:面向返回编程
phase4:通过面向返回编程调用touch2函数
由phase2得,发现缓冲区大小为0x28,后为返回地址。键入disas touch2,观察touch2函数的汇编代码,发现,touch2函数传入一个参数存储在%edi中,该参数需要和cookie值相同.
在这里插入图片描述
因为二进制序列48、89、c7对应movq %rax ,%rdi
c3 对应ret
在程序中有gadget farm代码段,需要利用start_farm和end_farm之间的gadget来执行攻击。
所以,需要利用gadget farm中的代码,改变rdi的值 为cookie,后调用touch2函数
可得下面这些函数中可获取所需指令:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

得:指令集
401a37: pop %rax
401a68: mov %rsp,%rax
401a44: mov %rax,%rdi
401a7b: movl %edx.%esi
401a9d: movl %edx.%esi
401aab: movl%eax,%ecx
401adb: movl%ecx,%edx
401a5b: lea(%rdi,%rsi,%1), %rax
要调用touch2 函数并将传入参数修改为cookie值,需要操作:
pop %rax ret gadget1
mov %rax,%rdi ret gadget2
所以,用gadget1的起始地址覆盖getbuf的原返回地址,后接cookie值和gadget2的起始地址,最后接touch2的地址,向touch2传入一个值为cookie的参数。
所以可得攻击指令:
在这里插入图片描述

将代码存入attack4文件,采用管道输入,转化后的代码存入answer4文件,数据通过hex2raw程序转化后输入ctarget程序,攻击成功,第四个实验结束。

在这里插入图片描述

阶段五:面向返回编程
phase5:通过面向返回编程调用touch3函数
由phase3得,,发现缓冲区大小为0x28,后为返回地址。随后touch3函数调用hexmatch函数,hexmatch函数需要传入两个参数,第一个参数值为cookie值,第二个参数值是touch3接受到的参数,该参数是一个指向存有cookie值的ASCII码十六进制表示的地址
在这里插入图片描述

同phase3,本题需要修改传入touch3的参数,修改该参数指向一个地址,且该地址内存有cookie值的ASCII码十六进制表示。
所以本题思路为:先填满缓冲区,再利用工具集,先将栈顶地址存入寄存器,再输入一个偏移值,根据栈顶位置和偏移值确定一个地址,在该地址内存有cookie值的ASCII码十六进制表示。随后将该地址作为参数传入touch3函数。
利用phase4得到的工具集列表,可得指令为:
mov %rsp,%rax ret gadget1
mob %rax,%rdi ret gadget2
pop %rax ret gadget3
movl %eax ,%ecx ret gadget4
movl %ecx ,%edx ret gadget5
movl %edx ,%esi ret gadget6
mea (%rsi,%rdi,1) %rax ret gadget7
mov %rax,rdi ret gadget8
可得攻击代码为
在这里插入图片描述

将代码存入attack5文件,采用管道输入,转化后的代码存入answer5文件,数据通过hex2raw程序转化后输入ctarget程序,攻击成功,第五个实验结束。
在这里插入图片描述

  • 10
    点赞
  • 62
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值