Pwntools Tutorial - Utility

모씨김(mossikim)·2025년 8월 12일

Pwntools

목록 보기
2/8
post-thumbnail

Utility Functions


  • Packing and Unpacking Integers
  • File I/O
  • Hashing and Encoding
    • Base64
    • Hashes
    • URL Encoding
    • Hex Encoding
    • Bit Manipluation and Hex Dumping
    • Hex Dumping
  • Pattern Generation


Packing and Unpacking Integers

pack, unpack을 통해 패킹과 언패킹을 수행할 수 있다. 여기서, pack()과 unpack()은 context의 설정에 기반해 동작한다. (endian, bits, sign 등)

  • pack(value) : 값을 설정에 따라 (context) 패킹한다. endian=’big’ 과 같이 일부 설정들을 지정할 수 있다.
  • unpack(value) : 값을 설정에 따라 (context) 언패킹한다. endian’big’ 과 같이 일부 설정들을 지정할 수 있다.
  • p-size(value) : 값을 함수명에 (size) 따라 패킹한다. p16, p32 등이 있다.
pack(1)
# '\x01\x00\x00\x00'

pack(-1)
# '\xff\xff\xff\xff'

pack(2**32 - 1)
# '\xff\xff\xff\xff'

pack(1, endian='big')
# '\x00\x00\x00\x01'

p16(1)
# '\x01\x00'

hex(unpack('AAAA'))
# '0x41414141'

hex(u16('AA'))
# '0x4141'

File I/O

간단히 한개의 함수를 호출하는 것만으로 파일 입출력을 사용할 수 있다.

  • write(’filename’, ‘data’) : 파일에 데이터를 작성한다.
  • read(’filename’, n) : 파일을 읽는다. n 인자는 필수가 아니며, 읽을 데이터의 양을 의미한다.
from pwn import *

write('filename', 'data')
read('filename')
# 'data'
read('filename', 1)
# 'd'

Hashing and Encoding

Base64

Base64 En/Decoding 을 위해서는 b64e, b64d를 사용한다. (함수의 반환 형식은 str임)

  • b64e(’str’) : str을 Base64로 인코딩해 반환한다.
  • b64d(’str’) : str을 Base64로 디코딩해 반환한다.
from pwn import *

'hello' == b64d(b64e('hello'))

Hashes

md5sumhex, sha1sumhex 등의 해쉬 함수를 사용할 수 있다. ( 자세한 내용은 레퍼런스 참조 )

from pwn import *

md5sumhex('hello') == '5d41402abc4b2a76b9719d911017c592'
write('file', 'hello')
md5filehex('file') == '5d41402abc4b2a76b9719d911017c592'
sha1sumhex('hello') == 'aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d'

URL En/Decoding

urlencode, urldecode를 통해 URL En/decoding 이 가능하다.

  • urlencode(’str’) : str을 인코딩한 문자열을 반환한다.
  • urldecode(’str’) : str을 디코딩한 문자열을 반환한다.
from pwn import *

urlencode("Hello, World!") == '%48%65%6c%6c%6f%2c%20%57%6f%72%6c%64%21'
urldecode('%48%65%6c%6c%6f%2c%20%57%6f%72%6c%64%21') == "Hello, World!"

Hex En/Decoding

enhex, unhex를 통해 ascii 문자열 - 16진수 간 변환이 가능하다.

  • enhex(’str’) : str을 16진수로 변환해 문자열로 반환한다.
  • unhex(’str’) : 16진수 값인 str을 ascii로 변환해 문자열로 반환한다.
from pwn import *

enhex('hello')
# '68656c6c6f'
unhex('776f726c64')
# 'world'

Bit Manipulation and Hex Dumping

bits, unbits를 통해 값 - 이진수 (각 자리에 따른 배열로 구성) 간 변환을 할 수 있다.

  • bits(value) : 값을 이진수 배열 형태로 변환한다. ex : 0b001101 → [0,0,1,1,0,1]
  • unbits(array) : 이진수 배열을 값으로 변환한다. ex : [0,0,1,1,0,1] → 0b001101
from pwn import *

bits(0b1000001) == bits('A')
# [0, 0, 0, 1, 0, 1, 0, 1]
unbits([0,1,0,1,0,1,0,1])
# 'U'Pattern Generation

Pattern Generation

패턴 생성은 수학 계산 없이 오프셋을 찾을 수 있는 매우 쉬운 방법이다.

간단한 BOF 가 있다고 가정해보자. 그리고 우리는 패턴을 생성하고, 대상 에플리케이션에 전달할 것이다.

io = process(...)
io.send(cyclic(512))

Core dump 에서, 우리는 크래시가 0x61616178에서 발생한 것을 볼 수 있을 것이다.

단순히 그 숫자를 패턴과 비교함으로써, 우리는 crash frame의 분석 없이 오프셋을 얻을 수 있다.

cyclic_find(0x61616178)
# 92

Pwntools - official tutorial
Full Reference

0개의 댓글