《深入理解计算机系统》-AttackLab学习笔记

这个实验在第三章学完后就可以做了,内容主要就是3.10.3和3.10.4的部分,主要目标是熟悉两种攻击程序的方式:代码注入(Code Injection,CI)和面向返回编程(Return Oriented Programming,ROP)

Let’s Hack!


实验说明

首先还是提醒一下,每个人的程序可能是不一样的,所以答案只是参考,但方法是通用的

  • 目标程序:ctargetrtarget,分别是在CI阶段和ROP阶段存在漏洞的程序。使用-q选项来避免将分数发到服务器,否则会出现illegal host错误。使用-i选项来读取文件作为输入(很重要),因为我们的攻击都是用二进制文件进行攻击

  • 实验原理:在两个目标程序的源代码中,test程序都调用了getbuf函数,这个函数读取我们的输入并保存在栈上,而这个函数的栈帧只开辟了有限的空间,因此存在返回地址被覆盖的漏洞。我们通过输入一定的exploit string就可以让函数返回后不回到test,而是到我们为它安排的地址。如果不是很明白的话可以参考书上的练习题3.46,很有帮助,我自己的理解大概是这样的:
    《深入理解计算机系统》-AttackLab学习笔记_第1张图片

  • hex2raw:这个工具可以将写好的16进制的exploit string转换成能传给目标程序的文件,我们编写的exploit string应该像真实的内存一样,每个字节之间用空格隔开并使用小端序,举例,假设调用getbuf时栈指针rsp的地址为0x12345678

    00 00 00 00 00 00 00 00 /* 0x12345678 */
    00 00 00 00 00 00 00 00 /* 0x12345680 */
    ef cd ab 89 00 00 00 00 /* 0x12345688 */
    

    上面的exploit string会在0x12345688处写入0x89abcdef,如果我们的返回地址正好是0x12345688那么代码就会运行到我们注入的这个地址。hex2raw支持C风格的注释,所以可以使用/**/让你的答案更有可读性,但注意要用空格全部隔开,更多细节可以参考pdf中的附录A


CI

这种攻击方式主要是通过改写栈空间的数据,让程序执行我们希望它执行的代码。我们可以先自己编写汇编指令,将它进行汇编后再进行反汇编,就可以得到指令的字节表示形式了,具体可以参考附录B

Level1

第一阶段的目标是调用touch1,我们只需要找到touch1的地址,把它注入到getbuf的返回地址处即可,不需要额外的代码

首先可以用objdump -d ctarget > dis.s获得ctarget的汇编代码并保存在dis.s中,然后找到touch1的地址
《深入理解计算机系统》-AttackLab学习笔记_第2张图片
因此我们直接注入c0 17 40即可,注意是小端序。然后我们查看一下getbuf的汇编代码:
《深入理解计算机系统》-AttackLab学习笔记_第3张图片
可以看到栈指针减少了0x28也就是40,所以我们在40个字节之后注入地址即可,最终的exploit.txt如下:
《深入理解计算机系统》-AttackLab学习笔记_第4张图片
用如下的命令将它转换成可以传给ctarget的文件:

./hex2raw < exploit.txt > exploit-raw.txt

然后用ctarget读入

./ctarget -q -i exploit-raw.txt

这两步也可以合成一步

cat exploit.txt | ./hex2raw | ./ctarget -q

效果如下:

你可能感兴趣的:(CSAPP读书笔记)