일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- python3.11 pip
- std::cerr
- c++
- python3.11 설치
- add-apt-repository 에러
- tool
- docker
- 지훈현서
- pwn
- 공유 라이브러리는 왜 항상 같은 순서로 맵핑 될까?
- z3 signed 이슈
- 리커버릿
- 실시간로깅
- OpenAI 개발
- python
- pwntools
- pip 에러 해결
- Python.h: No such file or directory
- Seccomp bypass
- DYNAMIC Section
- GEF
- wsl2 복구
- Windows 부팅 오류
- Python3
- 임베디드 시스템 해킹
- vhdx 파일 복구
- Recoverit
- 개발
- GDB
- VSCode C++ 표준 버전 수정
- Today
- Total
OZ1NG의 뽀나블(Pwnable)
[Python3] 인코딩 범위 무시하고 순수 바이트 값으로 디코딩 하기 (bytes.decode(errors="surrogateescape")) 본문
[Python3] 인코딩 범위 무시하고 순수 바이트 값으로 디코딩 하기 (bytes.decode(errors="surrogateescape"))
OZ1NG 2022. 7. 14. 23:02[*] 발단
친구한테 python3에서는 -c 옵션이 제대로 안먹히는 것 같으니 확인 좀 해달라는 연락을 받았다.
실제 테스트를 해보니 python2.7에서와 완벽히 같은 입력이지만 확실히 결과가 다른 것을 확인 할 수 있었다.
[*] 원인
python3에서 바이트 표현 값에 0xc2가 있는 것을 보고 눈치챈 사람들도 있겠지만, 이 둘의 결과가 다른 이유는 문자열 인코딩 문제였다.
python3는 디폴트로 utf-8을 사용하고 python2는 디폴트로 ascii를 사용한다.
그럼 python3에서 python2와 같은 결과를 내려면 어떻게 해야할까?
[*] 변환 방법
위와 같은 일반적인 입력 방법으로는 원하는 모습으로 변환이 되지 않았기 때문에 utf-8을 ascii로 재인코딩 하는 방법을 사용하기로 했다. (이전에 당연히 바이트 타입으로도 출력해봤지만 오히려 '\x' 가 붙어버려 완전히 다른 코드가 되어 버렸다.)
여러가지 변환 방법을 사용 해봤지만 시간 단축을 위해 미리 해결 방법을 말하면, python3의 경우 다음과 같은 방식으로 python2와 같은 결과를 낼 수 있다.
바이트 타입의 값을 ascii로 디코딩 할 때, .decode("ascii", errors="surrogateescape") 와 같이 errors 변수에 "surrogateescape" 값을 주면 된다. (참고로 errors의 디폴트 값은 "strict" 이다.)
errors 옵션은 예외 처리 방식을 설정하는 변수로 6개 정도의 방식이 있다.
errors = "surrogateescape"는 디코딩 할 때, 변환할 문자열 타입의 범위를 벗어나는 경우 해당 바이트를 유지한 상태로 변환하는 방식이다.
- 참고 : https://docs.python.org/3/library/codecs.html#error-handlers
따라서 python3 -c 를 사용하는 경우에는 위와 같은 방법으로 변환하면 원하는대로 변환이 가능하다.
[*] 시도 했던 방법들
누군가에겐 시도했던 방법에 대한 결과가 필요할 수 있으니 결과를 정리해둔다...
- 바이트 타입으로 출력
oz1ng@LAPTOP-6F0C4A2N:~/tmp$ python3 -c 'a = b"A"*(0x10) + b"\xa0\x91\x04\x08"; print(a)' |xxd
00000000: 6227 4141 4141 4141 4141 4141 4141 4141 b'AAAAAAAAAAAAAA
00000010: 4141 5c78 6130 5c78 3931 5c78 3034 5c78 AA\xa0\x91\x04\x
00000020: 3038 270a 08'.
- int.to_bytes()
oz1ng@LAPTOP-6F0C4A2N:~/tmp$ python3 -c 'a = b"A"*(0x10) + (0x080491a0).to_bytes(4, byteorder="little"); print(a)' |xxd
00000000: 6227 4141 4141 4141 4141 4141 4141 4141 b'AAAAAAAAAAAAAA
00000010: 4141 5c78 6130 5c78 3931 5c78 3034 5c78 AA\xa0\x91\x04\x
00000020: 3038 270a 08'.
- struct.pack()
oz1ng@LAPTOP-6F0C4A2N:~/tmp$ python3 -c 'import struct;a = b"A"*(0x10) + struct.pack("<I", 0x080491a0); print(a)' | xxd
00000000: 6227 4141 4141 4141 4141 4141 4141 4141 b'AAAAAAAAAAAAAA
00000010: 4141 5c78 6130 5c78 3931 5c78 3034 5c78 AA\xa0\x91\x04\x
00000020: 3038 270a 08'.
- pwn.p32()
oz1ng@LAPTOP-6F0C4A2N:~/tmp/$ python3 -c 'import pwn;a = b"A"*(0x10) + pwn.p32(0x080491a0); print(a)' | xxd
00000000: 6227 4141 4141 4141 4141 4141 4141 4141 b'AAAAAAAAAAAAAA
00000010: 4141 5c78 6130 5c78 3931 5c78 3034 5c78 AA\xa0\x91\x04\x
00000020: 3038 270a 08'.
'Tips' 카테고리의 다른 글
[C/C++] 구조체 bitfield 멤버 변수 선언 ( ':' ) (0) | 2022.07.19 |
---|---|
[C/C++] Capstone 라이브러리 (disassembly 라이브러리) (0) | 2022.07.18 |
[Tips] PIE 보호 기법이 걸려 경우 gdb 디버깅 - gef (0) | 2022.07.14 |
[Tips] VSCode Python Module Debugging (0) | 2022.06.29 |
[Tips] 꿀팁 사이트 모음(계속 추가 예정) (0) | 2022.06.29 |