티스토리 뷰
TL;DR
python3
에서 바이트에서 0~256
사이의 유니코드를 디코딩하고싶으면 bytes.decode('iso-8859-1')
을 사용하자.
python3
으로 포너블 문제들을 풀다보면 str
과 bytes
를 가끔씩 혼용할 때가 있다.
pay = ''
pay += 'AAAAAAAA'
pay += p64(0xdeadbeefcafebabe)
p64(0xdeadbeefcafebabe)
의 반환값은 바이트 자료형이기 때문에 str
과 합치려고 하면 오류가 난다.payload
의 문자열들에 b를 붙여서 해결할 수도 있고 p64
의 결괏값을 디코딩해서 넣어줘도 된다.
여기서 문제는 decoding할때의 codec이다.
ENCODING
>>> b"\x7f".decode()
'\x7f'
>>> b"\x80".decode()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x80 in position 0: invalid start byte
0 ~ 128
사이의 숫자는 멀쩡히 디코딩이 되지만 128 ~ 256
사이의 유니코드는 디코딩이 되지 않는다.
>>> '\xff'.encode()
b'\xc3\xbf'
>>> a = b'\xc3\xbf'.decode()
>>> hex(ord(a))
'0xff'
이럴땐 한바이트에 0 ~ 256
를 사용하는 ISO-8859-1
인코딩을 사용하면 된다.
>>> a = b'\xff'.decode("iso-8859-1")
>>> hex(ord(a))
'0xff'
댓글