文章目录

  • 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

  • 至此,字符串的地址已经被放进了%rdi中,画个栈图理清一下思路

    可知偏移量为8*9=72,即为0x48

  • 制作相应的字符文件attack5.txt

  • 执行,得

    成功

小结

在实验过程中对于栈有了更加深刻的理解,同时认识到了缓冲区溢出的危害。对于gcc和objdump的使用更加熟练

深入理解计算机系统|Attack Lab相关推荐

  1. 深入理解计算机系统(CSAPP)含lab详解 完结

    文章目录 深入理解计算机操作系统-第一章 1.1 信息就是位 + 上下文 1.2 程序被其他程序翻译成不同的格式 1.3 了解编译系统如何工作是大有益处的 1.4 处理器读并解释储存在内存中的指令 1 ...

  2. 《深入理解计算机系统》实验二Bomb Lab下载和官方文档机翻

    前言 <深入理解计算机系统>官网:http://csapp.cs.cmu.edu/3e/labs.html 该篇文章是实验二Bomb Lab的Writeup机翻. 原文:http://cs ...

  3. 《深入理解计算机系统》实验二Bomb Lab

    前言 <深入理解计算机系统>实验二Bomb Lab的下载和官网文档的机翻请看 <深入理解计算机系统>实验二Bomb Lab下载和官方文档机翻 用的调试工具是gdb,用到的指令如 ...

  4. 《深入理解计算机系统》实验四Architecture Lab下载和官方文档机翻

    前言 <深入理解计算机系统>官网:http://csapp.cs.cmu.edu/3e/labs.html 该篇文章是是实验四Architecture Lab中的Writeup(archl ...

  5. 《深入理解计算机系统》Y86-64实验四Architecture Lab环境安装

    前言 第四章提到的Y86-64和实验四Architecture Lab的环境安装. 先从官网下载文件: <深入理解计算机系统>官网:http://csapp.cs.cmu.edu/3e/l ...

  6. 《深入理解计算机系统》:Cache Lab

    第1关:Part A 任务描述 本关任务:完成csim.c文件,实现一个cache simulator,模拟Cache的访问过程.替换算法采用最近最少使用替换策略(LRU). 可参考资料:官网实验文档 ...

  7. CSAPP:Attack lab

    关注公号[逆向通信猿]更精彩!!! 原文地址:https://www.jianshu.com/p/db731ca57342 本文介绍的是CSAPP书籍中的第三个lab: Attack lab.通过这个 ...

  8. csapp attack lab

    实验内容 进行5次攻击,前三个leve为代码注入攻击,后两个为面向返回编程. 实验文件 README.txt:描述目录内容的文件 ctarget:易受代码注入攻击的可执行程序 rtarget:易受面向 ...

  9. 【组队学习】【32期】深入理解计算机系统

    深入理解计算机系统 航路开辟者:李岳昆.易远哲 领航员:初晓宇 航海士:叶前坤.沈豪 基本信息 开源内容:https://github.com/datawhalechina/team-learning ...

  10. 从入门到入土:[SEED-Lab]-幽灵攻击|Spectre Attack Lab|详细说明|实验步骤|实验截图

    此博客仅用于记录个人学习进度,学识浅薄,若有错误观点欢迎评论区指出.欢迎各位前来交流.(部分材料来源网络,若有侵权,立即删除) 本人博客所有文章纯属学习之用,不涉及商业利益.不合适引用,自当删除! 若 ...

最新文章

  1. unity天空盒渐变_「是日美好事物」野兽派带来“金色眼泪”治愈新香,LV耳机印上蓝色天空...
  2. 可以从max中导出静态模型并渲染了。
  3. PriorityQueue和queue的区别
  4. 循环队列-队列的顺序表示和实现
  5. Office SharePoint Server 2007
  6. Java EE 6示例– Galleria –第3部分
  7. LeetCode--palindrome-number回文数
  8. NGINX下配置CACHE-CONTROL
  9. esp mounter pro_对比 | 以大欺小?剑指宋Pro和哈弗H6,欧尚X7的黑马潜质从何而来?...
  10. React中JSX的理解
  11. oracle01144,ORA-01144
  12. 今年别想了!iPhone 12系列没有120Hz高刷屏
  13. SpringBoot学习(二)——Spring的Java配置方式
  14. 水经注万能地图下载器如何导出透明TIF标签
  15. JSP——JSP介绍以及运行原理
  16. sa结构组网方式_NSA和SA两种组网方式均为5G
  17. medusa详细使用教程
  18. 系统架构设计方法论——IBM架构解决方案设计
  19. Python中的os.chdir()函数:改变当前工作目录
  20. Kafka3.0 提交offset方式

热门文章

  1. wordpress自动发布_如何在WordPress中跟踪发布想法
  2. 中国工程院院士邬贺铨:谈华为事件
  3. 大数据在电力行业的应用前景
  4. Johnson–Lindenstrauss Lemma(2)attention
  5. 特斯拉供应链全景图详细分析!
  6. 量子计算机验证量子理论,物理学家使用量子计算机验证“时间倒转”
  7. 企业微信设置欢迎语的方法以及应用
  8. 在好友QQ空间留言板上留图片
  9. 2020年因果推断综述《A Survey on Causal Inference》
  10. C语言作业(软件工程),C语言作业(软件工程)