这道题是buuoj上的一道题,原题是有另一种解法,但是buuoj上要求的是unlink解法

没开PIE,我这里把libc改为了2.23

main函数,可以看到已经对缓冲区进行设置了,不用管 并且一上来malloc了一个0x10的chunk,v4存放这个chunk的指针 底下两个message是题目原解法的提示,也是先不用管 再往下就是菜单函数和功能函数

这是show函数,注意printf()那里%d对应的i是item的序号,%s是创建的item的name,这里对应的是unk_6020C8 + 2 * i存放的内容,也就是说chunk的指针数组是存放在bss段的0x6020C8

change函数,注意这里v2的大小可以改变,但是chunk的实际大小不会变,所以可以堆溢出覆盖到下一个chunk'

remove函数


指针归0,chunk被free 开始调试
from pwn import *
context.log_level='debug'
p=process("./bamboobox")
elf=ELF("./bamboobox")
libc=ELF("./libc64/libc-2.23.so")
def show():
p.sendlineafter("Your choice:",b"1")
def add(len,name):
p.sendlineafter("Your choice:",b"2")
p.recvuntil("name:")
p.sendline(str(len))
p.recvuntil("item:")
p.sendline(name)
def change(idx,len,name):
p.sendlineafter("Your choice:",b"3")
p.recvuntil("of item:")
p.sendline(idx)
p.recvuntil("name:")
p.sendline(str(len))
p.recvuntil("the item")
p.sendline(name)
add(0x40,"aaaaaaaa")
add(0x80,"bbbbbbbb")
add(0x80,"cccccccc")
gdb.attach(p)
p.interactive()

申请到了0x51,0x91,0x91是我们申请的chunk+chunk head+flag位(flag为1,说明每一个chunk的前一个chunk都被使用了,这里很重要)

(大体的chunk结构) 注意上面第一个0x20的chunk的P为也是1,一般第一个chunk P位默认为1,防止被占用
