这道题是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,防止被占用