Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- pwntools
- 지훈현서
- std::cerr
- python3.11 pip
- tool
- 리커버릿
- 임베디드 시스템 해킹
- GEF
- 개발
- python3.11 설치
- 실시간로깅
- DYNAMIC Section
- Recoverit
- pip 에러 해결
- 공유 라이브러리는 왜 항상 같은 순서로 맵핑 될까?
- GDB
- OpenAI 개발
- vhdx 파일 복구
- vmware 반응 속도
- z3 signed 이슈
- c++
- VSCode C++ 표준 버전 수정
- docker
- python
- Seccomp bypass
- Python.h: No such file or directory
- Python3
- wsl2 복구
- Windows 부팅 오류
- pwn
Archives
- Today
- Total
OZ1NG의 뽀나블(Pwnable)
[Tips] z3 unsigned 미지수 사용 본문
[*] 이슈
z3에서 미지수를 만들때 사용하는 BitVec()은 기본적으로 모든 미지수를 signed 값으로 취급한다.
때문에 이런 이슈가 발생하게 된다.
from z3 import *
# 미지수 a0, a1을 1bit 크기의 미지수로 설정
a0 = BitVecs('a0', 1)
a1 = BitVecs('a1', 1)
s = Solver()
s.add(a0 > a1)
print(s.check())
print(s.model())
$ python3 z3test.py
sat
[a0 = 0, a1 = 1] # ??????????????????
위와 같이 a1의 값이 1로 더 크게 나와버린다.
- signed는 최상위 bit를 부호 비트로 사용하여 1이면 음수라고 인식하는데, a0과 a1은 1 bit 크기의 미지수이므로 값이 1이면 결과적으로 1bit 크기의 변수이기 때문에 음수 값이라고 판단을 하게 되어 이런 현상이 일어나는 듯하다.
[*] 해결
이러한 문제를 해결하기 위해 z3에서는 unsigned 값 전용의 비교 연산 함수를 제공한다.
Signed | Unsigned |
a0 < a1 | ULT(a0, a1) |
a0 <= a1 | ULE(a0, a1) |
a0 > a1 | UGT(a0, a1) |
a0 >= a1 | UGE(a0, a1) |
a0 / a1 | UDiv(a0, a1) |
a0 % a1 | URem(a0, a1) |
a0 >>a1 | LShR(a0, a1) |
사용 예시는 아래와 같다.
from z3 import *
# 미지수 a0, a1을 1bit 크기의 미지수로 설정
a0, a1 = BitVecs('a0 a1', 1) # [참고] BitVec()이 아닌 BitVecs로 한번에 미지수 두개 설정
s = Solver()
# s.add(a0 > a1) # Signed
s.add(UGT(a0, a1)) # Unsigned
print(s.check())
print(s.model())
# [참고] 위처럼 안하고 그냥 아래와 같이 해도 바로 결과가 나온다. (코드 길이를 줄일 수 있음)
# solve(UGT(a0, a1))
$ python3 z3test.py
sat
[a0 = 1, a1 = 0]
결과가 잘 나오는 것을 확인 할 수 있다.
[*] 참고
- https://stackoverflow.com/questions/17838424/how-to-model-signed-integer-with-bitvector
- z3 Guide 문서: https://ericpony.github.io/z3py-tutorial/guide-examples.htm : Machine Arithmetic 부분 참고
'Tips' 카테고리의 다른 글
[Tips] strace attach (0) | 2023.02.20 |
---|---|
[Tips][CS] Linux(ELF) - 메모리에 맵핑된 공유 라이브러리는 왜 항상 같은 순서로 맵핑 될까? (2) | 2023.01.10 |
[Tips] C# Decompiler: dotPeek (0) | 2022.12.28 |
[Tips]python3.x pip 모듈 설치 에러 해결 : Python.h: No such file or directory (0) | 2022.12.14 |
[Tips] python XML 파싱 (0) | 2022.12.12 |
Comments