ゾンビ狩りクラブ

Linux, Server, Network, Security 関連などをゆるーくテキトーに載せてます

pwntools packing まとめ

Index

1. pack/unpack系でのメソッドで使用される引数の意味

  • number (int)
    パックする値
  • word_size (int)
    変換するワードサイズ
    'all'を指定すると、変換後の文字列長の長さになる。
  • endianness (str)
    エンディアン 'big' or 'little'
  • sign
    符号 'signed' or 'unsigned'
    or
    True or False
  • kwargs
    よくわからん。多分使わない。

2. pack系

数値をbytes型に変換する

pack(number, word_size=None, endian=None, sign=None, **kwargs)

>>> pack(0xdeadbeef, word_size='64', endian='little')
b'\xef\xbe\xad\xde\x00\x00\x00\x00'

>>> pack(0xdeadbeef, word_size='64', endian='big')
b'\x00\x00\x00\x00\xde\xad\xbe\xef'

>>> pack(0xdeadbeef, word_size='all', endian='little')
b'\xef\xbe\xad\xde'

また、pack関数の word_size を指定してある以下の関数が存在する。
p の次の数値が word_size になる。

  • p8()
  • p16()
  • p32()
  • p64()
>>> p32(0xdeadbeef)
b'\xef\xbe\xad\xde'
>>> p64(0xdeadbeef)
b'\xef\xbe\xad\xde\x00\x00\x00\x00'

3. unpack系

bytes型を数値に変換する

unpack(data, word_size=None, endian=None, sign=None)

>>> hex(unpack(b'/bin/sh\x00', word_size=64))
'0x68732f6e69622f'

また、unpack関数の word_size を指定してある以下の関数が存在する。
p u次の数値が word_size になる。

  • u8()
  • u16()
  • u32()
  • u64()
>>> hex(u64(b'/bin/sh\x00'))
'0x68732f6e69622f'

unpack_many(data, word_size=None, endian=None, sign=None)

bytes型を word_size に分割して数値に変換する。

>>> list(map(hex, unpack_many(b'\xbe\xba\xfe\xca\xef\xbe\xad\xde', 32)))
['0xcafebabe', '0xdeadbeef']