🌳1. CSAPP与AttackLab简介
🌼1.1 CSAPP
《CSAPP》是指计算机系统基础课程的经典教材《Computer Systems: A Programmer's Perspective》,由Randal E. Bryant和David R. O'Hallaron编写。该书的主要目标是帮助深入理解计算机系统的工作原理,包括硬件和软件的相互关系,其涵盖了计算机体系结构、汇编语言、操作系统、计算机网络等主题,旨在培养学生系统级编程和分析的能力。
🌼1.2 AttackLab
target1实验通常与CS:APP书中的“Buffer Overflow Attack”相关。这个实验旨在教授计算机系统的安全性,防止攻击者定位攻击和锻炼使用金丝雀防护,特别是关于缓冲区溢出漏洞的理解和利用。在这个实验中,尝试利用缓冲区溢出漏洞来修改程序的执行流程,从而实现未授权的操作,比如执行恶意代码或获取系统权限。要求深入了解程序内存布局、堆栈和函数调用等概念,并学会利用输入缓冲区溢出漏洞来修改程序行为,这有助于理解系统安全中的一些基本原则和漏洞。
资源获取:关注文末公众号回复 CSAPP AttackLab实验
🌳2. AttackLab
🌼2.1 实验环境
- VMware Workstation虚拟机环境下的Ubuntu 64位。
🌼2.2 实验过程
实验准备阶段:首先需要使用ubuntu联网环境跳转到链接下载实验所需的attacklab:attacklab源文件
下载target1压缩包并输入
tar –xvf target1.tar
进行解压缩,进入该目录所有文件如下所示:
当前提供材料包含一个攻击实验室实例的材料:
1.ctarget
带有代码注入漏洞的Linux二进制文件。用于作业的第1-3阶段。
2.rtarget
带有面向返回编程漏洞的Linux二进制文件。用于作业的第4-5阶段。
3.cookie.txt
包含此实验室实例所需的4字节签名的文本文件。(通过一些Phase需要用到的字符串)
4.farm.c
rtarget实例中出现的gadget场的源代码。您可以编译(使用标志-Og)并反汇编它来查找gadget。
5.hex2raw
生成字节序列的实用程序。参见实验讲义中的文档。(Lab提供给我们的把16进制数转二进制字符串的程序)
在终端处输入命令
tar -xvf target1.tar
将压缩包解压如下:
图3-2
实验过程阶段:
使用
objdump -d ctarget > ctarget.asm
objdump -d rtarget > rtarget.asm
对ctarget以及rtarget进行反汇编,得到ctarget.asm和rtarget.asm。
在官方文档的目标程序给出,CTARGET和RTARGET都从标准输入读取字符串。它们使用下面定义的函数getbuf来执行此操作:
函数Gets类似于标准库函数gets—它从标准输入中(从缓冲区)读取字符串 (以’ \n '或文件结束符结束) 并将其(连同空结束符)存储在指定的目的地。即空格/Tab/回车可以写入数组文本文件,不算作字符元素, 不占字节,直到文件结束, 如果是命令行输入的话,直到回车结束(区别getchar ():是在输入缓冲区顺序读入一个字符 (包括空格、回车和 Tab)结束,scanf:空格/Tab/回车都当作结束。函数Gets()无法确定它们的目标缓冲区是否足够大,以存储它们读取的字符串。它们只是复制字节序列,可能会超出在目的地分配的存储边界(缓冲区溢出)对应汇编代码:
因为Ctarget就是让我们通过缓冲区溢出来达到实验目的,所以可以推断sub $0x28,%rsp的40个字节数就等于输入字符串的最大空间,如果大于40个字节,则发生缓冲区溢出(超过40个字节的部分作为函数返回地址,如果不是确切对应指令的地址,则会误入未知区域,报错:
Type string:Ouch!: You caused a segmentation fault!段错误,可能访问了未知额内存)
🌼2.3 level 3
涉及代码注入攻击,但传递一个字符串作为参数。
在文件ctarget中,有用于函数hexmatch和touch3的代码,具有以下C表示:
任务是让CTARGET执行touch3的代码,而不是返回测试。必须让它看起来像touch3,就好像已经传递了cookie的字符串表示作为参数。
🌻2.3.1 解决思路
由文档可知,操作指令应包括:
1.让%rdi指向字符串cookie的起始地址。
2.跳转到touch3函数
字符串cookie应该用字节表示,输入命令man ascii查看所需字符的字节表示,0x59b997fa对应16进制为:35 39 62 39 39 37 66 61(不显示0x)。
文档中的advice中需要注意的是:
翻译为:当调用函数hexmatch和strncmp时,它们会将数据推送到堆栈上,从而覆盖内存中保存getbuf使用的缓冲区的部分。因此,您需要小心放置cookie的字符串表示的位置。
说明在Test3中会push数据进入堆栈,所以需要注意cookie字符串的存放位置,因为覆盖了保存getbuf使用的缓冲区的内存部分,所以可以不考虑把cookie字符串放到40个字符的堆栈里面,那40个字符用来存放命令后填满即可。
所以cookie字符串可以考虑放到get的栈帧中,即越过40个字符的上方,因为不再返回了,所以那部分就不会被触碰到
将cookie字符串存放在栈顶+8字节的位置(即cookie字符串的起始地址),再把这个 cookie字符串的起始地址存放进%rdi中。
在Level 2中已经得到栈顶指针%rsp的初始值为0x5561dca0,所以cookie字符串的起始地址为0x5561dca0;并查看,touch3函数的地址为4018fa。
新建anwer2.txt文件,内容如下所示:
其中mov $0x5561dxa8,%rdi是为了将cookie字符串存到%rdi中,pushq $0x4017fa是为了将touch2的地址压入栈中,而retq指令是为了将栈中值弹出,然后跳转到该地址。
创建完成后如下所示
输入命令:gcc -c anwer2.s会生成机器码文件anwer2.o, 输入命令:objdump -d anwer2.o > anwer2.txt进行反汇编。
得到anwer2.o和anwer2.txt
进入anwer2.txt得到反汇编结果如下:
其中,汇编指令对应的机器码如下:
0: 48 c7 c7 a8 dc 61 55 mov $0x5561dca8,%rdi 7: 68 fa 17 40 00 pushq $0x4017fa c: c3 retq
接下来需要找到40个字符 开栈的位置(即调用getbuf()函数数据压入栈后栈顶指针%rsp的值),让getbuf()返回到这片代码区域(touch2的地址即最终返回地址)。
补充满40个字节,加上getbuf()的返回地址0x5561dc78和cookie字符串的十六进制值,新建level3.txt建立内容如下:
🌻2.3.2 问题验证
输入命令进行验证:./hex2raw < level3.txt | ./ctarget -q,显示结果为PASS:
🌼2.4 实验结果
由于实验通关过程中是分阶段的,故展示通关过程中所需的创建文件如下:
🌼2.5 实验体会
- 深刻理解系统底层: AttackLab实验让我深刻理解了计算机系统的底层运作原理。通过攻击和解密Level 3,我深入了解了汇编语言、内存管理等底层概念。这不仅拓展了我的知识面,还加强了对计算机系统内核的理解。
- 锻炼实际问题解决能力: 在AttackLab中,我不仅仅学到了理论知识,更锻炼了解决实际问题的能力。攻击过程中,需要深入分析和理解二进制代码,找到漏洞并设计相应的解决方案。这种实际问题解决的经验对于今后的计算机系统安全性研究和应对潜在威胁具有重要价值。
- 团队协作与知识分享: AttackLab实验强调了团队协作的重要性。与同学们共同探讨攻击技术、分享解决方案,不仅促进了彼此的学习,也加深了对课程内容的理解。这种开放的学术交流氛围让实验过程更为丰富和有趣,同时也培养了团队协作的能力。
📝 总结
在计算机系统的广袤领域,仿佛是一片未被揭示的复杂网络,隐藏着深奥的密码,而CSAPP的AttackLab实验正是那一场引人入胜的冒险之旅。这实验不仅深入挖掘计算机系统的基本概念,更将目光投向底层的系统实现,逐步揭开计算机系统内核、汇编语言和数据结构这些层次的神秘面纱。
对于那些渴望挑战计算机系统安全学习路径,以及希望掌握底层系统编程技术的冒险者们,AttackLab提供了一个独特的机会。点击下方链接,你将能够深入研究计算机科学的奇迹,探讨安全编程技术的实际应用和创新。我们引领趋势的🌱计算机科学专栏《斯坦福大学之CSAPP》将为你展开一场精彩的学术冒险,带你穿越计算机系统的迷雾,解锁其中的奥秘。🌐🔍