python byte vs bytearray

우리가 파이썬으로 pwntools를 다루면서 바이트를 정말 많이 다룬다.

근데 최근에 다음과 같은 상황이 있었다.

data = p.recv() 로 8바이트 ( 주소값 ) 을 받았고 이 주소값에서 3번째 인덱스에 0x25를 xor 해야 하는 상황이었다.

나는 그래서 data[2] 이런식으로 사용하려했는데 오류가 계속 발생했다. 그렇다. 바이트는 인덱스 접근을 하면 int가 나온다.

BYTE VS BYTEARRAY

BYTE

바이트는 우리가 흔히 아는 b”ABCD\x05” 와 같은 데이터이다.

우리는 이 데이터에 슬라이스로 접근을 한다. 따라서 한바이트를 자를려면 BYTE[2:3] 와 같이 접근을 해야한다.

만약 인덱스로 접근을 할려고 하면

C
b = b'ABC'
print(b[2])   # 67 (int, 'C')

다음과 같이 int 형으로 바뀌어 버린다.

BYTEARRAY

말 그대로 바이트의 array이다. 근데 바이트 보다 훨씬 개개인의 항목에 접근할 때 편리하다.

슬라이스 접근을 하면 → 잘린 BYTEARRAY가 나오게 되고

인덱스 접근을 하면 → int형으로 나오게 된다.

C
b = bytearray(p64(ret))
b[2] ^= ( randnum & 0xFF )
ret = u64(bytes(b))

다음과 같이 접근이 정말 편리하다. 바이트 각각 접근할때 애용하자

바이트 → bytearray() → bytearray

bytearray → bytes() → 바이트