深入理解计算机系统|Attack Lab
文章目录
- Code Injection
- Phase_1
- Phase_2
- Phase_3
- R O P
- Phase_4
- Phase_5
- 小结
Code Injection
Phase_1
任务
执行完 getbuf 函数之后不跳转到 test 函数,而是执行 touch1 函数。
分析流程
首先得到getbuf的汇编代码
得知getbuf的缓冲区大小为0x28(即40)。为了使它跳转到touch1,通过缓冲区溢出把栈帧上面的返回地址改掉;填充40字节内容+touch1地址即可。查看touch1的汇编代码
得到touch1地址为0x4017c0。小端排列逆向填充,制作相应的字符文件attack1.txt
执行,得
成功
Phase_2
任务
插入一段代码,使得getbuf()函数返回时,执行touch2(),而不是返回test()
分析流程
分析touch2可知,我们需要把cookie作为参数传入touch2中。
要做的事情有
- 注入代码,修改%rdi使它等于cookie(0x59b997fa)。
- 改变getbuf的返回地址,使其跳转到我们输入的代码块。
- 使注入的代码执行结束后跳转到touch2。
首先观察touch2的汇编代码
得到其地址为0x4017ec。接下来编写注入代码,制作相应文件injection2.s
由于retq函数是从栈顶弹出一个值进行跳转,所以除了要改变%rdi的值,还要我们要压入touch2的首地址。具体代码如下
将其编译得到
我们的代码从栈顶注入,所以还需要得到栈顶指针
在栈的开始位置为注入代码的指令序列,然后填充满至40个字节,在接下来的8个字节,也就是原来的返回地址,填充成注入代码的起始地址,也就是%rsp的地址。为了方便理解,画一下注入后的栈图
制作相应的字符文件attack2.txt
执行,得
成功
Phase_3
任务
在getbuf()函数返回的时候,执行touch3()而不是返回test()。从touch3()可以看出我们需要注入新的代码,让touch3()以为它接收到的参数是自己的cookie的字符串表示。
分析流程
- 首先分析hexmatch得源代码
查阅资料得
sprintf指的是字符串格式化命令,函数声明为 int sprintf(char *string, char *format [,argument,…]);,主要功能是把格式化的数据写入某个字符串中,即发送格式化输出到 string 所指向的字符串。sprintf 是个变参函数。使用sprintf 对于写入buffer的字符数是没有限制的,这就存在了buffer溢出的可能性。
所以我们需要传入的字符串为“
59b997fa
”,通过查阅ASCII表,将其转为16进制序列“35 39 62 39 39 37 66 61 00”。我们要将这个序列赋值给%rdi作为参数传入函数,但是字符串类型无法直接传递,我们要把它存进内存在hexmatch中,由于有
考虑到getbuf栈帧大小,所以把字符串放进getbuf栈帧并不安全。所以考虑将字符串放在test栈帧。剩下的工作就和任务二类似利用gdb得到test的栈顶地址
可知是0x5561dca8再查看touch3的开始地址
可知是0x4018fa编写注入代码,制作相应文件injection3.s
将其编译得到
画出栈图
制作相应的字符文件attack3.txt
执行,得
成功
R O P
首先将farm.c编译,得到一个gadget farm
Phase_4
- 任务和Phase_2相同,但是要使用rop方式进行攻击
- 考虑的攻击方式为:通过缓冲区溢出漏洞将cookie写入栈,然后把它pop到某寄存器,再把它move到%rdi中
- 为方便理解,画出栈图
- 由此我们需要的汇编代码为
popq %rax
movq %rax, %rdi
查表可知指令字节分别为:58,48 89 c7
回到farm中查找,得到
得到两条指令的地址:0x17,0x0e。制作相应的字符文件attack4.txt
执行,得
失败应该是farm里的指令地址出了问题。查询资料得知是没有把farm编译为可执行代码。
重新利用gdb查找指令地址
得到指令地址分别为:0x4019ab,0x4019a2编写字符文件
重新执行
成功
Phase_5
任务和Phase_3相同,但是要使用rop方式进行攻击。
但是由于每一次栈的位置是随机的,不能再像之前直接通过地址来索引字符串的起始地址,考虑先动态获取每次栈顶指针再加上偏移量来索引字符串的地址,再把地址传送到%rdi,调用touch3。
需要做的事情有
- 获取%rsp的地址。
- 获取字符偏移量。
- 计算得到字符串首地址再传送到%rdi。
- 调用touch3。
查找farm,得到
- movq %rsp,%rax 的指令字节为48 89 e0,地址为0x401a06
- movq %rax, %rdi的指令字节为48 89 c7,地址为0x4019a2
- popq %rax的指令字节为58,地址为0x4019cc
- movl %eax, %edx的指令字节为89 c2,地址为0x4019dd
- movl %edx, %ecx的指令字节为89 d1,地址为0x401a70
- movl %ecx, %esi的指令字节为89 ce,地址为0x401a13
- lea (%rdi,%rsi,1),%rax的地址为0x4019d6
- movq %rax, %rdi的指令字节为48 89 c7,地址为0x4019a2
- movq %rsp,%rax 的指令字节为48 89 e0,地址为0x401a06
至此,字符串的地址已经被放进了%rdi中,画个栈图理清一下思路
可知偏移量为8*9=72,即为0x48制作相应的字符文件attack5.txt
执行,得
成功
小结
在实验过程中对于栈有了更加深刻的理解,同时认识到了缓冲区溢出的危害。对于gcc和objdump的使用更加熟练
深入理解计算机系统|Attack Lab相关推荐
- 深入理解计算机系统(CSAPP)含lab详解 完结
文章目录 深入理解计算机操作系统-第一章 1.1 信息就是位 + 上下文 1.2 程序被其他程序翻译成不同的格式 1.3 了解编译系统如何工作是大有益处的 1.4 处理器读并解释储存在内存中的指令 1 ...
- 《深入理解计算机系统》实验二Bomb Lab下载和官方文档机翻
前言 <深入理解计算机系统>官网:http://csapp.cs.cmu.edu/3e/labs.html 该篇文章是实验二Bomb Lab的Writeup机翻. 原文:http://cs ...
- 《深入理解计算机系统》实验二Bomb Lab
前言 <深入理解计算机系统>实验二Bomb Lab的下载和官网文档的机翻请看 <深入理解计算机系统>实验二Bomb Lab下载和官方文档机翻 用的调试工具是gdb,用到的指令如 ...
- 《深入理解计算机系统》实验四Architecture Lab下载和官方文档机翻
前言 <深入理解计算机系统>官网:http://csapp.cs.cmu.edu/3e/labs.html 该篇文章是是实验四Architecture Lab中的Writeup(archl ...
- 《深入理解计算机系统》Y86-64实验四Architecture Lab环境安装
前言 第四章提到的Y86-64和实验四Architecture Lab的环境安装. 先从官网下载文件: <深入理解计算机系统>官网:http://csapp.cs.cmu.edu/3e/l ...
- 《深入理解计算机系统》:Cache Lab
第1关:Part A 任务描述 本关任务:完成csim.c文件,实现一个cache simulator,模拟Cache的访问过程.替换算法采用最近最少使用替换策略(LRU). 可参考资料:官网实验文档 ...
- CSAPP:Attack lab
关注公号[逆向通信猿]更精彩!!! 原文地址:https://www.jianshu.com/p/db731ca57342 本文介绍的是CSAPP书籍中的第三个lab: Attack lab.通过这个 ...
- csapp attack lab
实验内容 进行5次攻击,前三个leve为代码注入攻击,后两个为面向返回编程. 实验文件 README.txt:描述目录内容的文件 ctarget:易受代码注入攻击的可执行程序 rtarget:易受面向 ...
- 【组队学习】【32期】深入理解计算机系统
深入理解计算机系统 航路开辟者:李岳昆.易远哲 领航员:初晓宇 航海士:叶前坤.沈豪 基本信息 开源内容:https://github.com/datawhalechina/team-learning ...
- 从入门到入土:[SEED-Lab]-幽灵攻击|Spectre Attack Lab|详细说明|实验步骤|实验截图
此博客仅用于记录个人学习进度,学识浅薄,若有错误观点欢迎评论区指出.欢迎各位前来交流.(部分材料来源网络,若有侵权,立即删除) 本人博客所有文章纯属学习之用,不涉及商业利益.不合适引用,自当删除! 若 ...
最新文章
- unity天空盒渐变_「是日美好事物」野兽派带来“金色眼泪”治愈新香,LV耳机印上蓝色天空...
- 可以从max中导出静态模型并渲染了。
- PriorityQueue和queue的区别
- 循环队列-队列的顺序表示和实现
- Office SharePoint Server 2007
- Java EE 6示例– Galleria –第3部分
- LeetCode--palindrome-number回文数
- NGINX下配置CACHE-CONTROL
- esp mounter pro_对比 | 以大欺小?剑指宋Pro和哈弗H6,欧尚X7的黑马潜质从何而来?...
- React中JSX的理解
- oracle01144,ORA-01144
- 今年别想了!iPhone 12系列没有120Hz高刷屏
- SpringBoot学习(二)——Spring的Java配置方式
- 水经注万能地图下载器如何导出透明TIF标签
- JSP——JSP介绍以及运行原理
- sa结构组网方式_NSA和SA两种组网方式均为5G
- medusa详细使用教程
- 系统架构设计方法论——IBM架构解决方案设计
- Python中的os.chdir()函数:改变当前工作目录
- Kafka3.0 提交offset方式
热门文章
- wordpress自动发布_如何在WordPress中跟踪发布想法
- 中国工程院院士邬贺铨:谈华为事件
- 大数据在电力行业的应用前景
- Johnson–Lindenstrauss Lemma(2)attention
- 特斯拉供应链全景图详细分析!
- 量子计算机验证量子理论,物理学家使用量子计算机验证“时间倒转”
- 企业微信设置欢迎语的方法以及应用
- 在好友QQ空间留言板上留图片
- 2020年因果推断综述《A Survey on Causal Inference》
- C语言作业(软件工程),C语言作业(软件工程)