티스토리 뷰

카테고리 없음

python codec

mhibio 2021. 10. 20. 20:16

TL;DR

python3 에서 바이트에서 0~256사이의 유니코드를 디코딩하고싶으면 bytes.decode('iso-8859-1')을 사용하자.

 


 

python3으로 포너블 문제들을 풀다보면 strbytes를 가끔씩 혼용할 때가 있다.

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'
댓글
댓글쓰기 폼
공지사항
Total
7,033
Today
1
Yesterday
4
TAG
more
«   2021/12   »
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  
글 보관함