From a9b8585dfa0586af45c245e2a5a306f6f1d2b0d3 Mon Sep 17 00:00:00 2001 From: Eric Hennenfent Date: Fri, 30 Jul 2021 15:27:45 -0700 Subject: [PATCH 01/35] Create CITATION.cff --- CITATION.cff | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 CITATION.cff diff --git a/CITATION.cff b/CITATION.cff new file mode 100644 index 000000000..5add7874f --- /dev/null +++ b/CITATION.cff @@ -0,0 +1,48 @@ +# YAML 1.2 +--- +abstract: "An effective way to maximize code coverage in software tests is through dynamic symbolic execution-a technique that uses constraint solving to systematically explore a program's state space. We introduce an open-source dynamic symbolic execution framework called Manticore for analyzing binaries and Ethereum smart contracts. Manticore's flexible architecture allows it to support both traditional and exotic execution environments, and its API allows users to customize their analysis. Here, we discuss Manticore's architecture and demonstrate the capabilities we have used to find bugs and verify the correctness of code for our commercial clients." +authors: + - + affiliation: "Trail of Bits" + family-names: Mossberg + given-names: Mark + - + affiliation: "Trail of Bits" + family-names: Manzano + given-names: Felipe + - + affiliation: "Trail of Bits" + family-names: Hennenfent + given-names: Eric + - + affiliation: "Trail of Bits" + family-names: Groce + given-names: Alex + - + affiliation: "Trail of Bits" + family-names: Greico + given-names: Gustavo + - + affiliation: "Trail of Bits" + family-names: Feist + given-names: Josselin + - + affiliation: "Trail of Bits" + family-names: Brunson + given-names: Trent + - + affiliation: "Trail of Bits" + family-names: Dinaburg + given-names: Artem +cff-version: "1.1.0" +date-released: 2019-11-11 +doi: "10.1109/ASE.2019.00133" +keywords: + - "symbolic execution" + - "binary analysis" + - ethereum +license: "AGPL-3.0" +message: "If you use this software in an academic work, please cite our paper." +repository-code: "https://github.com/trailofbits/manticore" +title: "Manticore: A User-Friendly Symbolic Execution Framework for Binaries and Smart Contracts" +... From 1f7b8dc4fcc94db565cba96c9103e91838ad3ea8 Mon Sep 17 00:00:00 2001 From: Alan Chang Date: Sat, 31 Jul 2021 09:41:29 -0700 Subject: [PATCH 02/35] Fix loading custom interpreters for ELF binaries (#2473) * strip trailing null bytes --- manticore/platforms/linux.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manticore/platforms/linux.py b/manticore/platforms/linux.py index 21d8ca0f5..0e0fdae33 100644 --- a/manticore/platforms/linux.py +++ b/manticore/platforms/linux.py @@ -1353,7 +1353,7 @@ def _clean_interp_stream() -> None: for elf_segment in elf.iter_segments(): if elf_segment.header.p_type != "PT_INTERP": continue - interpreter_filename = elf_segment.data()[:-1] + interpreter_filename = elf_segment.data()[:-1].rstrip(b"\x00") logger.info(f"Interpreter filename: {interpreter_filename}") if os.path.exists(interpreter_filename.decode("utf-8")): _clean_interp_stream() From 36b3024ff01ffd51c10302d77d8b4690857e0e26 Mon Sep 17 00:00:00 2001 From: Eric Hennenfent Date: Wed, 4 Aug 2021 15:36:25 -0700 Subject: [PATCH 03/35] Switch to Python 3.7 (#2472) * Add version info to installations * Let's try a newer version? * Use fixed yices release * Really? No relative path support? * Can't handle newer C compilers Ugh we should really do something about that * Let's try 3.8 * Back to 3.7 3.6 is EOL soon, so we can justify jumping up to a more recent version, but 3.8 might still be too new for some people. * Find & Replace 3.6 -> 3.7 * Bump setup-python version * Fix additional 3.6 usage --- .github/workflows/ci.yml | 30 ++++++++++++++++++------------ .github/workflows/osx.yml | 6 +++--- .github/workflows/release.yml | 12 ++++++------ README.md | 2 +- examples/script/concolic.py | 4 +++- manticore/__init__.py | 4 ++-- mypy.ini | 2 +- setup.py | 2 +- 8 files changed, 35 insertions(+), 27 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ef849e2a5..ab9112ef0 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -15,10 +15,10 @@ jobs: runs-on: ubuntu-18.04 steps: - uses: actions/checkout@v2 - - name: Set up Python 3.6 - uses: actions/setup-python@v1 + - name: Set up Python 3.7 + uses: actions/setup-python@v2 with: - python-version: 3.6 + python-version: 3.7 - name: Lint if: github.event_name == 'pull_request' env: @@ -45,10 +45,10 @@ jobs: type: ["ethereum_truffle", "ethereum_bench", "examples", "ethereum", "ethereum_vm", "native", "wasm", "wasm_sym", "other"] steps: - uses: actions/checkout@v1 - - name: Set up Python 3.6 - uses: actions/setup-python@v1 + - name: Set up Python 3.7 + uses: actions/setup-python@v2 with: - python-version: 3.6 + python-version: 3.7 - name: Install NPM uses: actions/setup-node@v1 with: @@ -60,13 +60,19 @@ jobs: #install utils pip install coveralls pip install -e ".[dev-noks]" + # Get version info + pip freeze + z3 --version #install cvc4 sudo wget -O /usr/bin/cvc4 https://github.com/CVC4/CVC4/releases/download/1.7/cvc4-1.7-x86_64-linux-opt sudo chmod +x /usr/bin/cvc4 + cvc4 --version #install yices - sudo add-apt-repository ppa:sri-csl/formal-methods - sudo apt-get update - sudo apt-get install yices2 + sudo wget -O yices.tar.gz https://yices.csl.sri.com/releases/2.6.2/yices-2.6.2-x86_64-pc-linux-gnu-static-gmp.tar.gz + sudo tar -xzf yices.tar.gz + cd yices-2.6.2 + sudo ./install-yices + yices --version #install boolector mkdir -p /tmp/build cd /tmp/build @@ -113,10 +119,10 @@ jobs: needs: tests steps: - uses: actions/checkout@v2 - - name: Set up Python 3.6 - uses: actions/setup-python@v1 + - name: Set up Python 3.7 + uses: actions/setup-python@v2 with: - python-version: 3.6 + python-version: 3.7 - name: Build Dist run: | python3 -m pip install wheel diff --git a/.github/workflows/osx.yml b/.github/workflows/osx.yml index 032ea5b6d..4a1179267 100644 --- a/.github/workflows/osx.yml +++ b/.github/workflows/osx.yml @@ -14,10 +14,10 @@ jobs: type: ["ethereum_truffle", "ethereum_bench", "ethereum", "ethereum_vm", "wasm", "wasm_sym", "other"] steps: - uses: actions/checkout@v2 - - name: Set up Python 3.6 - uses: actions/setup-python@v1 + - name: Set up Python 3.7 + uses: actions/setup-python@v2 with: - python-version: 3.6 + python-version: 3.7 - name: Install NPM uses: actions/setup-node@v1 with: diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 3717e3b03..a27672994 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -12,10 +12,10 @@ jobs: type: ["ethereum_truffle", "ethereum_bench", "examples", "ethereum", "ethereum_vm", "native", "wasm", "wasm_sym", "other"] steps: - uses: actions/checkout@v1 - - name: Set up Python 3.6 - uses: actions/setup-python@v1 + - name: Set up Python 3.7 + uses: actions/setup-python@v2 with: - python-version: 3.6 + python-version: 3.7 - name: Install NPM uses: actions/setup-node@v1 with: @@ -64,10 +64,10 @@ jobs: needs: tests steps: - uses: actions/checkout@v2 - - name: Set up Python 3.6 - uses: actions/setup-python@v1 + - name: Set up Python 3.7 + uses: actions/setup-python@v2 with: - python-version: 3.6 + python-version: 3.7 - name: Build Dist run: | python3 -m pip install wheel diff --git a/README.md b/README.md index bd33f958f..885354521 100644 --- a/README.md +++ b/README.md @@ -217,7 +217,7 @@ for idx, val_list in enumerate(m.collect_returns()): ## Requirements -* Manticore requires Python 3.6 or greater +* Manticore requires Python 3.7 or greater * Manticore officially supports the latest LTS version of Ubuntu provided by Github Actions * Manticore has experimental support for EVM and WASM (but not native Linux binaries) on MacOS * We recommend running with increased stack size. This can be done by running `ulimit -s 100000` or by passing `--ulimit stack=100000000:100000000` to `docker run` diff --git a/examples/script/concolic.py b/examples/script/concolic.py index 75f7eecae..df3c17fb8 100755 --- a/examples/script/concolic.py +++ b/examples/script/concolic.py @@ -29,7 +29,9 @@ import copy from manticore.core.smtlib.expression import * -prog = "../linux/simpleassert" +from pathlib import Path + +prog = str(Path(__file__).parent.resolve().parent.joinpath("linux").joinpath("simpleassert")) VERBOSITY = 0 diff --git a/manticore/__init__.py b/manticore/__init__.py index 753996dbb..cbae00017 100644 --- a/manticore/__init__.py +++ b/manticore/__init__.py @@ -1,7 +1,7 @@ import sys -if sys.version_info < (3, 6): - print("Manticore requires Python 3.6 or higher.") +if sys.version_info < (3, 7): + print("Manticore requires Python 3.7 or higher.") sys.exit(-1) from .utils import config, log diff --git a/mypy.ini b/mypy.ini index ffd2626cb..c99c3c2c4 100644 --- a/mypy.ini +++ b/mypy.ini @@ -1,5 +1,5 @@ [mypy] -python_version = 3.6 +python_version = 3.7 files = manticore, tests ignore_missing_imports = True diff --git a/setup.py b/setup.py index 13b99fe50..3ddf1b1a2 100644 --- a/setup.py +++ b/setup.py @@ -61,7 +61,7 @@ def rtd_dependent_deps(): author="Trail of Bits", version=version, packages=find_packages(exclude=["tests", "tests.*"]), - python_requires=">=3.6", + python_requires=">=3.7", install_requires=[ "pyyaml", "protobuf", From 1c920b83b9f0fb6b925f1bbab81ba5b825163d90 Mon Sep 17 00:00:00 2001 From: Alan Chang Date: Mon, 16 Aug 2021 17:28:37 -0400 Subject: [PATCH 04/35] track parent in state descriptors (#2479) --- manticore/core/plugin.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/manticore/core/plugin.py b/manticore/core/plugin.py index eed313105..d56b39245 100644 --- a/manticore/core/plugin.py +++ b/manticore/core/plugin.py @@ -426,6 +426,8 @@ class StateDescriptor: state_list: typing.Optional[StateLists] = None #: State IDs of any states that forked from this one children: set = field(default_factory=set) + #: State ID of zero or one forked state that created this one + parent: typing.Optional[int] = None #: The time that any field of this Descriptor was last updated last_update: datetime = field(default_factory=datetime.now) #: The time at which the on_execution_intermittent callback was last applied to this state. This is when the PC and exec count get updated. @@ -579,6 +581,8 @@ def did_fork_state_callback( context.setdefault(state_id, StateDescriptor(state_id=state_id)).children.update( children ) + for child_id in children: + context.setdefault(child_id, StateDescriptor(state_id=child_id)).parent = state_id def will_solve_callback(self, state, constraints, expr, solv_func: str): """ From f1b5de21a3e77eee6a48c94605e484b8914bf178 Mon Sep 17 00:00:00 2001 From: Alan Chang Date: Mon, 16 Aug 2021 19:46:28 -0400 Subject: [PATCH 05/35] Prioritize LD_LIBRARY_PATH over system default path (#2476) * prioritize LD_LIBRARY_PATH * fall back to absolute path if env fails --- manticore/platforms/linux.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/manticore/platforms/linux.py b/manticore/platforms/linux.py index 0e0fdae33..efc526f7e 100644 --- a/manticore/platforms/linux.py +++ b/manticore/platforms/linux.py @@ -1353,12 +1353,10 @@ def _clean_interp_stream() -> None: for elf_segment in elf.iter_segments(): if elf_segment.header.p_type != "PT_INTERP": continue - interpreter_filename = elf_segment.data()[:-1].rstrip(b"\x00") + interpreter_filename = elf_segment.data()[:-1].rstrip(b"\x00").decode("utf-8") logger.info(f"Interpreter filename: {interpreter_filename}") - if os.path.exists(interpreter_filename.decode("utf-8")): - _clean_interp_stream() - interpreter = ELFFile(open(interpreter_filename, "rb")) - elif "LD_LIBRARY_PATH" in env: + + if "LD_LIBRARY_PATH" in env: for mpath in env["LD_LIBRARY_PATH"].split(":"): interpreter_path_filename = os.path.join( mpath, os.path.basename(interpreter_filename) @@ -1368,6 +1366,10 @@ def _clean_interp_stream() -> None: _clean_interp_stream() interpreter = ELFFile(open(interpreter_path_filename, "rb")) break + + if interpreter is None and os.path.exists(interpreter_filename): + interpreter = ELFFile(open(interpreter_filename, "rb")) + break if interpreter is not None: @@ -1499,9 +1501,7 @@ def _clean_interp_stream() -> None: if hint == 0: hint = None - base = cpu.memory.mmapFile( - hint, memsz, perms, elf_segment.stream.name.decode("utf-8"), offset - ) + base = cpu.memory.mmapFile(hint, memsz, perms, elf_segment.stream.name, offset) base -= vaddr logger.debug( f"Loading interpreter offset: {offset:08x} " From 38bb3d26f9c1733ad933152a7201ffe3f106bf2e Mon Sep 17 00:00:00 2001 From: Eric Kilmer Date: Tue, 24 Aug 2021 17:00:12 -0400 Subject: [PATCH 06/35] Install Python3.7 in Docker image (#2482) Manticore now requires Python 3.7 --- Dockerfile | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Dockerfile b/Dockerfile index 92a2cb4ce..375dd640c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -7,7 +7,7 @@ LABEL dockerfile_maintenance=trailofbits ENV LANG C.UTF-8 -RUN apt-get -y update && DEBIAN_FRONTEND=noninteractive apt-get -y install python3 python3-pip git wget +RUN apt-get -y update && DEBIAN_FRONTEND=noninteractive apt-get -y install python3.7 python3.7-dev python3-pip git wget # Install solc 0.4.25 and validate it RUN wget https://github.com/ethereum/solidity/releases/download/v0.4.25/solc-static-linux \ @@ -17,9 +17,9 @@ RUN wget https://github.com/ethereum/solidity/releases/download/v0.4.25/solc-sta # If this fails, the solc-static-linux binary has changed while it should not. RUN [ "c9b268750506b88fe71371100050e9dd1e7edcf8f69da34d1cd09557ecb24580 /usr/bin/solc" = "$(sha256sum /usr/bin/solc)" ] -RUN pip3 install -U pip +RUN python3.7 -m pip install -U pip ADD . /manticore -RUN cd manticore && pip3 install .[native] +RUN cd manticore && python3.7 -m pip install .[native] CMD ["/bin/bash"] From aae7bcd3d5600af4f61e3da5e899728d8ae837aa Mon Sep 17 00:00:00 2001 From: Eric Kilmer Date: Tue, 7 Sep 2021 12:25:11 -0400 Subject: [PATCH 07/35] Optionally publish events for memory reads (#2488) This is useful if you have multiple plugins and don't want them to capture memory reads that are executed by other plugins. Removed some type hints in the comments because they caused cascading errors, and fixing those cascading errors should be a part of another PR. --- manticore/native/cpu/abstractcpu.py | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/manticore/native/cpu/abstractcpu.py b/manticore/native/cpu/abstractcpu.py index 6a99a2c73..f5b84f926 100644 --- a/manticore/native/cpu/abstractcpu.py +++ b/manticore/native/cpu/abstractcpu.py @@ -11,7 +11,7 @@ from .disasm import init_disassembler from ..memory import ConcretizeMemory, InvalidMemoryAccess, FileMap, AnonMap from ..memory import LazySMemory, Memory -from ...core.smtlib import Operators, Constant, issymbolic +from ...core.smtlib import Operators, Constant, issymbolic, BitVec, Expression from ...core.smtlib import visitors from ...core.smtlib.solver import SelectedSolver from ...utils.emulate import ConcreteUnicornEmulator @@ -732,26 +732,28 @@ def _raw_read(self, where: int, size: int = 1, force: bool = False) -> bytes: assert len(data) == size, "Raw read resulted in wrong data read which should never happen" return data - def read_int(self, where, size=None, force=False): + def read_int(self, where: int, size: int = None, force: bool = False, publish: bool = True): """ Reads int from memory - :param int where: address to read from + :param where: address to read from :param size: number of bits to read - :return: the value read - :rtype: int or BitVec :param force: whether to ignore memory permissions + :param publish: whether to publish an event + :return: the value read """ if size is None: size = self.address_bit_size assert size in SANE_SIZES - self._publish("will_read_memory", where, size) + if publish: + self._publish("will_read_memory", where, size) data = self._memory.read(where, size // 8, force) assert (8 * len(data)) == size value = Operators.CONCAT(size, *map(Operators.ORD, reversed(data))) - self._publish("did_read_memory", where, value, size) + if publish: + self._publish("did_read_memory", where, value, size) return value def write_bytes(self, where: int, data, force: bool = False) -> None: @@ -786,19 +788,19 @@ def write_bytes(self, where: int, data, force: bool = False) -> None: for i in range(len(data)): self.write_int(where + i, Operators.ORD(data[i]), 8, force) - def read_bytes(self, where: int, size: int, force: bool = False): + def read_bytes(self, where: int, size: int, force: bool = False, publish: bool = True): """ Read from memory. :param where: address to read data from :param size: number of bytes :param force: whether to ignore memory permissions + :param publish: whether to publish events :return: data - :rtype: list[int or Expression] """ result = [] for i in range(size): - result.append(Operators.CHR(self.read_int(where + i, 8, force))) + result.append(Operators.CHR(self.read_int(where + i, 8, force, publish=publish))) return result def write_string( From df9cfaf7115813f40e40d9ace647ec1b1f103827 Mon Sep 17 00:00:00 2001 From: Eric Kilmer Date: Tue, 7 Sep 2021 12:25:36 -0400 Subject: [PATCH 08/35] Option to kill Manticore if any state fails on unrecoverable error (#2487) This is useful for having more strict runs of Manticore where we want to know about any unrecoverable errors encountered during state exploration. --- manticore/core/worker.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/manticore/core/worker.py b/manticore/core/worker.py index 5da1fa436..1efa911c9 100644 --- a/manticore/core/worker.py +++ b/manticore/core/worker.py @@ -17,6 +17,11 @@ consts = config.get_group("core") consts.add("HOST", "localhost", "Address to bind the log & state servers to") consts.add("PORT", 3214, "Port to use for the log server. State server runs one port higher.") +consts.add( + "fast_fail", + False, + "Kill Manticore if _any_ state encounters an unrecoverable exception/assertion.", +) logger = logging.getLogger(__name__) # logger.setLevel(9) @@ -188,6 +193,10 @@ def run(self, *args): m._kill_state(current_state.id) m._publish("did_kill_state", current_state, exc) current_state = None + if consts.fast_fail: + # Kill Manticore if _any_ state encounters unrecoverable + # exception/assertion + m.kill() break # Getting out. From 892f0fe15a957361441d8f075a3f57914795fe1f Mon Sep 17 00:00:00 2001 From: Eric Kilmer Date: Tue, 7 Sep 2021 12:26:10 -0400 Subject: [PATCH 09/35] Add manticore reference property to States (#2486) This was added a while ago when loading states from their serialized form in https://github.com/trailofbits/manticore/pull/1609 and this PR makes this feature a bit more robust. --- manticore/core/manticore.py | 1 + manticore/core/state.py | 2 ++ 2 files changed, 3 insertions(+) diff --git a/manticore/core/manticore.py b/manticore/core/manticore.py index 5c348155b..3dbad1cba 100644 --- a/manticore/core/manticore.py +++ b/manticore/core/manticore.py @@ -613,6 +613,7 @@ def _put_state(self, state) -> int: +-------+ """ + state.manticore = self self._publish("will_enqueue_state", state, can_raise=False) state_id = self._save(state, state_id=state.id) with self._lock: diff --git a/manticore/core/state.py b/manticore/core/state.py index 75bac0162..563520b0c 100644 --- a/manticore/core/state.py +++ b/manticore/core/state.py @@ -179,6 +179,7 @@ class StateBase(Eventful): def __init__(self, constraints, platform, **kwargs): super().__init__(**kwargs) + self.manticore = None self._platform = platform self._constraints = constraints self._platform.constraints = constraints @@ -238,6 +239,7 @@ def __enter__(self): new_state._input_symbols = list(self._input_symbols) new_state._context = copy.copy(self._context) new_state._id = None + new_state.manticore = self.manticore new_state._total_exec = self._total_exec self.copy_eventful_state(new_state) From 2228a7438d547be7bef07ce273eb0636328ad1a1 Mon Sep 17 00:00:00 2001 From: Eric Kilmer Date: Tue, 7 Sep 2021 12:26:36 -0400 Subject: [PATCH 10/35] Add more logging messages around solver errors (#2485) Helps with debugging if/when things go bad during solving * Fix typing error --- manticore/core/smtlib/solver.py | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/manticore/core/smtlib/solver.py b/manticore/core/smtlib/solver.py index 806512713..9c1cbd2aa 100644 --- a/manticore/core/smtlib/solver.py +++ b/manticore/core/smtlib/solver.py @@ -254,8 +254,17 @@ def send(self, cmd: str) -> None: """ if self._debug: logger.debug(">%s", cmd) - self._proc.stdout.flush() # type: ignore - self._proc.stdin.write(f"{cmd}\n") # type: ignore + assert self._proc is not None + try: + self._proc.stdout.flush() # type: ignore + self._proc.stdin.write(f"{cmd}\n") # type: ignore + except (BrokenPipeError, IOError) as e: + logger.critical( + f"Solver encountered an error trying to send commands: {e}.\n" + f"\tOutput: {self._proc.stdout}\n\n" + f"\tStderr: {self._proc.stderr}" + ) + raise e def recv(self, wait=True) -> Optional[str]: """Reads the response from the smtlib solver From cdf8ae8563eff3db556dfa6e7456f8f9d82d3c10 Mon Sep 17 00:00:00 2001 From: Eric Kilmer Date: Tue, 7 Sep 2021 12:30:34 -0400 Subject: [PATCH 11/35] Copy/Snapshot a RegisterFile (#2489) This is useful for referencing the state of the registers at a certain point in time. Internally, this is used to check the concrete values of registers. Symbolic values should also work but require more testing and care. Symbolic values containing memory references are undefined and are likely not accurate if execution occurs after the snapshot. --- manticore/native/cpu/aarch64.py | 9 +++++++- manticore/native/cpu/abstractcpu.py | 6 ++++++ manticore/native/cpu/arm.py | 29 +++++++++++++++---------- manticore/native/cpu/register.py | 2 ++ manticore/native/cpu/x86.py | 10 ++++++++- tests/native/test_aarch64cpu.py | 33 +++++++++++++++++++++++++++-- tests/native/test_armv7cpu.py | 30 +++++++++++++++++++++++++- tests/native/test_register.py | 2 +- tests/native/test_x86.py | 32 ++++++++++++++++++++++++++++ 9 files changed, 136 insertions(+), 17 deletions(-) diff --git a/manticore/native/cpu/aarch64.py b/manticore/native/cpu/aarch64.py index f1cd37a85..108f23651 100644 --- a/manticore/native/cpu/aarch64.py +++ b/manticore/native/cpu/aarch64.py @@ -1,4 +1,5 @@ import warnings +from copy import copy import capstone as cs import collections @@ -160,7 +161,6 @@ def __init__(self): # Only the full registers are stored here (called "parents"). # If a smaller register is used, it must find its "parent" in order to # be stored here. - self._registers = {} for name in self._table.keys(): self._all_registers.add(name) @@ -270,6 +270,13 @@ def nzcv(self, value): result = n | z | c | v self.write("NZCV", result) + def __copy__(self): + cls = self.__class__ + result = cls.__new__(cls) + result.__dict__.update(self.__dict__) + result._registers = {k: copy(v) for k, v in self._registers.items()} + return result + # XXX: Add more instructions. class Aarch64Cpu(Cpu): diff --git a/manticore/native/cpu/abstractcpu.py b/manticore/native/cpu/abstractcpu.py index f5b84f926..7a1f208e8 100644 --- a/manticore/native/cpu/abstractcpu.py +++ b/manticore/native/cpu/abstractcpu.py @@ -220,6 +220,7 @@ def __init__(self, aliases=None): # dict mapping from alias register name ('PC') to actual register # name ('RIP') self._aliases = aliases if aliases is not None else {} + self._registers = {} def _alias(self, register): """ @@ -267,6 +268,11 @@ def __contains__(self, register): """ return self._alias(register) in self.all_registers + def __copy__(self) -> "RegisterFile": + """Custom shallow copy to create a snapshot of the register state. + Should be used as read-only""" + ... + class Abi: """ diff --git a/manticore/native/cpu/arm.py b/manticore/native/cpu/arm.py index 8a0bfac4f..efe6a0e67 100644 --- a/manticore/native/cpu/arm.py +++ b/manticore/native/cpu/arm.py @@ -1,3 +1,4 @@ +from copy import copy from functools import wraps from inspect import signature as inspect_signature import logging @@ -334,7 +335,6 @@ def __init__(self): "PC": "R15", } ) - self._regs = {} # 32 bit registers for reg_name in ( "R0", @@ -354,7 +354,7 @@ def __init__(self): "R14", "R15", ): - self._regs[reg_name] = Register(32) + self._registers[reg_name] = Register(32) # 64 bit registers for reg_name in ( "D0", @@ -390,16 +390,16 @@ def __init__(self): "D30", "D31", ): - self._regs[reg_name] = Register(64) + self._registers[reg_name] = Register(64) # Flags - self._regs["APSR_N"] = Register(1) - self._regs["APSR_Z"] = Register(1) - self._regs["APSR_C"] = Register(1) - self._regs["APSR_V"] = Register(1) - self._regs["APSR_GE"] = Register(4) + self._registers["APSR_N"] = Register(1) + self._registers["APSR_Z"] = Register(1) + self._registers["APSR_C"] = Register(1) + self._registers["APSR_V"] = Register(1) + self._registers["APSR_GE"] = Register(4) # MMU Coprocessor -- to support MCR/MRC for TLS - self._regs["P15_C13"] = Register(32) + self._registers["P15_C13"] = Register(32) def _read_APSR(self): def make_apsr_flag(flag_expr, offset): @@ -449,14 +449,14 @@ def read(self, register): if register == "APSR": return self._read_APSR() register = self._alias(register) - return self._regs[register].read() + return self._registers[register].read() def write(self, register, value): assert register in self if register == "APSR": return self._write_APSR(value) register = self._alias(register) - self._regs[register].write(value) + self._registers[register].write(value) @property def all_registers(self): @@ -540,6 +540,13 @@ def canonical_registers(self): "APSR", ) + def __copy__(self): + cls = self.__class__ + result = cls.__new__(cls) + result.__dict__.update(self.__dict__) + result._registers = {k: copy(v) for k, v in self._registers.items()} + return result + class Armv7LinuxSyscallAbi(SyscallAbi): """ARMv7 Linux system call ABI""" diff --git a/manticore/native/cpu/register.py b/manticore/native/cpu/register.py index 8cac2ff4d..44cd93e13 100644 --- a/manticore/native/cpu/register.py +++ b/manticore/native/cpu/register.py @@ -1,3 +1,5 @@ +from copy import copy + from ...core.smtlib import Operators, BitVec, Bool diff --git a/manticore/native/cpu/x86.py b/manticore/native/cpu/x86.py index 349f3d455..49f8c0ff7 100644 --- a/manticore/native/cpu/x86.py +++ b/manticore/native/cpu/x86.py @@ -500,7 +500,6 @@ class AMD64RegFile(RegisterFile): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) - self._registers = {} for reg in ( "RAX", "RCX", @@ -559,6 +558,7 @@ def __init__(self, *args, **kwargs): self._registers[reg] = 0 self._cache = {} + for name in ("AF", "CF", "DF", "IF", "OF", "PF", "SF", "ZF"): self.write(name, False) @@ -720,6 +720,14 @@ def read(self, name): def sizeof(self, reg): return self._table[reg].size + def __copy__(self): + cls = self.__class__ + result = cls.__new__(cls) + result.__dict__.update(self.__dict__) + result._cache = self._cache.copy() + result._registers = self._registers.copy() + return result + # Operand Wrapper class AMD64Operand(Operand): diff --git a/tests/native/test_aarch64cpu.py b/tests/native/test_aarch64cpu.py index 6866e94f2..dcea7102a 100644 --- a/tests/native/test_aarch64cpu.py +++ b/tests/native/test_aarch64cpu.py @@ -1,12 +1,13 @@ import binascii +import copy import unittest from capstone import CS_MODE_ARM from functools import wraps -from manticore.core.smtlib import ConstraintSet, Z3Solver +from manticore.core.smtlib import ConstraintSet, Z3Solver, BitVecConstant, BitVecVariable, Operators from manticore.native.memory import SMemory64, Memory64 -from manticore.native.cpu.aarch64 import Aarch64Cpu as Cpu +from manticore.native.cpu.aarch64 import Aarch64Cpu as Cpu, Aarch64RegisterFile from manticore.native.cpu.abstractcpu import ( Interruption, InstructionNotImplementedError, @@ -148,6 +149,34 @@ def wrapper(self): } +def testRegisterFileCopy(): + regfile = Aarch64RegisterFile() + regfile.write("PC", 1234) + regfile.write("X0", BitVecConstant(size=64, value=24)) + regfile.write("X1", BitVecVariable(size=64, name="b")) + + new_regfile = copy.copy(regfile) + + assert new_regfile.read("PC") == 1234 + assert new_regfile.read("X0") is regfile.read("X0") + assert new_regfile.read("X0") == regfile.read("X0") + assert new_regfile.read("X1") is regfile.read("X1") + assert new_regfile.read("X1") == regfile.read("X1") + + rax_val = regfile.read("X0") + regfile.write("PC", Operators.ITEBV(64, rax_val == 0, 4321, 1235)) + regfile.write("X0", rax_val * 2) + + assert new_regfile.read("PC") is not regfile.read("PC") + assert new_regfile.read("PC") != regfile.read("PC") + assert new_regfile.read("PC") == 1234 + + assert new_regfile.read("X0") is not regfile.read("X0") + assert new_regfile.read("X0") != regfile.read("X0") + assert new_regfile.read("X0") is rax_val + assert new_regfile.read("X0") == rax_val + + # XXX: Armv7 also has these methods: stack_pop, stack_push, stack_peek. class Aarch64CpuTest(unittest.TestCase): # XXX: Adapted from the Armv7 test code. diff --git a/tests/native/test_armv7cpu.py b/tests/native/test_armv7cpu.py index 07d870bbd..640f4ec76 100644 --- a/tests/native/test_armv7cpu.py +++ b/tests/native/test_armv7cpu.py @@ -6,7 +6,7 @@ from functools import wraps from manticore.native.cpu.abstractcpu import ConcretizeRegister -from manticore.native.cpu.arm import Armv7Cpu as Cpu, Mask, Interruption +from manticore.native.cpu.arm import Armv7Cpu as Cpu, Mask, Interruption, Armv7RegisterFile from manticore.core.smtlib import * from manticore.core.state import Concretize from manticore.core.smtlib.solver import Z3Solver @@ -288,6 +288,34 @@ def assemble(asm: str, mode=CS_MODE_ARM) -> bytes: return binascii.unhexlify(_ks_assemble(asm, mode=mode)) +def testRegisterFileCopy(): + regfile = Armv7RegisterFile() + regfile.write("PC", 1234) + regfile.write("R0", BitVecConstant(size=64, value=24)) + regfile.write("R1", BitVecVariable(size=64, name="b")) + + new_regfile = copy.copy(regfile) + + assert new_regfile.read("PC") == 1234 + assert new_regfile.read("R0") is regfile.read("R0") + assert new_regfile.read("R0") == regfile.read("R0") + assert new_regfile.read("R1") is regfile.read("R1") + assert new_regfile.read("R1") == regfile.read("R1") + + rax_val = regfile.read("R0") + regfile.write("PC", Operators.ITEBV(64, rax_val == 0, 4321, 1235)) + regfile.write("R0", rax_val * 2) + + assert new_regfile.read("PC") is not regfile.read("PC") + assert new_regfile.read("PC") != regfile.read("PC") + assert new_regfile.read("PC") == 1234 + + assert new_regfile.read("R0") is not regfile.read("R0") + assert new_regfile.read("R0") != regfile.read("R0") + assert new_regfile.read("R0") is rax_val + assert new_regfile.read("R0") == rax_val + + class Armv7CpuTest(unittest.TestCase): _multiprocess_can_split_ = True diff --git a/tests/native/test_register.py b/tests/native/test_register.py index 0c4834a2c..71df2a9a8 100644 --- a/tests/native/test_register.py +++ b/tests/native/test_register.py @@ -1,6 +1,6 @@ import unittest -from manticore.core.smtlib import Bool, BoolVariable, BitVecConstant +from manticore.core.smtlib import * from manticore.native.cpu.register import Register diff --git a/tests/native/test_x86.py b/tests/native/test_x86.py index 895ec2640..369927533 100644 --- a/tests/native/test_x86.py +++ b/tests/native/test_x86.py @@ -1,7 +1,11 @@ +import copy import unittest import functools + +from manticore.core.smtlib import BitVecConstant, BitVecVariable, operators from manticore.native.cpu.x86 import * from manticore.core.smtlib import * +from manticore.native.cpu.x86 import AMD64RegFile from manticore.native.memory import * from manticore.core.smtlib.solver import Z3Solver @@ -33,6 +37,34 @@ def decorate(cls): return decorate +def testRegisterFileCopy(): + regfile = AMD64RegFile(aliases={"PC": "RIP", "STACK": "RSP", "FRAME": "RBP"}) + regfile.write("PC", 1234) + regfile.write("RAX", BitVecConstant(size=64, value=24)) + regfile.write("RBX", BitVecVariable(size=64, name="b")) + + new_regfile = copy.copy(regfile) + + assert new_regfile.read("PC") == 1234 + assert new_regfile.read("RAX") is regfile.read("RAX") + assert new_regfile.read("RAX") == regfile.read("RAX") + assert new_regfile.read("RBX") is regfile.read("RBX") + assert new_regfile.read("RBX") == regfile.read("RBX") + + rax_val = regfile.read("RAX") + regfile.write("PC", Operators.ITEBV(64, rax_val == 0, 4321, 1235)) + regfile.write("RAX", rax_val * 2) + + assert new_regfile.read("PC") is not regfile.read("PC") + assert new_regfile.read("PC") != regfile.read("PC") + assert new_regfile.read("PC") == 1234 + + assert new_regfile.read("RAX") is not regfile.read("RAX") + assert new_regfile.read("RAX") != regfile.read("RAX") + assert new_regfile.read("RAX") is rax_val + assert new_regfile.read("RAX") == rax_val + + @forAllTests(skipIfNotImplemented) class CPUTest(unittest.TestCase): _multiprocess_can_split_ = True From 4d880cd4edbd2f23d840713ed05f441974e894a7 Mon Sep 17 00:00:00 2001 From: G-11-P <85524379+G-11-P@users.noreply.github.com> Date: Tue, 7 Sep 2021 12:46:32 -0500 Subject: [PATCH 12/35] Bump Node from 13.x to 16.x (#2484) * Update ci.yml * Update ci.yml * Revert "Update ci.yml" This reverts commit 1d7c80efb5c583bd0e03d9b0457f90f04162e236. Co-authored-by: Eric Hennenfent --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ab9112ef0..ff96d50c4 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -52,7 +52,7 @@ jobs: - name: Install NPM uses: actions/setup-node@v1 with: - node-version: '13.x' + node-version: '16.x' - name: Install dependencies env: TEST_TYPE: ${{ matrix.type }} From 7c905c8ce37b1054eb634f74cf6b423ecce767d0 Mon Sep 17 00:00:00 2001 From: Eric Kilmer Date: Fri, 10 Sep 2021 14:03:51 -0400 Subject: [PATCH 13/35] Add last_executed_pc property to abstract CPU (#2475) Helpful for knowing the exact last executed instruction address. * Fix some types * Set last_executed_pc to insn.address when disagreement on PC and insn This should be correct since some hook has intercepted the events for the instruction and "executed" it for us. * Simplify instruction publish event call * Add more documentation for last executed pc/instruction --- manticore/native/cpu/abstractcpu.py | 36 +++++++++++++++++++++-------- manticore/native/cpu/disasm.py | 16 ++++++------- 2 files changed, 34 insertions(+), 18 deletions(-) diff --git a/manticore/native/cpu/abstractcpu.py b/manticore/native/cpu/abstractcpu.py index 7a1f208e8..44dbf5305 100644 --- a/manticore/native/cpu/abstractcpu.py +++ b/manticore/native/cpu/abstractcpu.py @@ -8,7 +8,7 @@ import unicorn -from .disasm import init_disassembler +from .disasm import init_disassembler, Instruction from ..memory import ConcretizeMemory, InvalidMemoryAccess, FileMap, AnonMap from ..memory import LazySMemory, Memory from ...core.smtlib import Operators, Constant, issymbolic, BitVec, Expression @@ -533,9 +533,15 @@ def __init__(self, regfile: RegisterFile, memory: Memory, **kwargs): super().__init__(**kwargs) self._regfile = regfile self._memory = memory - self._instruction_cache: Dict[int, Any] = {} + self._instruction_cache: Dict[int, Instruction] = {} self._icount = 0 + # _last_pc represents the last PC that was going to be executed, but it + # might not have been due to user hooks, exceptions, etc. You probably + # want last_executed_pc() or last_executed_insn() self._last_pc = None + # _last_executed_pc represents the last PC that was executed and + # affected the state of the program + self._last_executed_pc = None self._concrete = kwargs.pop("concrete", False) self.emu = None self._break_unicorn_at: Optional[int] = None @@ -552,6 +558,7 @@ def __getstate__(self): state["memory"] = self._memory state["icount"] = self._icount state["last_pc"] = self._last_pc + state["last_executed_pc"] = self._last_executed_pc state["disassembler"] = self._disasm state["concrete"] = self._concrete state["break_unicorn_at"] = self._break_unicorn_at @@ -568,6 +575,7 @@ def __setstate__(self, state): ) self._icount = state["icount"] self._last_pc = state["last_pc"] + self._last_executed_pc = state["last_executed_pc"] self._disasm = state["disassembler"] self._concrete = state["concrete"] self._break_unicorn_at = state["break_unicorn_at"] @@ -578,6 +586,18 @@ def __setstate__(self, state): def icount(self): return self._icount + @property + def last_executed_pc(self) -> Optional[int]: + """The last PC that was executed.""" + return self._last_executed_pc + + @property + def last_executed_insn(self) -> Optional[Instruction]: + """The last instruction that was executed.""" + if not self.last_executed_pc: + return None + return self.decode_instruction(self.last_executed_pc) + ############################## # Register access @property @@ -913,7 +933,7 @@ def _wrap_operands(self, operands): """ raise NotImplementedError - def decode_instruction(self, pc: int): + def decode_instruction(self, pc: int) -> Instruction: """ This will decode an instruction from memory pointed by `pc` @@ -993,13 +1013,7 @@ def execute(self): """ curpc = self.PC if self._delayed_event: - self._icount += 1 - self._publish( - "did_execute_instruction", - self._last_pc, - curpc, - self.decode_instruction(self._last_pc), - ) + self._publish_instruction_as_executed(self.decode_instruction(self._last_pc)) self._delayed_event = False if issymbolic(curpc): @@ -1017,6 +1031,7 @@ def execute(self): # FIXME (theo) why just return here? # hook changed PC, so we trust that there is nothing more to do if insn.address != self.PC: + self._last_executed_pc = insn.address return name = self.canonicalize_instruction_name(insn) @@ -1064,6 +1079,7 @@ def _publish_instruction_as_executed(self, insn): """ Notify listeners that an instruction has been executed. """ + self._last_executed_pc = self._last_pc self._icount += 1 self._publish("did_execute_instruction", self._last_pc, self.PC, insn) diff --git a/manticore/native/cpu/disasm.py b/manticore/native/cpu/disasm.py index 462385e4e..6e3c2619b 100644 --- a/manticore/native/cpu/disasm.py +++ b/manticore/native/cpu/disasm.py @@ -8,22 +8,22 @@ class Instruction: @property @abstractmethod - def address(self): + def address(self) -> int: pass @property @abstractmethod - def mnemonic(self): + def mnemonic(self) -> str: pass @property @abstractmethod - def op_str(self): + def op_str(self) -> str: pass @property @abstractmethod - def size(self): + def size(self) -> int: pass @property @@ -34,12 +34,12 @@ def operands(self): # FIXME (theo) eliminate one of the two of insn_name, name @property @abstractmethod - def insn_name(self): + def insn_name(self) -> str: pass @property @abstractmethod - def name(self): + def name(self) -> str: pass @@ -50,7 +50,7 @@ def __init__(self, disasm): self.disasm = disasm @abstractmethod - def disassemble_instruction(self, code, pc): + def disassemble_instruction(self, code, pc) -> Instruction: """Get next instruction based on the disassembler in use :param str code: binary blob to be disassembled @@ -68,7 +68,7 @@ def __init__(self, arch, mode): cap.syntax = 0 super().__init__(cap) - def disassemble_instruction(self, code, pc): + def disassemble_instruction(self, code: bytes, pc: int) -> Instruction: """Get next instruction using the Capstone disassembler :param str code: binary blob to be disassembled From b73986b141f83395d3a24d2a3a5145328b56a17c Mon Sep 17 00:00:00 2001 From: Eric Hennenfent Date: Mon, 13 Sep 2021 07:16:26 -0700 Subject: [PATCH 14/35] Unpin Truffle Version, Use Latest crytic-compile (#2490) This PR allows us to support Truffle version 5.3.14, which is now supported by the [latest release of crytic-compile](https://github.com/crytic/crytic-compile/releases/tag/0.2.1) --- scripts/run_tests.sh | 2 +- setup.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/run_tests.sh b/scripts/run_tests.sh index 6cf01ff57..e8722ebaf 100755 --- a/scripts/run_tests.sh +++ b/scripts/run_tests.sh @@ -95,7 +95,7 @@ make_wasm_sym_tests(){ } install_truffle(){ - npm install -g truffle@5.3.13 + npm install -g truffle } run_truffle_tests(){ diff --git a/setup.py b/setup.py index 3ddf1b1a2..08953fa65 100644 --- a/setup.py +++ b/setup.py @@ -71,7 +71,7 @@ def rtd_dependent_deps(): "ply", "rlp", "intervaltree", - "crytic-compile>=0.2.0", + "crytic-compile>=0.2.1", "wasm", "dataclasses; python_version < '3.7'", "pyevmasm>=0.2.3", From 522f8ba31e0c6d7c5d5713ed23a3c48baca7cbf8 Mon Sep 17 00:00:00 2001 From: Eric Kilmer Date: Wed, 15 Sep 2021 09:13:48 -0400 Subject: [PATCH 15/35] Add methods for getting list of (un)implemented system calls (#2491) This is primarily a helper function that is useful in evaluating the capabilities of Manticore on Linux * Add Linux Kernel version constant to syscalls list * Add method for getting unimplemented syscalls This is specific per architecture --- manticore/platforms/linux.py | 38 ++++++++++++++++++++++ manticore/platforms/linux_syscalls.py | 6 ++-- scripts/extract_syscalls.py | 4 +-- tests/native/test_linux.py | 47 ++++++++++++++++++++++++++- 4 files changed, 89 insertions(+), 6 deletions(-) diff --git a/manticore/platforms/linux.py b/manticore/platforms/linux.py index efc526f7e..2e1c44752 100644 --- a/manticore/platforms/linux.py +++ b/manticore/platforms/linux.py @@ -3316,6 +3316,44 @@ def _interp_total_size(interp): last = load_segs[-1] return last.header.p_vaddr + last.header.p_memsz + @classmethod + def implemented_syscalls(cls) -> Iterable[str]: + """ + Get a listing of all concretely implemented system calls for Linux. This + does not include whether a symbolic version exists. To get that listing, + use the SLinux.implemented_syscalls() method. + """ + import inspect + + return ( + name + for (name, obj) in inspect.getmembers(cls, predicate=inspect.isfunction) + if name.startswith("sys_") and + # Check that the class defining the method is exactly this one + getattr(inspect.getmodule(obj), obj.__qualname__.rsplit(".", 1)[0], None) == cls + ) + + @classmethod + def unimplemented_syscalls(cls, syscalls: Union[Set[str], Dict[int, str]]) -> Set[str]: + """ + Get a listing of all unimplemented concrete system calls for a given + collection of Linux system calls. To get a listing of unimplemented + symbolic system calls, use the ``SLinux.unimplemented_syscalls()`` + method. + + Available system calls can be found at ``linux_syscalls.py`` or you may + pass your own as either a set of system calls or as a mapping of system + call number to system call name. + + Note that passed system calls should follow the naming convention + located in ``linux_syscalls.py``. + """ + implemented_syscalls = set(cls.implemented_syscalls()) + if isinstance(syscalls, set): + return syscalls.difference(implemented_syscalls) + else: + return set(syscalls.values()).difference(implemented_syscalls) + ############################################################################ # Symbolic versions follows diff --git a/manticore/platforms/linux_syscalls.py b/manticore/platforms/linux_syscalls.py index 32579385b..af603bfda 100644 --- a/manticore/platforms/linux_syscalls.py +++ b/manticore/platforms/linux_syscalls.py @@ -2,8 +2,8 @@ # # AUTOGENERATED, DO NOT EDIT # -# From version: 4.11 -# + +LINUX_KERNEL_VERSION = "4.11" i386 = { 0: "sys_restart_syscall", @@ -426,7 +426,7 @@ 53: "sys_socketpair", 54: "sys_setsockopt", 55: "sys_getsockopt", - 56: "sys_clone_ptregs", + 56: "sys_clone/ptregs", 57: "sys_fork/ptregs", 58: "sys_vfork/ptregs", 59: "sys_execve/ptregs", diff --git a/scripts/extract_syscalls.py b/scripts/extract_syscalls.py index 2aa1048bf..1e8d67781 100755 --- a/scripts/extract_syscalls.py +++ b/scripts/extract_syscalls.py @@ -78,8 +78,8 @@ def write_without_includes(f, res): args = parser.parse_args() output = open(args.output, "w+") - output.write("#\n#\n# AUTOGENERATED, DO NOT EDIT\n#\n") - output.write(f"# From version: {args.linux_version}\n#\n\n") + output.write("#\n#\n# AUTOGENERATED, DO NOT EDIT\n#\n\n") + output.write(f'LINUX_KERNEL_VERSION = "{args.linux_version}"\n\n') for arch, path in ARCH_TABLES: url = BASE_URL.format(path, args.linux_version) diff --git a/tests/native/test_linux.py b/tests/native/test_linux.py index 028cac39c..8d23df0fd 100644 --- a/tests/native/test_linux.py +++ b/tests/native/test_linux.py @@ -15,7 +15,13 @@ from manticore.native import Manticore from manticore.platforms import linux, linux_syscalls from manticore.utils.helpers import pickle_dumps -from manticore.platforms.linux import EnvironmentError, logger as linux_logger, SymbolicFile +from manticore.platforms.linux import ( + EnvironmentError, + logger as linux_logger, + SymbolicFile, + Linux, + SLinux, +) class LinuxTest(unittest.TestCase): @@ -417,3 +423,42 @@ def post(state): m.run() self.assertTrue(m.context["success"]) + + def test_implemented_syscall_report(self) -> None: + concrete_syscalls = set(Linux.implemented_syscalls()) + symbolic_syscalls = set(SLinux.implemented_syscalls()) + + # Make sure at least one known syscall implementation appears in both + assert "sys_read" in concrete_syscalls + assert "sys_read" in symbolic_syscalls + + # Make sure an unimplemented syscall (taken from linux_syscall_stubs) + # does not appear in our list of concrete syscalls. This could change in + # the future + assert "sys_bpf" not in concrete_syscalls + + # Make sure that a concretely implemented syscall does not have a (at + # this time) symbolic equivalent. This could change in the future + assert "sys_tgkill" in concrete_syscalls + assert "sys_tgkill" not in symbolic_syscalls + + # This doesn't _need_ to be true, but our design says it should be true + assert symbolic_syscalls.issubset(concrete_syscalls) + + def test_unimplemented_syscall_report(self) -> None: + """This test is the inverse of test_implemented_syscall_report""" + from manticore.platforms.linux_syscalls import amd64 + + unimplemented_concrete_syscalls = set(Linux.unimplemented_syscalls(amd64)) + unimplemented_symbolic_syscalls = set(SLinux.unimplemented_syscalls(set(amd64.values()))) + + assert "sys_read" not in unimplemented_concrete_syscalls + assert "sys_read" not in unimplemented_symbolic_syscalls + + assert "sys_bpf" in unimplemented_concrete_syscalls + + assert "sys_tgkill" not in unimplemented_concrete_syscalls + assert "sys_tgkill" in unimplemented_symbolic_syscalls + + # This doesn't _need_ to be true, but our design says it should be true + assert unimplemented_concrete_syscalls.issubset(unimplemented_symbolic_syscalls) From 6e036f3034b76bbecf36b5469e49294e038ff705 Mon Sep 17 00:00:00 2001 From: Nikita Sobolev Date: Tue, 9 Nov 2021 00:40:56 +0300 Subject: [PATCH 16/35] Improves `namedtuple` definition (#2501) I am working on new `mypy` feature and it identified a problem with your `namedtuple` definitions. https://github.com/python/mypy/pull/11206#issuecomment-962573633 By standard first string arg should match variable name. --- manticore/native/cpu/aarch64.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/manticore/native/cpu/aarch64.py b/manticore/native/cpu/aarch64.py index 108f23651..6a34fe4d1 100644 --- a/manticore/native/cpu/aarch64.py +++ b/manticore/native/cpu/aarch64.py @@ -41,7 +41,7 @@ class Aarch64InvalidInstruction(CpuException): # See "C1.2.4 Condition code". -Condspec = collections.namedtuple("CondSpec", "inverse func") +Condspec = collections.namedtuple("Condspec", "inverse func") COND_MAP = { cs.arm64.ARM64_CC_EQ: Condspec(cs.arm64.ARM64_CC_NE, lambda n, z, c, v: z == 1), cs.arm64.ARM64_CC_NE: Condspec(cs.arm64.ARM64_CC_EQ, lambda n, z, c, v: z == 0), @@ -76,7 +76,7 @@ class Aarch64InvalidInstruction(CpuException): class Aarch64RegisterFile(RegisterFile): - Regspec = collections.namedtuple("RegSpec", "parent size") + Regspec = collections.namedtuple("Regspec", "parent size") # Register table. _table = {} From 0101bde3ab5eed23a913ed9896d6331adcb32203 Mon Sep 17 00:00:00 2001 From: Eric Hennenfent Date: Wed, 10 Nov 2021 15:22:45 -0800 Subject: [PATCH 17/35] Solver Improvements (#2502) In the course of my investigation, I found that the SMT2 definitions were being converted to text properly, but not making it all the way to the solver. This seems to be an issue with Python's unbuffered pipe implementation. I'm not sure what the exact issue is, but switching to buffered I/O and adding explicit calls to flush has fixed the tests. * Fix invalid escape characters * Add debug logs for solver errors * Optimize imports * Split buffer on newlines We're going to have to take this out before merging but hopefully it'll help figure out what's going wrong * Clear the debug buffer upon reset * Make sure we flush data sent to the solver * Fix typo * Try buffering I/O with the solver * Move _clear_buffers out of loop * Remove debugging code --- manticore/core/smtlib/constraints.py | 2 +- manticore/core/smtlib/solver.py | 31 +++++++++++++++------------- tests/other/test_smtlibv2.py | 5 +++-- 3 files changed, 21 insertions(+), 17 deletions(-) diff --git a/manticore/core/smtlib/constraints.py b/manticore/core/smtlib/constraints.py index 82621b4d2..9612e027c 100644 --- a/manticore/core/smtlib/constraints.py +++ b/manticore/core/smtlib/constraints.py @@ -393,7 +393,7 @@ def new_bitvec(self, size, name=None, taint=frozenset(), avoid_collisions=False) if size <= 0: raise ValueError(f"Bitvec size ({size}) can't be equal to or less than 0") if name is None: - name = "BIVEC" + name = "BITVEC" avoid_collisions = True if avoid_collisions: name = self._make_unique_name(name) diff --git a/manticore/core/smtlib/solver.py b/manticore/core/smtlib/solver.py index 9c1cbd2aa..0d6f87ce9 100644 --- a/manticore/core/smtlib/solver.py +++ b/manticore/core/smtlib/solver.py @@ -14,26 +14,22 @@ # You can create new symbols operate on them. The declarations will be sent to the smtlib process when needed. # You can add new constraints. A new constraint may change the state from {None, sat} to {sat, unsat, unknown} -import os -import fcntl -import shutil -import threading -from queue import Queue import collections +import fcntl +import os import shlex +import shutil import time from abc import abstractmethod -from functools import lru_cache -from typing import Any, Dict, Tuple, Sequence, Optional, List -from subprocess import PIPE, Popen, check_output from random import shuffle -import re +from subprocess import PIPE, Popen, check_output +from typing import Any, Sequence, List + from . import operators as Operators from .constraints import * from .visitors import * -from ...exceptions import Z3NotFoundError, SolverError, SolverUnknown, TooManySolutions, SmtlibError +from ...exceptions import SolverError, SolverUnknown, TooManySolutions, SmtlibError from ...utils import config -from . import issymbolic logger = logging.getLogger(__name__) consts = config.get_group("smt") @@ -57,7 +53,7 @@ # Regular expressions used by the solver RE_GET_EXPR_VALUE_ALL = re.compile( - "\(([a-zA-Z0-9_]*)[ \\n\\s]*(#b[0-1]*|#x[0-9a-fA-F]*|[\(]?_ bv[0-9]* [0-9]*|true|false)\\)" + r"\(([a-zA-Z0-9_]*)[ \n\s]*(#b[0-1]*|#x[0-9a-fA-F]*|[(]?_ bv[0-9]* [0-9]*|true|false)\)" ) RE_GET_EXPR_VALUE_FMT_BIN = re.compile(r"\(\((?P(.*))[ \n\s]*#b(?P([0-1]*))\)\)") RE_GET_EXPR_VALUE_FMT_DEC = re.compile(r"\(\((?P(.*))\ \(_\ bv(?P(\d*))\ \d*\)\)\)") @@ -217,7 +213,7 @@ def start(self): shlex.split(self._command), stdin=PIPE, stdout=PIPE, - bufsize=0, + # bufsize=0, # if we set input to unbuffered, we get syntax errors in large formulas universal_newlines=True, close_fds=True, ) @@ -258,6 +254,7 @@ def send(self, cmd: str) -> None: try: self._proc.stdout.flush() # type: ignore self._proc.stdin.write(f"{cmd}\n") # type: ignore + self._proc.stdin.flush() # type: ignore except (BrokenPipeError, IOError) as e: logger.critical( f"Solver encountered an error trying to send commands: {e}.\n" @@ -309,7 +306,7 @@ def recv(self, wait=True) -> Optional[str]: self._last_buf = "" if "(error" in buf: - raise SolverException(f"Error in smtlib: {buf}") + raise SolverException(f"Solver error: {buf}") if self._debug: logger.debug("<%s", buf) @@ -324,6 +321,10 @@ def _restart(self) -> None: def is_started(self): return self._proc is not None + def clear_buffers(self): + self._proc.stdout.flush() + self._proc.stdin.flush() + class SMTLIBSolver(Solver): ncores: Optional[int] = None @@ -387,6 +388,8 @@ def _reset(self, constraints: Optional[str] = None) -> None: self._smtlib.stop() # does not do anything if already stopped self._smtlib.start() + self._smtlib.clear_buffers() + for cfg in self._init: self._smtlib.send(cfg) diff --git a/tests/other/test_smtlibv2.py b/tests/other/test_smtlibv2.py index 6aeeaff3f..5956ca2cb 100644 --- a/tests/other/test_smtlibv2.py +++ b/tests/other/test_smtlibv2.py @@ -790,11 +790,12 @@ def test_arithmetic_simplify(self): exp |= 0 self.assertEqual(get_depth(exp), 4) self.assertEqual( - translate_to_smtlib(exp), "(bvor (bvand (bvor BIVEC #x00000000) #x00000001) #x00000000)" + translate_to_smtlib(exp), + "(bvor (bvand (bvor BITVEC #x00000000) #x00000001) #x00000000)", ) exp = arithmetic_simplify(exp) self.assertTrue(get_depth(exp) < 4) - self.assertEqual(translate_to_smtlib(exp), "(bvand BIVEC #x00000001)") + self.assertEqual(translate_to_smtlib(exp), "(bvand BITVEC #x00000001)") def test_arithmetic_simplify_extract(self): cs = ConstraintSet() From 9f55b09aa36f088f21fc9f9a31f488a9b7b318fa Mon Sep 17 00:00:00 2001 From: Eric Hennenfent Date: Mon, 15 Nov 2021 12:01:38 -0800 Subject: [PATCH 18/35] Bump Sphinx version to 4.3.0 (#2503) * Require Sphinx 3.0 or greater The problems we're seeing with ReadTheDocs builds right now are probably [caused by an outdated version of Sphinx](https://blog.readthedocs.com/build-errors-docutils-0-18/) that it's falling back to in order to provide Python2 compatibility. * Add explicit requirements file --- docs/conf.py | 2 +- docs/requirements.txt | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 docs/requirements.txt diff --git a/docs/conf.py b/docs/conf.py index 8c5ab6ebc..b205a37fd 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -25,7 +25,7 @@ # If your documentation needs a minimal Sphinx version, state it here. # -needs_sphinx = "1.0" +needs_sphinx = "3.0" # Add any Sphinx extension module names here, as strings. They can be # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom diff --git a/docs/requirements.txt b/docs/requirements.txt new file mode 100644 index 000000000..1d89bb456 --- /dev/null +++ b/docs/requirements.txt @@ -0,0 +1 @@ +Sphinx==4.3.0 From 52007a8fa59e2234b4e69ff9167e8c35916aff6b Mon Sep 17 00:00:00 2001 From: Boyan MILANOV Date: Thu, 18 Nov 2021 09:37:17 +0100 Subject: [PATCH 19/35] Fix handling of the program base address in Linux (#2500) * Fix handling of the program base address in Linux: * Distinguish interpreter and program base addresses * Serialize base addresses correctly * Add typing to base address fields in Linux platform Co-authored-by: Eric Hennenfent --- manticore/platforms/linux.py | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/manticore/platforms/linux.py b/manticore/platforms/linux.py index 2e1c44752..534065dc0 100644 --- a/manticore/platforms/linux.py +++ b/manticore/platforms/linux.py @@ -869,6 +869,9 @@ def __init__( self.envp = envp self.argv = argv self.stubs = SyscallStubs(parent=self) + # Load addresses + self.interp_base: Optional[int] = None + self.program_base: Optional[int] = None # dict of [int -> (int, int)] where tuple is (soft, hard) limits self._rlimits = { @@ -1028,7 +1031,8 @@ def __getstate__(self): state["syscall_trace"] = self.syscall_trace state["argv"] = self.argv state["envp"] = self.envp - state["base"] = self.base + state["interp_base"] = self.interp_base + state["program_base"] = self.program_base state["elf_bss"] = self.elf_bss state["end_code"] = self.end_code state["end_data"] = self.end_data @@ -1090,7 +1094,8 @@ def __setstate__(self, state: Dict) -> None: self.syscall_trace = state["syscall_trace"] self.argv = state["argv"] self.envp = state["envp"] - self.base = state["base"] + self.interp_base = state["interp_base"] + self.program_base = state["program_base"] self.elf_bss = state["elf_bss"] self.end_code = state["end_code"] self.end_data = state["end_data"] @@ -1546,7 +1551,8 @@ def _clean_interp_stream() -> None: logger.debug(f"Mappings:") for m in str(cpu.memory).split("\n"): logger.debug(f" {m}") - self.base = base + self.interp_base = base + self.program_base = self.load_addr self.elf_bss = elf_bss self.end_code = end_code self.end_data = end_data @@ -2852,7 +2858,7 @@ def wait(self, readfds, writefds, timeout) -> None: self.check_timers() def awake(self, procid) -> None: - """ Remove procid from waitlists and reestablish it in the running list """ + """Remove procid from waitlists and reestablish it in the running list""" logger.debug( f"Remove procid:{procid} from waitlists and reestablish it in the running list" ) @@ -2877,7 +2883,7 @@ def connections(self, fd: int) -> Optional[int]: return fd - 1 def signal_receive(self, fd: int) -> None: - """ Awake one process waiting to receive data on fd """ + """Awake one process waiting to receive data on fd""" connections = self.connections connection = connections(fd) if connection: @@ -2887,7 +2893,7 @@ def signal_receive(self, fd: int) -> None: self.awake(procid) def signal_transmit(self, fd: int) -> None: - """ Awake one process waiting to transmit data on fd """ + """Awake one process waiting to transmit data on fd""" connection = self.connections(fd) if connection is None or not self.fd_table.has_entry(connection): return @@ -2898,7 +2904,7 @@ def signal_transmit(self, fd: int) -> None: self.awake(procid) def check_timers(self) -> None: - """ Awake process if timer has expired """ + """Awake process if timer has expired""" if self._current is None: # Advance the clocks. Go to future!! advance = min([self.clocks] + [x for x in self.timers if x is not None]) + 1 From da677234a31e8f85a07779e88ee615f6a9aa5460 Mon Sep 17 00:00:00 2001 From: Boyan MILANOV Date: Tue, 23 Nov 2021 10:14:45 +0100 Subject: [PATCH 20/35] Add SMT simplifications for bitvec subtraction (#2504) * Add SMT simplifications for bitvec subtraction * Replace operator SUB by built-in '-' * Use '==' instead of 'is' to test bitvector equality * Lint * Use custom exception when __bool__ fails to evaluate expression --- manticore/core/smtlib/expression.py | 18 +++++++++++++----- manticore/core/smtlib/visitors.py | 19 +++++++++++++++---- tests/other/test_smtlibv2.py | 7 +++++++ 3 files changed, 35 insertions(+), 9 deletions(-) diff --git a/manticore/core/smtlib/expression.py b/manticore/core/smtlib/expression.py index df607e567..53de5bda6 100644 --- a/manticore/core/smtlib/expression.py +++ b/manticore/core/smtlib/expression.py @@ -15,6 +15,14 @@ class ExpressionException(SmtlibError): pass +class ExpressionEvalError(SmtlibError): + """Exception raised when an expression can't be concretized, typically + when calling __bool__() fails to produce a True/False boolean result + """ + + pass + + class XSlotted(type): """ Metaclass that will propagate slots on multi-inheritance classes @@ -65,7 +73,7 @@ def __new__(cls, clsname, bases, attrs, abstract=False): class Expression(object, metaclass=XSlotted, abstract=True): - """ Abstract taintable Expression. """ + """Abstract taintable Expression.""" __xslots__: Tuple[str, ...] = ("_taint",) @@ -214,7 +222,7 @@ def __bool__(self): x = simplify(self) if isinstance(x, Constant): return x.value - raise NotImplementedError("__bool__ for Bool") + raise ExpressionEvalError("__bool__ for Bool") class BoolVariable(Bool): @@ -259,7 +267,7 @@ def value(self): class BoolOperation(Bool, abstract=True): - """ An operation that results in a Bool """ + """An operation that results in a Bool""" __xslots__: Tuple[str, ...] = ("_operands",) @@ -302,7 +310,7 @@ def __init__(self, *, cond: "Bool", true: "Bool", false: "Bool", **kwargs): class BitVec(Expression, abstract=True): - """ BitVector expressions have a fixed bit size """ + """BitVector expressions have a fixed bit size""" __xslots__: Tuple[str, ...] = ("size",) @@ -564,7 +572,7 @@ def signed_value(self): class BitVecOperation(BitVec, abstract=True): - """ An operation that results in a BitVec """ + """An operation that results in a BitVec""" __xslots__: Tuple[str, ...] = ("_operands",) diff --git a/manticore/core/smtlib/visitors.py b/manticore/core/smtlib/visitors.py index f64dfd621..3f01a1757 100644 --- a/manticore/core/smtlib/visitors.py +++ b/manticore/core/smtlib/visitors.py @@ -395,7 +395,7 @@ def visit_BoolAnd(self, expression, a, b): return a def _visit_operation(self, expression, *operands): - """ constant folding, if all operands of an expression are a Constant do the math """ + """constant folding, if all operands of an expression are a Constant do the math""" operation = self.operations.get(type(expression), None) if operation is not None and all(isinstance(o, Constant) for o in operands): value = operation(*(x.value for x in operands)) @@ -438,7 +438,7 @@ def _changed(expression, operands): return any(operands[i] is not expression.operands[i] for i in range(arity)) def _visit_operation(self, expression, *operands): - """ constant folding, if all operands of an expression are a Constant do the math """ + """constant folding, if all operands of an expression are a Constant do the math""" if all(isinstance(o, Constant) for o in operands): expression = constant_folder(expression) if self._changed(expression, operands): @@ -716,9 +716,10 @@ def visit_BitVecAdd(self, expression, *operands): return right def visit_BitVecSub(self, expression, *operands): - """a - 0 ==> 0 + """a - 0 ==> a (a + b) - b ==> a (b + a) - b ==> a + a - a ==> 0 """ left = operands[0] right = operands[1] @@ -739,6 +740,16 @@ def visit_BitVecSub(self, expression, *operands): taint=subright.taint | right.taint, ), ) + elif isinstance(right, Constant) and right.value == 0: + return left + else: + # If equality can not be computed because of symbolic + # variables '==' will raise an exception + try: + if left == right: + return BitVecConstant(size=left.size, value=0) + except ExpressionEvalError: + pass def visit_BitVecOr(self, expression, *operands): """a | 0 => a @@ -1007,7 +1018,7 @@ def translate_to_smtlib(expression, **kwargs): class Replace(Visitor): - """ Simple visitor to replaces expressions """ + """Simple visitor to replaces expressions""" def __init__(self, bindings=None, **kwargs): super().__init__(**kwargs) diff --git a/tests/other/test_smtlibv2.py b/tests/other/test_smtlibv2.py index 5956ca2cb..e43b43ca9 100644 --- a/tests/other/test_smtlibv2.py +++ b/tests/other/test_smtlibv2.py @@ -848,6 +848,13 @@ def test_simplify_OR(self): cs.add(simplify(Operators.OR(var, bt)) == bt) self.assertTrue(self.solver.check(cs)) + def test_simplify_SUB(self): + cs = ConstraintSet() + var = cs.new_bitvec(size=32) + cs.add(simplify(var - var) == 0) + cs.add(simplify(var - 0) == var) + self.assertTrue(self.solver.check(cs)) + def testBasicReplace(self): """ Add """ a = BitVecConstant(size=32, value=100) From 285ab50ed637ad22806f0a0a9dd6940d35fa2e88 Mon Sep 17 00:00:00 2001 From: Nikita Sobolev Date: Sun, 5 Dec 2021 19:12:24 +0300 Subject: [PATCH 21/35] Improve namedtuple definition (#2506) While working on https://github.com/python/mypy/pull/11206 I found that `Regspec` definition is not ideal. It is recommended to use the same string name, as variable name. For example, it affects how `pickle` works. Related https://github.com/trailofbits/manticore/pull/2501 Related https://github.com/trailofbits/manticore/commit/6e036f3034b76bbecf36b5469e49294e038ff705 --- manticore/native/cpu/x86.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manticore/native/cpu/x86.py b/manticore/native/cpu/x86.py index 49f8c0ff7..9e8b4b1ef 100644 --- a/manticore/native/cpu/x86.py +++ b/manticore/native/cpu/x86.py @@ -144,7 +144,7 @@ def new_method(cpu, *args, **kw_args): class AMD64RegFile(RegisterFile): - Regspec = collections.namedtuple("RegSpec", "register_id ty offset size reset") + Regspec = collections.namedtuple("Regspec", "register_id ty offset size reset") _flags = {"CF": 0, "PF": 2, "AF": 4, "ZF": 6, "SF": 7, "IF": 9, "DF": 10, "OF": 11} _table = { "CS": Regspec("CS", int, 0, 16, False), From fac371cc43b7cb05a33f4dbd04bd0882710179a3 Mon Sep 17 00:00:00 2001 From: Boyan MILANOV Date: Thu, 16 Dec 2021 17:34:12 +0100 Subject: [PATCH 22/35] Enforce crytic-compile==0.2.1 (#2512) --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 08953fa65..d9c34c1fa 100644 --- a/setup.py +++ b/setup.py @@ -71,7 +71,7 @@ def rtd_dependent_deps(): "ply", "rlp", "intervaltree", - "crytic-compile>=0.2.1", + "crytic-compile==0.2.1", "wasm", "dataclasses; python_version < '3.7'", "pyevmasm>=0.2.3", From b050fdf0939f6c63f503cdf87ec0ab159dd41159 Mon Sep 17 00:00:00 2001 From: Boyan MILANOV Date: Tue, 4 Jan 2022 15:26:57 +0100 Subject: [PATCH 23/35] Add EXPLICIT fork policy (#2514) Add a new fork policy called "EXPLICIT" that allows to specify arbitrary concrete values for the expression on whom we are forking. * Add EXPLICIT fork policy allowing to provide our own concrete values * Add feasibility checks for the EXPLICIT concretisation policy * Add few type hints * Don't pass kwargs to BaseException * Only use lists in StateBase.concretize() --- manticore/core/manticore.py | 38 ++++++++++++------------ manticore/core/state.py | 58 +++++++++++++++++++++++++++---------- manticore/core/worker.py | 2 +- 3 files changed, 63 insertions(+), 35 deletions(-) diff --git a/manticore/core/manticore.py b/manticore/core/manticore.py index 3dbad1cba..579068221 100644 --- a/manticore/core/manticore.py +++ b/manticore/core/manticore.py @@ -6,7 +6,7 @@ import typing import random import weakref -from typing import Callable +from typing import Callable, List, Any, Optional from contextlib import contextmanager @@ -434,7 +434,7 @@ def goto_snapshot(self): @sync @only_from_main_script def clear_snapshot(self): - """ Remove any saved states """ + """Remove any saved states""" if self._snapshot: for state_id in self._snapshot: self._remove(state_id) @@ -443,7 +443,7 @@ def clear_snapshot(self): @sync @at_not_running def clear_terminated_states(self): - """ Remove all states from the terminated list """ + """Remove all states from the terminated list""" terminated_states_ids = tuple(self._terminated_states) for state_id in terminated_states_ids: self._terminated_states.remove(state_id) @@ -453,7 +453,7 @@ def clear_terminated_states(self): @sync @at_not_running def clear_ready_states(self): - """ Remove all states from the ready list """ + """Remove all states from the ready list""" ready_states_ids = tuple(self._ready_states) for state_id in ready_states_ids: self._ready_states.remove(state_id) @@ -480,7 +480,9 @@ def from_saved_state(cls, filename: str, *args, **kwargs): return cls(deserialized, *args, **kwargs) - def _fork(self, state, expression, policy="ALL", setstate=None): + def _fork( + self, state, expression, policy="ALL", setstate=None, values: Optional[List[Any]] = None + ): """ Fork state on expression concretizations. Using policy build a list of solutions for expression. @@ -510,7 +512,7 @@ def setstate(x, y): pass # Find a set of solutions for expression - solutions = state.concretize(expression, policy) + solutions = state.concretize(expression, policy, explicit_values=values) if not solutions: raise ManticoreError("Forking on unfeasible constraint set") @@ -626,7 +628,7 @@ def _put_state(self, state) -> int: return state_id def _get_state(self, wait=False) -> typing.Optional[StateBase]: - """ Dequeue a state form the READY list and add it to the BUSY list """ + """Dequeue a state form the READY list and add it to the BUSY list""" with self._lock: # If wait is true do the conditional wait for states if wait: @@ -860,32 +862,32 @@ def all_states(self): @sync def count_states(self): - """ Total states count """ + """Total states count""" return len(self._all_states) @sync def count_all_states(self): - """ Total states count """ + """Total states count""" return self.count_states() @sync def count_ready_states(self): - """ Ready states count """ + """Ready states count""" return len(self._ready_states) @sync def count_busy_states(self): - """ Busy states count """ + """Busy states count""" return len(self._busy_states) @sync def count_killed_states(self): - """ Cancelled states count """ + """Cancelled states count""" return len(self._killed_states) @sync def count_terminated_states(self): - """ Terminated states count """ + """Terminated states count""" return len(self._terminated_states) def generate_testcase(self, state, message: str = "test", name: str = "test") -> Testcase: @@ -978,7 +980,7 @@ def unregister_plugin(self, plugin: typing.Union[str, Plugin]): plugin_inst.manticore = None def subscribe(self, name, callback): - """ Register a callback to an event""" + """Register a callback to an event""" from types import MethodType if not isinstance(callback, MethodType): @@ -1045,7 +1047,7 @@ def locked_context(self, key=None, value_type=list): @sync def wait(self, condition): - """ Waits for the condition callable to return True """ + """Waits for the condition callable to return True""" self._lock.wait_for(condition) @sync @@ -1065,7 +1067,7 @@ def terminate(self): @sync def is_running(self): - """ True if workers are exploring BUSY states or waiting for READY states """ + """True if workers are exploring BUSY states or waiting for READY states""" # If there are still states in the BUSY list then the STOP/KILL event # was not yet answered # We know that BUSY states can only decrease after a stop is requested @@ -1073,7 +1075,7 @@ def is_running(self): @sync def is_killed(self): - """ True if workers are killed. It is safe to join them """ + """True if workers are killed. It is safe to join them""" # If there are still states in the BUSY list then the STOP/KILL event # was not yet answered # We know that BUSY states can only decrease after a kill is requested @@ -1277,5 +1279,5 @@ def register_daemon(self, callback: typing.Callable): self._daemon_callbacks.append(callback) def pretty_print_states(self, *_args): - """ Calls pretty_print_state_descriptors on the current set of state descriptors """ + """Calls pretty_print_state_descriptors on the current set of state descriptors""" pretty_print_state_descriptors(self.introspect()) diff --git a/manticore/core/state.py b/manticore/core/state.py index 563520b0c..e36d2520e 100644 --- a/manticore/core/state.py +++ b/manticore/core/state.py @@ -1,7 +1,7 @@ import copy import logging -from typing import List, Tuple, Sequence +from typing import List, Tuple, Sequence, Optional, Any from .smtlib import solver, Bool, issymbolic, BitVecConstant from .smtlib.expression import Expression @@ -21,11 +21,11 @@ class StateException(Exception): - """ All state related exceptions """ + """All state related exceptions""" class TerminateState(StateException): - """ Terminates current state exploration """ + """Terminates current state exploration""" def __init__(self, message, testcase=False): super().__init__(message) @@ -51,9 +51,27 @@ class Concretize(StateException): """ - _ValidPolicies = ["MIN", "MAX", "MINMAX", "ALL", "SAMPLED", "ONE", "PESSIMISTIC", "OPTIMISTIC"] - - def __init__(self, message, expression, setstate=None, policy=None, **kwargs): + _ValidPolicies = [ + "MIN", + "MAX", + "MINMAX", + "ALL", + "SAMPLED", + "ONE", + "PESSIMISTIC", + "OPTIMISTIC", + "EXPLICIT", + ] + + def __init__( + self, + message, + expression, + setstate=None, + policy=None, + values: Optional[List[Any]] = None, + **kwargs, + ): if policy is None: policy = "ALL" if policy not in self._ValidPolicies: @@ -63,8 +81,9 @@ def __init__(self, message, expression, setstate=None, policy=None, **kwargs): self.expression = expression self.setstate = setstate self.policy = policy + self.values = values self.message = f"Concretize: {message} (Policy: {policy})" - super().__init__(**kwargs) + super().__init__() class SerializeState(Concretize): @@ -365,7 +384,7 @@ def new_symbolic_value(self, nbits, label=None, taint=frozenset()): self._input_symbols.append(expr) return expr - def concretize(self, symbolic, policy, maxcount=7): + def concretize(self, symbolic, policy, maxcount=7, explicit_values: Optional[List[Any]] = None): """This finds a set of solutions for symbolic using policy. This limits the number of solutions returned to `maxcount` to avoid @@ -376,13 +395,13 @@ def concretize(self, symbolic, policy, maxcount=7): assert self.constraints == self.platform.constraints symbolic = self.migrate_expression(symbolic) - vals = [] + vals: List[Any] = [] if policy == "MINMAX": - vals = self._solver.minmax(self._constraints, symbolic) + vals = list(self._solver.minmax(self._constraints, symbolic)) elif policy == "MAX": - vals = (self._solver.max(self._constraints, symbolic),) + vals = [self._solver.max(self._constraints, symbolic)] elif policy == "MIN": - vals = (self._solver.min(self._constraints, symbolic),) + vals = [self._solver.min(self._constraints, symbolic)] elif policy == "SAMPLED": m, M = self._solver.minmax(self._constraints, symbolic) vals += [m, M] @@ -404,17 +423,24 @@ def concretize(self, symbolic, policy, maxcount=7): elif policy == "OPTIMISTIC": logger.info("Optimistic case when forking") if self._solver.can_be_true(self._constraints, symbolic): - vals = (True,) + vals = [True] else: # We assume the path constraint was feasible to begin with - vals = (False,) + vals = [False] elif policy == "PESSIMISTIC": logger.info("Pessimistic case when forking") if self._solver.can_be_true(self._constraints, symbolic == False): - vals = (False,) + vals = [False] else: # We assume the path constraint was feasible to begin with - vals = (True,) + vals = [True] + elif policy == "EXPLICIT": + if explicit_values: + for val in explicit_values: + if self._solver.can_be_true(self._constraints, val == symbolic): + vals.append(val) + if len(vals) >= maxcount: + break else: assert policy == "ALL" vals = self._solver.get_all_values( diff --git a/manticore/core/worker.py b/manticore/core/worker.py index 1efa911c9..66514df1c 100644 --- a/manticore/core/worker.py +++ b/manticore/core/worker.py @@ -155,7 +155,7 @@ def run(self, *args): # Though, normally fork() saves the spawned childs, # returns a None and let _get_state choose what to explore # next - m._fork(current_state, exc.expression, exc.policy, exc.setstate) + m._fork(current_state, exc.expression, exc.policy, exc.setstate, exc.values) current_state = None except TerminateState as exc: From 8202c30bbd20bf62b11363f58ba4694d5f7d27b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20L=C3=B3pez?= <2642849+elopez@users.noreply.github.com> Date: Tue, 18 Jan 2022 15:38:19 -0300 Subject: [PATCH 24/35] Add pip-audit action workflow (#2513) This adds a new GitHub Actions workflow. This workflow runs pip-audit on the repository on each new commit and pull request to the `master` branch, as well as every Tuesday morning. If any known vulnerable dependency is found, this workflow will fail. --- .github/workflows/pip-audit.yml | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 .github/workflows/pip-audit.yml diff --git a/.github/workflows/pip-audit.yml b/.github/workflows/pip-audit.yml new file mode 100644 index 000000000..ad399e80e --- /dev/null +++ b/.github/workflows/pip-audit.yml @@ -0,0 +1,27 @@ +name: pip-audit + +on: + push: + branches: [ master ] + pull_request: + branches: [ master ] + schedule: [ cron: "0 7 * * 2" ] + +jobs: + audit: + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v2 + - name: Set up Python 3.10 + uses: actions/setup-python@v2 + with: + python-version: "3.10" + - name: Install pip-audit + run: | + python -m pip install --upgrade pip + python -m pip install pip-audit + - name: Run pip-audit + run: | + python -m pip install . + pip-audit --strict --desc From 93211002a9cea6074790c0de974fb9e603881577 Mon Sep 17 00:00:00 2001 From: Boyan MILANOV Date: Thu, 20 Jan 2022 18:07:53 +0100 Subject: [PATCH 25/35] Fix `BitVecExtract` simplification for constant folding (#2524) * Fix BitVecExtract simplification for constant folding * Lint * Add test for extract constant folding * Lint * Test: pass BitVecExtract args with keywords --- manticore/core/smtlib/visitors.py | 2 +- tests/other/test_smtlibv2.py | 14 +++++++++++--- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/manticore/core/smtlib/visitors.py b/manticore/core/smtlib/visitors.py index 3f01a1757..3c21aa3f8 100644 --- a/manticore/core/smtlib/visitors.py +++ b/manticore/core/smtlib/visitors.py @@ -384,7 +384,7 @@ def visit_BitVecExtract(self, expression, *operands): begining = expression.begining end = expression.end value = value >> begining - mask = (1 << (end - begining)) - 1 + mask = (1 << (end - begining + 1)) - 1 value = value & mask return BitVecConstant(size=expression.size, value=value, taint=expression.taint) diff --git a/tests/other/test_smtlibv2.py b/tests/other/test_smtlibv2.py index e43b43ca9..92048ec2a 100644 --- a/tests/other/test_smtlibv2.py +++ b/tests/other/test_smtlibv2.py @@ -15,6 +15,7 @@ constant_folder, replace, BitVecConstant, + BitVecExtract, ) from manticore.core.smtlib.solver import ( Z3Solver, @@ -280,7 +281,7 @@ def test_constant_bitvec(self): self.assertTrue(x.value == 0) def testBasicAST_001(self): - """ Can't build abstract classes """ + """Can't build abstract classes""" a = BitVecConstant(size=32, value=100) self.assertRaises(TypeError, Expression, ()) @@ -289,7 +290,7 @@ def testBasicAST_001(self): self.assertRaises(TypeError, Operation, a) def testBasicOperation(self): - """ Add """ + """Add""" a = BitVecConstant(size=32, value=100) b = BitVecVariable(size=32, name="VAR") c = a + b @@ -820,6 +821,13 @@ def test_arithmetic_simplify_extract(self): ) self.assertEqual(translate_to_smtlib(simplify(c)), "((_ extract 23 8) VARA)") + def test_constant_folding_extract(self): + cs = ConstraintSet() + x = BitVecConstant(size=32, value=0xAB123456, taint=("important",)) + z = constant_folder(BitVecExtract(operand=x, offset=8, size=16)) + self.assertItemsEqual(z.taint, ("important",)) + self.assertEqual(z.value, 0x1234) + def test_arithmetic_simplify_udiv(self): cs = ConstraintSet() a = cs.new_bitvec(32, name="VARA") @@ -856,7 +864,7 @@ def test_simplify_SUB(self): self.assertTrue(self.solver.check(cs)) def testBasicReplace(self): - """ Add """ + """Add""" a = BitVecConstant(size=32, value=100) b1 = BitVecVariable(size=32, name="VAR1") b2 = BitVecVariable(size=32, name="VAR2") From bf2fba399045d33dc574dab937a4d0d1fddb8fdf Mon Sep 17 00:00:00 2001 From: Boyan MILANOV Date: Fri, 4 Feb 2022 11:08:16 +0100 Subject: [PATCH 26/35] x86 FXSAVE & FXRSTOR support (#2511) * Add SMT simplifications for bitvec subtraction * Add X86 support for FXSAVE and FXRSTOR * Unicorn emulator: ignore floating point registers than aren't yet supported in unicorn * Emulator: Also ignore MXCSR_MASK register * Add logic to translate floating point registers values from (mantissa,exponent) to bitfield --- manticore/native/cpu/x86.py | 204 ++++++++++++++++++++++++++++++++++-- manticore/utils/emulate.py | 19 +++- tests/native/test_x86.py | 34 +++++- 3 files changed, 244 insertions(+), 13 deletions(-) diff --git a/manticore/native/cpu/x86.py b/manticore/native/cpu/x86.py index 9e8b4b1ef..f0668c469 100644 --- a/manticore/native/cpu/x86.py +++ b/manticore/native/cpu/x86.py @@ -248,6 +248,13 @@ class AMD64RegFile(RegisterFile): "TOP": Regspec("FPSW", int, 11, 3, False), "FPTAG": Regspec("FPTAG", int, 0, 16, False), "FPCW": Regspec("FPCW", int, 0, 16, False), + "FOP": Regspec("FOP", int, 0, 11, False), + "FIP": Regspec("FIP", int, 0, 64, False), + "FCS": Regspec("FCS", int, 0, 16, False), + "FDP": Regspec("FDP", int, 0, 64, False), + "FDS": Regspec("FDS", int, 0, 16, False), + "MXCSR": Regspec("MXCSR", int, 0, 32, False), + "MXCSR_MASK": Regspec("MXCSR_MASK", int, 0, 32, False), "CF": Regspec("CF", bool, 0, 1, False), "PF": Regspec("PF", bool, 0, 1, False), "AF": Regspec("AF", bool, 0, 1, False), @@ -355,6 +362,13 @@ class AMD64RegFile(RegisterFile): "TOP": ("FPSW",), "FPCW": (), "FPTAG": (), + "FOP": (), + "FIP": (), + "FCS": (), + "FDP": (), + "FDS": (), + "MXCSR": (), + "MXCSR_MASK": (), "FP0": (), "FP1": (), "FP2": (), @@ -495,6 +509,13 @@ class AMD64RegFile(RegisterFile): "FPSW", "FPCW", "FPTAG", + "FOP", + "FIP", + "FCS", + "FDP", + "FDS", + "MXCSR", + "MXCSR_MASK", ) def __init__(self, *args, **kwargs): @@ -554,7 +575,18 @@ def __init__(self, *args, **kwargs): for reg in ("FP0", "FP1", "FP2", "FP3", "FP4", "FP5", "FP6", "FP7"): self._registers[reg] = (0, 0) - for reg in ("FPSW", "FPTAG", "FPCW"): + for reg in ( + "FPSW", + "FPTAG", + "FPCW", + "FOP", + "FIP", + "FCS", + "FDP", + "FDS", + "MXCSR", + "MXCSR_MASK", + ): self._registers[reg] = 0 self._cache = {} @@ -626,7 +658,14 @@ def _get_flag(self, register_id, register_size, offset, size): def _set_float(self, register_id, register_size, offset, size, reset, value): assert size == 80 assert offset == 0 - if not isinstance(value, tuple): # Add decimal here? + # Translate int bitfield into a floating point value according + # to IEEE 754 standard, 80-bit double extended precision + if isinstance(value, int): + value &= 0xFFFFFFFFFFFFFFFFFFFF # 80-bit mask + exponent = value >> 64 # Exponent is the 16 higher bits + mantissa = value & 0xFFFFFFFFFFFFFFFF # Mantissa is the lower 64 bits + value = (mantissa, exponent) + elif not isinstance(value, tuple): raise TypeError self._registers[register_id] = value return value @@ -637,7 +676,7 @@ def _get_float(self, register_id, register_size, offset, size): return self._registers[register_id] def _get_flags(self, reg): - """ Build EFLAGS/RFLAGS from flags """ + """Build EFLAGS/RFLAGS from flags""" def make_symbolic(flag_expr): register_size = 32 if reg == "EFLAGS" else 64 @@ -662,7 +701,7 @@ def make_symbolic(flag_expr): return res def _set_flags(self, reg, res): - """ Set individual flags from a EFLAGS/RFLAGS value """ + """Set individual flags from a EFLAGS/RFLAGS value""" # assert sizeof (res) == 32 if reg == 'EFLAGS' else 64 for flag, offset in self._flags.items(): self.write(flag, Operators.EXTRACT(res, offset, 1)) @@ -731,7 +770,7 @@ def __copy__(self): # Operand Wrapper class AMD64Operand(Operand): - """ This class deals with capstone X86 operands """ + """This class deals with capstone X86 operands""" def __init__(self, cpu: Cpu, op): super().__init__(cpu, op) @@ -883,7 +922,7 @@ def pop(cpu, size): # The instruction cache must be invalidated after an executable # page was changed or removed or added def invalidate_cache(cpu, address, size): - """ remove decoded instruction from instruction cache """ + """remove decoded instruction from instruction cache""" cache = cpu.instruction_cache for offset in range(size): if address + offset in cache: @@ -899,6 +938,23 @@ def canonicalize_instruction_name(self, instruction): name = OP_NAME_MAP.get(name, name) return name + def read_register_as_bitfield(self, name): + """Read a register and return its value as a bitfield. + - if the register holds a bitvector, the bitvector object is returned. + - if the register holds a concrete value (int/float) it is returned as + a bitfield matching its representation in memory + + This is mainly used to be able to write floating point registers to + memory. + """ + value = self.read_register(name) + if isinstance(value, tuple): + # Convert floating point to bitfield according to IEEE 754 + # (16-bits exponent).(64-bits mantissa) + mantissa, exponent = value + value = mantissa + (exponent << 64) + return value + # # Instruction Implementations # @@ -5676,6 +5732,37 @@ def sem_SYSCALL(cpu): cpu.R11 = cpu.RFLAGS raise Syscall() + def generic_FXSAVE(cpu, dest, reg_layout): + """ + Saves the current state of the x87 FPU, MMX technology, XMM, and + MXCSR registers to a 512-byte memory location specified in the + destination operand. + + The content layout of the 512 byte region depends + on whether the processor is operating in non-64-bit operating modes + or 64-bit sub-mode of IA-32e mode + """ + addr = dest.address() + for offset, reg, size in reg_layout: + cpu.write_int(addr + offset, cpu.read_register_as_bitfield(reg), size) + + def generic_FXRSTOR(cpu, dest, reg_layout): + """ + Reloads the x87 FPU, MMX technology, XMM, and MXCSR registers from + the 512-byte memory image specified in the source operand. This data should + have been written to memory previously using the FXSAVE instruction, and in + the same format as required by the operating modes. The first byte of the data + should be located on a 16-byte boundary. + + There are three distinct layouts of the FXSAVE state map: + one for legacy and compatibility mode, a second + format for 64-bit mode FXSAVE/FXRSTOR with REX.W=0, and the third format is for + 64-bit mode with FXSAVE64/FXRSTOR64 + """ + addr = dest.address() + for offset, reg, size in reg_layout: + cpu.write_register(reg, cpu.read_int(addr + offset, size)) + @instruction def SYSCALL(cpu): """ @@ -6518,6 +6605,44 @@ class AMD64Cpu(X86Cpu): arch = cs.CS_ARCH_X86 mode = cs.CS_MODE_64 + # CPU specific instruction behaviour + FXSAVE_layout = [ + (0, "FPCW", 16), + (2, "FPSW", 16), + (4, "FPTAG", 8), + (6, "FOP", 16), + (8, "FIP", 32), + (12, "FCS", 16), + (16, "FDP", 32), + (20, "FDS", 16), + (24, "MXCSR", 32), + (28, "MXCSR_MASK", 32), + (32, "FP0", 80), + (48, "FP1", 80), + (64, "FP2", 80), + (80, "FP3", 80), + (96, "FP4", 80), + (112, "FP5", 80), + (128, "FP6", 80), + (144, "FP7", 80), + (160, "XMM0", 128), + (176, "XMM1", 128), + (192, "XMM2", 128), + (208, "XMM3", 128), + (224, "XMM4", 128), + (240, "XMM5", 128), + (256, "XMM6", 128), + (272, "XMM7", 128), + (288, "XMM8", 128), + (304, "XMM9", 128), + (320, "XMM10", 128), + (336, "XMM11", 128), + (352, "XMM12", 128), + (368, "XMM13", 128), + (384, "XMM14", 128), + (400, "XMM15", 128), + ] + def __init__(self, memory: Memory, *args, **kwargs): """ Builds a CPU model. @@ -6633,6 +6758,14 @@ def XLATB(cpu): """ cpu.AL = cpu.read_int(cpu.RBX + Operators.ZEXTEND(cpu.AL, 64), 8) + @instruction + def FXSAVE(cpu, dest): + return cpu.generic_FXSAVE(dest, AMD64Cpu.FXSAVE_layout) + + @instruction + def FXRSTOR(cpu, src): + return cpu.generic_FXRSTOR(src, AMD64Cpu.FXSAVE_layout) + class I386Cpu(X86Cpu): # Config @@ -6642,6 +6775,36 @@ class I386Cpu(X86Cpu): arch = cs.CS_ARCH_X86 mode = cs.CS_MODE_32 + # CPU specific instruction behaviour + FXSAVE_layout = [ + (0, "FPCW", 16), + (2, "FPSW", 16), + (4, "FPTAG", 8), + (6, "FOP", 16), + (8, "FIP", 32), + (12, "FCS", 16), + (16, "FDP", 32), + (20, "FDS", 16), + (24, "MXCSR", 32), + (28, "MXCSR_MASK", 32), + (32, "FP0", 80), + (48, "FP1", 80), + (64, "FP2", 80), + (80, "FP3", 80), + (96, "FP4", 80), + (112, "FP5", 80), + (128, "FP6", 80), + (144, "FP7", 80), + (160, "XMM0", 128), + (176, "XMM1", 128), + (192, "XMM2", 128), + (208, "XMM3", 128), + (224, "XMM4", 128), + (240, "XMM5", 128), + (256, "XMM6", 128), + (272, "XMM7", 128), + ] + def __init__(self, memory: Memory, *args, **kwargs): """ Builds a CPU model. @@ -6708,7 +6871,26 @@ def canonical_registers(self): regs = ["EAX", "ECX", "EDX", "EBX", "ESP", "EBP", "ESI", "EDI", "EIP"] regs.extend(["CS", "DS", "ES", "SS", "FS", "GS"]) regs.extend( - ["FP0", "FP1", "FP2", "FP3", "FP4", "FP5", "FP6", "FP7", "FPCW", "FPSW", "FPTAG"] + [ + "FP0", + "FP1", + "FP2", + "FP3", + "FP4", + "FP5", + "FP6", + "FP7", + "FPCW", + "FPSW", + "FPTAG", + "FOP", + "FIP", + "FCS", + "FDP", + "FDS", + "MXCSR", + "MXCSR_MASK", + ] ) regs.extend( [ @@ -6760,3 +6942,11 @@ def XLATB(cpu): :param dest: destination operand. """ cpu.AL = cpu.read_int(cpu.EBX + Operators.ZEXTEND(cpu.AL, 32), 8) + + @instruction + def FXSAVE(cpu, dest): + return cpu.generic_FXSAVE(dest, I386Cpu.FXSAVE_layout) + + @instruction + def FXRSTOR(cpu, src): + return cpu.generic_FXRSTOR(src, I386Cpu.FXSAVE_layout) diff --git a/manticore/utils/emulate.py b/manticore/utils/emulate.py index a7154c3b6..b6be6e706 100644 --- a/manticore/utils/emulate.py +++ b/manticore/utils/emulate.py @@ -88,6 +88,8 @@ def __init__(self, cpu): self._cpu = cpu self._mem_delta = {} self.flag_registers = {"CF", "PF", "AF", "ZF", "SF", "IF", "DF", "OF"} + # Registers to ignore when translating manticore context to unicorn + self.ignore_registers = {"FIP", "FOP", "FDS", "FCS", "FDP", "MXCSR_MASK"} self.write_backs_disabled = False self._stop_at = None # Holds key of range (addr, addr + size) and value of permissions @@ -144,6 +146,9 @@ def copy_memory(self, address: int, size: int): def load_state_from_manticore(self) -> None: for reg in self.registers: + # Ignore registers that aren't supported by unicorn + if reg in self.ignore_registers: + continue val = self._cpu.read_register(reg) if issymbolic(val): from ..native.cpu.abstractcpu import ConcretizeRegister @@ -251,7 +256,7 @@ def unmap_memory_callback(self, start, size): logger.debug(f"\tParent map(s) {parent_map}") def protect_memory_callback(self, start, size, perms): - """ Set memory protections in Unicorn correctly """ + """Set memory protections in Unicorn correctly""" logger.debug(f"Changing permissions on {start:#x}:{start+size:#x} to '{perms}'") self._emu.mem_protect(start, size, convert_permissions(perms)) @@ -399,6 +404,9 @@ def sync_unicorn_to_manticore(self): """ self.write_backs_disabled = True for reg in self.registers: + # Ignore registers that aren't supported by unicorn + if reg in self.ignore_registers: + continue val = self._emu.reg_read(self._to_unicorn_id(reg)) self._cpu.write_register(reg, val) if len(self._mem_delta) > 0: @@ -410,7 +418,7 @@ def sync_unicorn_to_manticore(self): self._mem_delta = {} def write_back_memory(self, where, expr, size): - """ Copy memory writes from Manticore back into Unicorn in real-time """ + """Copy memory writes from Manticore back into Unicorn in real-time""" if self.write_backs_disabled: return if type(expr) is bytes: @@ -441,7 +449,10 @@ def write_back_memory(self, where, expr, size): ) def write_back_register(self, reg, val): - """ Sync register state from Manticore -> Unicorn""" + """Sync register state from Manticore -> Unicorn""" + # Ignore registers that aren't supported by unicorn + if reg in self.ignore_registers: + return if self.write_backs_disabled: return if issymbolic(val): @@ -453,7 +464,7 @@ def write_back_register(self, reg, val): self._emu.reg_write(self._to_unicorn_id(reg), val) def update_segment(self, selector, base, size, perms): - """ Only useful for setting FS right now. """ + """Only useful for setting FS right now.""" logger.debug("Updating selector %s to 0x%02x (%s bytes) (%s)", selector, base, size, perms) self.write_back_register("FS", selector) self.write_back_register("FS_BASE", base) diff --git a/tests/native/test_x86.py b/tests/native/test_x86.py index 369927533..f4d5d198c 100644 --- a/tests/native/test_x86.py +++ b/tests/native/test_x86.py @@ -76,7 +76,7 @@ def assertEqual(self, a, b): return super().assertEqual(a, b) class ROOperand: - """ Mocking class for operand ronly """ + """Mocking class for operand ronly""" def __init__(self, size, value): self.size = size @@ -86,7 +86,7 @@ def read(self): return self.value & ((1 << self.size) - 1) class RWOperand(ROOperand): - """ Mocking class for operand rw """ + """Mocking class for operand rw""" def write(self, value): self.value = value & ((1 << self.size) - 1) @@ -51337,6 +51337,36 @@ def test_FNSTCW_1_symbolic(self): temp_cs.add(condition == False) self.assertFalse(solver.check(temp_cs)) + def test_FXSAVE_FXRSTOR(self): + """Instructions FXSAVE/FXRSTOR + Groups: + 0x805B9C0: 0f ae 00 fxsave [rax] + 0x805B9C3: 0f ae 08 fxrstor [rax] + """ + mem = Memory64() + cpu = AMD64Cpu(mem) + mem.mmap(0x0805B000, 0x1000, "rwx") + mem.mmap(0x1000, 0x1000, "rw") + mem.write(0x805B9C0, "\x0f\xae\x00") + cpu.EIP = 0x805B9C0 + cpu.RAX = 0x1234 + + # Only test on some regs + reg_list = ["FIP", "FPCW", "MXCSR", "FP0", "FP7", "XMM0", "XMM7", "XMM15"] + # Set FP registers and execute FXSAVE + for i, reg in enumerate(reg_list): + setattr(cpu, reg, i) + cpu.execute() + # Clobber registers then execute FXRSTOR + for i, reg in enumerate(reg_list): + setattr(cpu, reg, -1) + mem.write(0x805B9C3, "\x0f\xae\x08") + cpu.EIP = 0x805B9C3 + cpu.execute() + + for i, reg in enumerate(reg_list): + self.assertEqual(cpu.read_register_as_bitfield(reg), i) + def test_IMUL_1_symbolic(self): """Instruction IMUL_1 Groups: From 793b1de12d77588f2d51290779438a04b0b211ee Mon Sep 17 00:00:00 2001 From: Boyan MILANOV Date: Fri, 11 Feb 2022 09:17:13 +0100 Subject: [PATCH 27/35] Also ignore missing unicorn registers in the fallback emulator (#2531) --- manticore/utils/fallback_emulator.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/manticore/utils/fallback_emulator.py b/manticore/utils/fallback_emulator.py index bb31eec51..fc77fec3e 100644 --- a/manticore/utils/fallback_emulator.py +++ b/manticore/utils/fallback_emulator.py @@ -215,7 +215,8 @@ def _step(self, instruction): "0x%x:\t%s\t%s" % (instruction.address, instruction.mnemonic, instruction.op_str) ) - registers = set(self._cpu.canonical_registers) + ignore_registers = {"FIP", "FOP", "FDS", "FCS", "FDP", "MXCSR_MASK"} + registers = set(self._cpu.canonical_registers) - ignore_registers # Refer to EFLAGS instead of individual flags for x86 if self._cpu.arch == CS_ARCH_X86: @@ -279,7 +280,7 @@ def _step(self, instruction): if logger.isEnabledFor(logging.DEBUG): logger.debug("=" * 10) - for register in self._cpu.canonical_registers: + for register in registers: logger.debug( f"Register {register:3s} " f"Manticore: {self._cpu.read_register(register):08x}, " From 2e2258ca7c3ce0eb420f20bb08c5aa9c4c8f05d3 Mon Sep 17 00:00:00 2001 From: Eric Hennenfent Date: Wed, 16 Feb 2022 09:28:52 -0800 Subject: [PATCH 28/35] Update to crytic-compile 0.2.2 (#2530) * Update to crytic-compile 0.2.2 This PR bumps our required version of `crytic-compile` to the latest release (0.2.2). Tweaks the initialization routine in `ethereum/manticore.py` in order to account for breaking changes in https://github.com/crytic/crytic-compile/pull/223 * Delete accidental files This reverts commit e5fe245d06f9dcf9196cc85525d9b18e1a4db80b. * Fix variable name reuse --- manticore/ethereum/manticore.py | 38 +++++++++++++++++++++------------ setup.py | 2 +- 2 files changed, 25 insertions(+), 15 deletions(-) diff --git a/manticore/ethereum/manticore.py b/manticore/ethereum/manticore.py index a303dc6c3..ca6dcac5e 100644 --- a/manticore/ethereum/manticore.py +++ b/manticore/ethereum/manticore.py @@ -83,7 +83,7 @@ def write_findings(method, lead_space, address, pc, at_init=""): def calculate_coverage(runtime_bytecode, seen): - """ Calculates what percentage of runtime_bytecode has been seen """ + """Calculates what percentage of runtime_bytecode has been seen""" count, total = 0, 0 bytecode = SolidityMetadata._without_metadata(runtime_bytecode) for i in EVMAsm.disassemble_all(bytecode): @@ -302,7 +302,17 @@ def _compile_through_crytic_compile(filename, contract_name, libraries, crytic_c hashes = compilation_unit.hashes(name) abi = compilation_unit.abi(name) - filename = compilation_unit.filename_of_contract(name).absolute + filename = None + for _fname, contracts in compilation_unit.filename_to_contracts.items(): + if name in contracts: + filename = _fname.absolute + break + + if filename is None: + raise EthereumError( + f"Could not find a contract named {name}. Contracts found: {', '.join(compilation_unit.contracts_names)}" + ) + with open(filename) as f: source_code = f.read() @@ -425,7 +435,7 @@ def __init__(self, plugins=None, **kwargs): @property def world(self): - """ The world instance or None if there is more than one state """ + """The world instance or None if there is more than one state""" return self.get_world() # deprecate this 5 in favor of for state in m.all_states: do stuff? @@ -437,7 +447,7 @@ def completed_transactions(self): @deprecated("You should use the `platform` member of a `state` instance instead.") def get_world(self, state_id=None): - """ Returns the evm world of `state_id` state. """ + """Returns the evm world of `state_id` state.""" if state_id is None: state_id = self._ready_states[0] @@ -449,40 +459,40 @@ def get_world(self, state_id=None): @deprecated("Instead, call `get_balance` on a state instance") def get_balance(self, address, state_id=None): - """ Balance for account `address` on state `state_id` """ + """Balance for account `address` on state `state_id`""" if isinstance(address, EVMAccount): address = int(address) return self.get_world(state_id).get_balance(address) @deprecated("Instead, call `get_storage_data` on a state instance") def get_storage_data(self, address, offset, state_id=None): - """ Storage data for `offset` on account `address` on state `state_id` """ + """Storage data for `offset` on account `address` on state `state_id`""" if isinstance(address, EVMAccount): address = int(address) return self.get_world(state_id).get_storage_data(address, offset) @deprecated("Instead, call `get_code` on a state instance") def get_code(self, address, state_id=None): - """ Storage data for `offset` on account `address` on state `state_id` """ + """Storage data for `offset` on account `address` on state `state_id`""" if isinstance(address, EVMAccount): address = int(address) return self.get_world(state_id).get_code(address) @deprecated("Instead, use `state.last_transaction.return_data` on a state instance") def last_return(self, state_id=None): - """ Last returned buffer for state `state_id` """ + """Last returned buffer for state `state_id`""" state = self.load(state_id) return state.platform.last_transaction.return_data @deprecated("Instead, use `state.transactions` on a state instance") def transactions(self, state_id=None): - """ Transactions list for state `state_id` """ + """Transactions list for state `state_id`""" state = self._load(state_id) return state.platform.transactions @deprecated("Instead, use `state.transactions` on a state instance") def human_transactions(self, state_id=None): - """ Transactions list for state `state_id` """ + """Transactions list for state `state_id`""" state = self.load(state_id) return state.platform.human_transactions @@ -495,7 +505,7 @@ def make_symbolic_arguments(self, types): return self._make_symbolic_arguments(abitypes.parse(types)) def _make_symbolic_arguments(self, ty): - """ This makes a tuple of symbols to be used as arguments of type ty""" + """This makes a tuple of symbols to be used as arguments of type ty""" # If the types describe an string or an array this will produce strings # or arrays of a default size. @@ -739,14 +749,14 @@ def _get_uniq_name(self, stem): return name def _all_addresses(self): - """ Returns all addresses in all running states """ + """Returns all addresses in all running states""" ret = set() for state in self.ready_states: ret |= set(state.platform.accounts) return ret def new_address(self): - """ Create a fresh 160bit address """ + """Create a fresh 160bit address""" all_addresses = self._all_addresses() while True: new_address = random.randint(100, pow(2, 160)) @@ -1484,7 +1494,7 @@ def _terminate_state_callback(self, state, e): # Callbacks def _did_evm_execute_instruction_callback(self, state, instruction, arguments, result): - """ INTERNAL USE """ + """INTERNAL USE""" # logger.debug("%s", state.platform.current_vm) # TODO move to a plugin at_init = state.platform.current_transaction.sort == "CREATE" diff --git a/setup.py b/setup.py index d9c34c1fa..4cd2135ac 100644 --- a/setup.py +++ b/setup.py @@ -71,7 +71,7 @@ def rtd_dependent_deps(): "ply", "rlp", "intervaltree", - "crytic-compile==0.2.1", + "crytic-compile==0.2.2", "wasm", "dataclasses; python_version < '3.7'", "pyevmasm>=0.2.3", From a50b8565961666edc8b80cdcc3708ca2f3bc97d8 Mon Sep 17 00:00:00 2001 From: Eric Hennenfent Date: Wed, 16 Feb 2022 09:29:06 -0800 Subject: [PATCH 29/35] Split off ENDBR32/64 from CHESS branch (#2533) Seeing as they're fancy NOP's, I don't think there's any reason not to merge them into `master`, and thus avoid aggressively concretizing the state in order to emulate them under Unicorn. --- manticore/native/cpu/x86.py | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/manticore/native/cpu/x86.py b/manticore/native/cpu/x86.py index f0668c469..7b5bd5852 100644 --- a/manticore/native/cpu/x86.py +++ b/manticore/native/cpu/x86.py @@ -5571,6 +5571,35 @@ def NOP(cpu, arg0=None): :param arg0: this argument is ignored. """ + @instruction + def ENDBR32(cpu): + """ + The ENDBRANCH is a new instruction that is used to mark valid jump target + addresses of indirect calls and jumps in the program. This instruction + opcode is selected to be one that is a NOP on legacy machines such that + programs compiled with ENDBRANCH new instruction continue to function on + old machines without the CET enforcement. On processors that support CET + the ENDBRANCH is still a NOP and is primarily used as a marker instruction + by the processor pipeline to detect control flow violations. + This is the 32-bit variant. + :param cpu: current CPU. + """ + pass + + @instruction + def ENDBR64(cpu): + """ + The ENDBRANCH is a new instruction that is used to mark valid jump target + addresses of indirect calls and jumps in the program. This instruction + opcode is selected to be one that is a NOP on legacy machines such that + programs compiled with ENDBRANCH new instruction continue to function on + old machines without the CET enforcement. On processors that support CET + the ENDBRANCH is still a NOP and is primarily used as a marker instruction + by the processor pipeline to detect control flow violations. + :param cpu: current CPU. + """ + pass + @instruction def MOVD(cpu, op0, op1): cpu._writeCorrectSize(op0, op1) From 49f7ebc86c32ebeeec895a24d62ca607f797fb96 Mon Sep 17 00:00:00 2001 From: Eric Hennenfent Date: Thu, 17 Feb 2022 09:56:14 -0800 Subject: [PATCH 30/35] Epoll Implementation (#2529) * Use my capstone dev branch until fixes are merged into next * Fix aarch64 * Fix ARM * Update Capstone commit to fix arm64 LD1 instruction immediates * Ignore coverage tracking for defensive assertions and exceptions * ENDBR64 as nop * Add lacking x86 tests * New x86 instrution test * Disable write back once we hit our stop in Unicorn emulation * Make emulator reinitialize after write backs are disabled * Fix linting on test_general Extremely strange that my local black==19.10b0 doesn't catch this, but the one on GH actions does * Add a Rust/Unicorn resumption test * Make rusticorn binary actually check behavior * Run CI on chess branch * Support for pread64 syscall * Delete duplicated test method * Fix addresses and improve error handling * Fix issue with sphinx autodoc Sphinx doesn't handle side-effects of importing * Add last_executed_pc property to abstract CPU Helpful for knowing the exact last executed instruction address. * Optionally skip publishing mem read/writes in CPU * Shallow copy AMD64RegFile but keep concrete register values The copied RegisterFile should be read-only and used to keep track of concrete register values at a certain instant * Remove call to pkg_resources that breaks custom installation * Fix mypy * Fix Unicorn resume * Update unicorn to latest 1.0.2 * Update capstone to latest 4.0.2 * Correctly process memory maps * Synchronize data from manticore to unicorn upon resume * Fix some issues with FS register and segments * Fix some synchronization with CPUID instruction as compared to Unicorn * X86 syscall instruction breakout for semantics * Implementation of epoll * Fix test missed during merge * Fix more tests missed during merge * staticmethods to get syscall info * Revert some unrelated changes * Revert more unrelated changes * Revert MORE unrelated changes * Unstage changes to ARM/x86 CPUs * Remove fast_crash parameter (unrelated to this PR) * Add tests Co-authored-by: Eric Kilmer Co-authored-by: feliam --- manticore/native/plugins.py | 16 ++ manticore/platforms/linux.py | 316 ++++++++++++++++++++- manticore/platforms/linux_syscall_stubs.py | 42 ++- tests/native/binaries/epoll | Bin 0 -> 845168 bytes tests/native/binaries/epoll.c | 60 ++++ tests/native/test_syscalls.py | 23 ++ 6 files changed, 431 insertions(+), 26 deletions(-) create mode 100755 tests/native/binaries/epoll create mode 100644 tests/native/binaries/epoll.c diff --git a/manticore/native/plugins.py b/manticore/native/plugins.py index 939f5cb97..9cf948fd6 100644 --- a/manticore/native/plugins.py +++ b/manticore/native/plugins.py @@ -1,3 +1,5 @@ +import types + from ..core.plugin import Plugin from .state_merging import merge_constraints, is_merge_possible, merge import logging @@ -125,3 +127,17 @@ def will_load_state_callback(self, current_state_id): # UGLY we are replacing a state_id. This may be breaking caches in # the future self.replace_state(current_state_id, merged_state) + + +class SyscallCounter(Plugin): + def will_execute_syscall_callback(self, state, model): + name = model.__func__.__name__ if isinstance(model, types.MethodType) else model.__name__ + with self.locked_context("syscall_counts", dict) as counts: + counts[name] = counts.get(name, 0) + 1 + + def get_counts(self): + with self.locked_context("syscall_counts", dict) as ctx: + return ctx + + def did_run_callback(self): + logger.info("Syscalls executed: %s", self.get_counts()) diff --git a/manticore/platforms/linux.py b/manticore/platforms/linux.py index 534065dc0..b1ab3fce9 100644 --- a/manticore/platforms/linux.py +++ b/manticore/platforms/linux.py @@ -3,6 +3,7 @@ import errno import fcntl import logging +import select import socket import struct import time @@ -45,7 +46,20 @@ from ..native.state import State from ..platforms.platform import Platform, SyscallNotImplemented, unimplemented -from typing import cast, Any, Deque, Dict, IO, Iterable, List, Optional, Set, Tuple, Union, Callable +from typing import ( + cast, + Any, + Deque, + Dict, + IO, + Iterable, + List, + Optional, + Set, + Tuple, + Union, + Callable, +) logger = logging.getLogger(__name__) @@ -197,6 +211,15 @@ def tell(self) -> int: def stat(self) -> StatResult: ... + @abstractmethod + def poll(self) -> int: + ... + + @property + @abstractmethod + def closed(self) -> bool: + ... + @dataclass class FdTableEntry: @@ -284,6 +307,59 @@ def get_twaiters(self, fd: int) -> Set[int]: return self._lookup(fd).twaiters +@dataclass +class EPollEvent: + events: int # Part of epoll_event + data: int # Part of epoll_event + + +@concreteclass +class EventPoll(FdLike): + """ + An EventPoll class for epoll support. Internal kernel object referenced by + a file descriptor + """ + + def __init__(self): + # List of file descriptor entries that are registered with this object + self.interest_list: Dict[FdLike, EPollEvent] = {} + + def read(self, size: int): + raise NotImplemented + + def write(self, buf) -> int: + raise NotImplemented + + def sync(self) -> None: + raise NotImplemented + + def close(self) -> None: + # Nothing really to do + pass + + def seek(self, offset: int, whence: int) -> int: + raise NotImplemented + + def is_full(self) -> bool: + raise NotImplemented + + def ioctl(self, request, argp) -> int: + raise NotImplemented + + def tell(self) -> int: + raise NotImplemented + + def stat(self) -> StatResult: + raise NotImplemented + + def poll(self) -> int: + # TODO(ekilmer): Look into how we could implement this + return select.POLLERR + + def closed(self) -> bool: + return False + + @concreteclass class File(FdLike): def __init__(self, path: str, flags: int): @@ -349,6 +425,9 @@ def tell(self) -> int: def seek(self, offset: int, whence: int = os.SEEK_SET) -> int: return self.file.seek(offset, whence) + def pread(self, count, offset): + return os.pread(self.fileno(), count, offset) + def write(self, buf): return self.file.write(buf) @@ -367,6 +446,17 @@ def is_full(self) -> bool: def sync(self) -> None: pass + def poll(self) -> int: + """Return EPOLLIN or EPOLLOUT""" + # If opened with read, then should watch for reads + if "r" in self.mode: + # TODO + return select.POLLIN + elif "w" in self.mode: + return select.POLLOUT + else: + return select.POLLERR + # TODO - we should consider refactoring File so that we don't have to mute these errors @concreteclass @@ -412,6 +502,10 @@ def name(self) -> str: def mode(self) -> str: return mode_from_flags(self.flags) + @property + def closed(self) -> bool: + return False + def tell(self) -> int: return 0 @@ -448,6 +542,10 @@ def is_full(self) -> bool: def ioctl(self, request, argp): raise FdError("Invalid ioctl() operation on Directory", errno.ENOTTY) + def poll(self) -> int: + # TODO(ekilmer): Look into how we could implement this + return select.POLLERR + @concreteclass class SymbolicFile(File): @@ -615,6 +713,15 @@ def stat(self) -> StatResult: 8592, 11, 9, 1, 1000, 5, 0, 1378673920, 1378673920, 1378653796, 0x400, 0x8808, 0 ) + @property + def closed(self) -> bool: + return False + + def poll(self) -> int: + # TODO(ekilmer): Look into how we could implement this + # POLLERR is same as EPOLLERR but mypy complains on Macs + return select.POLLERR + @concreteclass class Socket(FdLike): @@ -712,9 +819,18 @@ def close(self): """ pass + @property + def closed(self) -> bool: + return False + def ioctl(self, request, argp): raise FdError("Invalid ioctl() operation on Socket", errno.ENOTTY) + def poll(self) -> int: + if self.is_empty(): + return select.POLLOUT + return select.POLLIN + @concreteclass class SymbolicSocket(Socket): @@ -1780,6 +1896,33 @@ def sys_read(self, fd: int, buf: int, count: int) -> int: return len(data) + def sys_pread64(self, fd: int, buf: int, count: int, offset: int) -> int: + """ + read from a file descriptor at a given offset + """ + data: bytes = bytes() + if count != 0: + if buf not in self.current.memory: # or not self.current.memory.isValid(buf+count): + logger.info("sys_pread: buf points to invalid address. Returning -errno.EFAULT") + return -errno.EFAULT + + try: + # Read the data and put it in memory + target_file = self._get_fdlike(fd) + if isinstance(target_file, File): + data = target_file.pread(count, offset) + else: + logger.error(f"Unsupported pread on {type(target_file)} at fd {fd}") + except FdError as e: + logger.info( + f"sys_pread: Not valid file descriptor ({fd}). Returning -{errorcode(e.err)}" + ) + return -e.err + self.syscall_trace.append(("_pread", fd, data)) + self.current.write_bytes(buf, data) + + return len(data) + def sys_write(self, fd: int, buf, count) -> int: """write - send bytes through a file descriptor The write system call writes up to count bytes from the buffer pointed @@ -1834,6 +1977,172 @@ def sys_fork(self) -> int: """ return -errno.ENOSYS + # Epoll event masks + EPOLLIN = 0x00000001 + EPOLLPRI = 0x00000002 + EPOLLOUT = 0x00000004 + EPOLLERR = 0x00000008 + EPOLLHUP = 0x00000010 + EPOLLNVAL = 0x00000020 + EPOLLRDNORM = 0x00000040 + EPOLLRDBAND = 0x00000080 + EPOLLWRNORM = 0x00000100 + EPOLLWRBAND = 0x00000200 + EPOLLMSG = 0x00000400 + EPOLLRDHUP = 0x00002000 + + def _do_epoll_create(self, flags: int): + # kernel - fs/eventpoll.c + EPOLL_CLOEXEC = os.O_CLOEXEC + + if flags & ~EPOLL_CLOEXEC: + return -errno.EINVAL + + # Create a minimal eventpoll file + return self.fd_table.add_entry(EventPoll()) + + def sys_epoll_create(self, size: int) -> int: + if size <= 0: + return -errno.EINVAL + return self._do_epoll_create(0) + + def sys_epoll_create1(self, flags: int) -> int: + return self._do_epoll_create(flags) + + def sys_epoll_ctl(self, epfd: int, op: int, fd: int, epds) -> int: + """Best effort implementation of what's found in fs/eventpoll.c""" + try: + epoll_file = self.fd_table.get_fdlike(epfd) + except FdError: + return -errno.EBADF + try: + target_file = self.fd_table.get_fdlike(fd) + except FdError: + return -errno.EBADF + + # epoll_file must support poll functionality + pass # TODO + + if not isinstance(epoll_file, EventPoll) or epoll_file == target_file: + return -errno.EINVAL + + # Valid opcodes to issue to sys_epoll_ctl() + EPOLL_CTL_ADD = 1 + EPOLL_CTL_DEL = 2 + EPOLL_CTL_MOD = 3 + + # 32 bit read of the events associated with this target + events = self.current.read_int(epds, size=32) + data = self.current.read_int(epds + 4, size=64) + if op == EPOLL_CTL_ADD: + if target_file in epoll_file.interest_list: + return -errno.EEXIST + # This skips a _lot_ of stuff in ep_insert dealing with other + # polling actions + epoll_file.interest_list[target_file] = EPollEvent(events=events, data=data) + elif op == EPOLL_CTL_DEL: + if target_file not in epoll_file.interest_list: + return -errno.ENOENT + del epoll_file.interest_list[target_file] + elif op == EPOLL_CTL_MOD: + if target_file not in epoll_file.interest_list: + return -errno.ENOENT + epoll_file.interest_list[target_file] = EPollEvent(events=events, data=data) + + else: + return -errno.EINVAL + + return 0 + + def _ep_poll(self, ep: EventPoll, events, maxevents: int, timeout) -> int: + """ + Docs from fs/eventpoll.c@ep_poll + + Retrieves ready events, and delivers them to the caller supplied + event buffer + + @ep: eventpoll context. + @events: Pointer to the userspace buffer where the ready events should be + stored. + @maxevents: Size (in terms of number of events) of the caller event buffer. + @timeout: Maximum timeout for the ready events fetch operation, in + timespec. If the timeout is zero, the function will not block, + while if the @timeout ptr is NULL, the function will block + until at least one event has been retrieved (or an error + occurred). + + Returns: Returns the number of ready events which have been fetched, or an + error code, in case of error. + """ + # NOTE: There could be many forks in this syscall: + # * Number of events returned + # * Whether timeout is hit + res: int = 0 + item: FdLike + einfo: EPollEvent + # Remove any files that have been closed + removal: Set[FdLike] = set() + # Get time in seconds before loop (this isn't a real poll) + start = time.monotonic() + # ep_send_events + while res == 0: + for item, einfo in ep.interest_list.items(): + if item.closed: + removal.add(item) + continue + + if res >= maxevents: + break + + # ep_item_poll in fs/eventpoll.c + # If the event mask intersect the caller - requested one, deliver + # the event to userspace. + revents: int = einfo.events & item.poll() + if not bool(revents): + continue + # Write to userspace the kernel epoll_event struct + self.current.write_bytes(events, struct.pack(" (timeout / 1000): + break + + for remove in removal: + del ep.interest_list[remove] + + return res + + def _do_epoll_wait(self, epfd, events, maxevents, to) -> int: + # EP_MAX_EVENTS = (INT_MAX / sizeof(struct epoll_event)) + sizeof_epoll_event = 12 + EP_MAX_EVENTS = (2 ** 32 - 1) // sizeof_epoll_event + if maxevents <= 0 or maxevents > EP_MAX_EVENTS: + return -errno.EINVAL + + if not self.current.memory.access_ok(slice(events, events + sizeof_epoll_event), "w"): + return -errno.EFAULT + + try: + epoll_file = self.fd_table.get_fdlike(epfd) + except FdError: + return -errno.EBADF + + if not isinstance(epoll_file, EventPoll): + return -errno.EINVAL + + # Do the events + return self._ep_poll(epoll_file, events, maxevents, to) + + def sys_epoll_pwait(self, epfd, events, maxevents, timeout, _sigmask, _sigsetsize) -> int: + # Ignore the signal mask stuff + return self._do_epoll_wait(epfd, events, maxevents, timeout) + + def sys_epoll_wait(self, epfd, events, maxevents, timeout) -> int: + return self._do_epoll_wait(epfd, events, maxevents, timeout) + def sys_access(self, buf: int, mode: int) -> int: """ Checks real user's permissions for a file @@ -3360,6 +3669,11 @@ def unimplemented_syscalls(cls, syscalls: Union[Set[str], Dict[int, str]]) -> Se else: return set(syscalls.values()).difference(implemented_syscalls) + @staticmethod + def print_implemented_syscalls() -> None: + for syscall in Linux.implemented_syscalls(): + print(syscall) + ############################################################################ # Symbolic versions follows diff --git a/manticore/platforms/linux_syscall_stubs.py b/manticore/platforms/linux_syscall_stubs.py index 30b08d7dd..6a1524cb3 100644 --- a/manticore/platforms/linux_syscall_stubs.py +++ b/manticore/platforms/linux_syscall_stubs.py @@ -1,3 +1,5 @@ +from typing import Iterable + from ..platforms.platform import SyscallNotImplemented, unimplemented from .linux_syscalls import amd64 @@ -123,31 +125,6 @@ def sys_dup3(self, oldfd, newfd, flags) -> int: """ AUTOGENERATED UNIMPLEMENTED STUB """ return self.complicated_success(292) - @unimplemented - def sys_epoll_create(self, size) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ - return self.complicated_success(213) - - @unimplemented - def sys_epoll_create1(self, flags) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ - return self.complicated_success(291) - - @unimplemented - def sys_epoll_ctl(self, epfd, op, fd, event) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ - return self.simple_returns() - - @unimplemented - def sys_epoll_pwait(self, epfd, events, maxevents, timeout, sigmask, sigsetsize) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ - return self.complicated_success(281) - - @unimplemented - def sys_epoll_wait(self, epfd, events, maxevents, timeout) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ - return self.complicated_success(232) - @unimplemented def sys_eventfd(self, count) -> int: """ AUTOGENERATED UNIMPLEMENTED STUB """ @@ -1187,3 +1164,18 @@ def sys_wait4(self, upid, stat_addr, options, ru) -> int: def sys_waitid(self, which, upid, infop, options, ru) -> int: """ AUTOGENERATED UNIMPLEMENTED STUB """ return self.simple_returns() + + @staticmethod + def unimplemented_syscalls() -> Iterable[str]: + import inspect + + return ( + x[0].split("sys_", 1)[1] + for x in inspect.getmembers(SyscallStubs, predicate=inspect.isfunction) + if x[0].startswith("sys_") + ) + + @staticmethod + def print_unimplemented_syscalls() -> None: + for syscall in SyscallStubs.unimplemented_syscalls(): + print(syscall) diff --git a/tests/native/binaries/epoll b/tests/native/binaries/epoll new file mode 100755 index 0000000000000000000000000000000000000000..6e4b73db56ae57b60031342d0691d6efdc2fd1b7 GIT binary patch literal 845168 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 RG0Z6J7Tg->aHS7Z^j)+P@gUGqtvM} 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�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�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

6db`=l8cIx7cVMKT}VIYtx-S6 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

Xkq@j}_SMLl$iwJDTi=Fj!iSRrf$@T{ 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 literal 0 HcmV?d00001 diff --git a/tests/native/binaries/epoll.c b/tests/native/binaries/epoll.c new file mode 100644 index 000000000..83ed226c2 --- /dev/null +++ b/tests/native/binaries/epoll.c @@ -0,0 +1,60 @@ +#define MAX_EVENTS 5 +#define READ_SIZE 10 +#include // for fprintf() +#include // for close(), read() +#include // for epoll_create1(), epoll_ctl(), struct epoll_event +#include // for strncmp + +int main() +{ + int running = 1, event_count, i; + size_t bytes_read; + char read_buffer[READ_SIZE + 1]; + struct epoll_event event, events[MAX_EVENTS]; + int epoll_fd = epoll_create1(0); + + if(epoll_fd == -1) + { + fprintf(stderr, "Failed to create epoll file descriptor\n"); + return 1; + } + + event.events = EPOLLIN; + event.data.fd = 0; + + if(epoll_ctl(epoll_fd, EPOLL_CTL_ADD, 0, &event)) + { + fprintf(stderr, "Failed to add file descriptor to epoll\n"); + close(epoll_fd); + return 1; + } + + while(running) + { + //printf("\nPolling for input...\n"); + event_count = epoll_wait(epoll_fd, events, MAX_EVENTS, 30000); + //printf("%d ready events\n", event_count); + for(i = 0; i < event_count; i++) + { + //printf("Reading file descriptor '%d' -- ", events[i].data.fd); + bytes_read = read(events[i].data.fd, read_buffer, READ_SIZE); + //printf("%zd bytes read.\n", bytes_read); + read_buffer[bytes_read] = '\0'; + //printf("Read '%s'\n", read_buffer); + + if(read_buffer[0] == 's' && + read_buffer[1] == 't' && + read_buffer[2] == 'o' && + read_buffer[3] == 'p') { + running = 0; + } + } + } + + if(close(epoll_fd)) + { + fprintf(stderr, "Failed to close epoll file descriptor\n"); + return 1; + } + return 0; +} \ No newline at end of file diff --git a/tests/native/test_syscalls.py b/tests/native/test_syscalls.py index 2a65e5538..db497d0ee 100644 --- a/tests/native/test_syscalls.py +++ b/tests/native/test_syscalls.py @@ -9,11 +9,13 @@ import errno import re from glob import glob +from pathlib import Path from manticore.core.smtlib import Solver from manticore.core.state import Concretize from manticore.native import Manticore from manticore.native.cpu.abstractcpu import ConcretizeRegister +from manticore.native.plugins import SyscallCounter from manticore.platforms import linux, linux_syscall_stubs from manticore.platforms.linux import SymbolicSocket, logger as linux_logger @@ -618,6 +620,27 @@ def test_llseek_end_broken(self): res = self.linux.sys_llseek(fd, 0, -2 * len(buf), resultp, os.SEEK_END) self.assertTrue(res < 0) + class test_epoll(unittest.TestCase): + def test_fork_unique_solution(self): + binary = str( + Path(__file__).parent.parent.parent.joinpath("tests", "native", "binaries", "epoll") + ) + tmp_dir = tempfile.TemporaryDirectory(prefix="mcore_test_epoll") + m = Manticore( + binary, stdin_size=5, workspace_url=str(tmp_dir.name), concrete_start="stop\n" + ) + + counter = SyscallCounter() + m.register_plugin(counter) + + m.run() + m.finalize() + + syscall_counts = counter.get_counts() + self.assertEqual(syscall_counts["sys_epoll_create1"], 1) + self.assertEqual(syscall_counts["sys_epoll_ctl"], 1) + self.assertEqual(syscall_counts["sys_epoll_wait"], 1) + def test_unimplemented_symbolic_syscall(self) -> None: # Load a symbolic argument (address) cpu = self.linux.current From 6212a7a513cfe9f36a1ef3302eab503ee4884e52 Mon Sep 17 00:00:00 2001 From: Boyan MILANOV Date: Thu, 17 Feb 2022 19:18:57 +0100 Subject: [PATCH 31/35] Optimise forking when there is only 1 solution (#2527) * Optimise forking when there is only 1 solution * Update etherum test * Add test for forking on a unique solution * Replace strlen test with dedicated fork test * Fix typo * Fix output filename in test --- manticore/core/manticore.py | 54 ++++++++++++++++++++++------------ tests/ethereum/test_general.py | 2 +- tests/native/test_models.py | 1 + tests/other/test_fork.py | 35 ++++++++++++++++++++++ 4 files changed, 73 insertions(+), 19 deletions(-) create mode 100644 tests/other/test_fork.py diff --git a/manticore/core/manticore.py b/manticore/core/manticore.py index 579068221..3d5b8cf0e 100644 --- a/manticore/core/manticore.py +++ b/manticore/core/manticore.py @@ -523,30 +523,48 @@ def setstate(x, y): self._publish("will_fork_state", state, expression, solutions, policy) - # Build and enqueue a state for each solution + # Create new states children = [] - for new_value in solutions: - with state as new_state: - new_state.constrain(expression == new_value) + if len(solutions) == 1: + # If only one solution don't copy the state but update the current + # state instead + # Add state constraint + new_value = solutions[0] + state.constrain(expression == new_value) + setstate(state, new_value) + + # Put the state back in ready list + self._put_state(state) # Doesn't change state id + self._publish("did_fork_state", state, expression, solutions, policy, []) + + # Remove the state from busy list + with self._lock: + self._busy_states.remove(state.id) + self._lock.notify_all() + else: + # Build and enqueue a state for each solution + for new_value in solutions: + with state as new_state: + new_state.constrain(expression == new_value) - # and set the PC of the new state to the concrete pc-dest - # (or other register or memory address to concrete) - setstate(new_state, new_value) + # and set the PC of the new state to the concrete pc-dest + # (or other register or memory address to concrete) + setstate(new_state, new_value) - # enqueue new_state, assign new state id - new_state_id = self._put_state(new_state) + # enqueue new_state, assign new state id + new_state_id = self._put_state(new_state) - # maintain a list of children for logging purpose - children.append(new_state_id) + # maintain a list of children for logging purpose + children.append(new_state_id) - self._publish("did_fork_state", state, expression, solutions, policy, children) - logger.debug("Forking current state %r into states %r", state.id, children) + self._publish("did_fork_state", state, expression, solutions, policy, children) + logger.debug("Forking current state %r into states %r", state.id, children) - with self._lock: - self._busy_states.remove(state.id) - self._remove(state.id) - state._id = None - self._lock.notify_all() + with self._lock: + self._busy_states.remove(state.id) + self._remove(state.id) + state._id = None + self._lock.notify_all() @staticmethod @deprecated("Use utils.log.set_verbosity instead.") diff --git a/tests/ethereum/test_general.py b/tests/ethereum/test_general.py index 00308a73f..661b8cde2 100644 --- a/tests/ethereum/test_general.py +++ b/tests/ethereum/test_general.py @@ -779,7 +779,7 @@ def test_gen_testcase_only_if(self): for ext in ("summary", "constraints", "pkl", "tx.json", "tx", "trace", "logs") } - expected_files.add("state_00000001.pkl") + expected_files.add("state_00000000.pkl") actual_files = set((fn for fn in os.listdir(self.mevm.workspace) if not fn.startswith("."))) self.assertEqual(actual_files, expected_files) diff --git a/tests/native/test_models.py b/tests/native/test_models.py index 2b41cafbf..964b805b7 100644 --- a/tests/native/test_models.py +++ b/tests/native/test_models.py @@ -12,6 +12,7 @@ issymbolic, ArraySelect, BitVecITE, + ArrayProxy, ) from manticore.native.state import State from manticore.platforms import linux diff --git a/tests/other/test_fork.py b/tests/other/test_fork.py new file mode 100644 index 000000000..2189a150d --- /dev/null +++ b/tests/other/test_fork.py @@ -0,0 +1,35 @@ +import unittest +import tempfile +from manticore.native import Manticore +from manticore.core.state import Concretize +from pathlib import Path +from glob import glob + + +class TestFork(unittest.TestCase): + def test_fork_unique_solution(self): + binary = str( + Path(__file__).parent.parent.parent.joinpath( + "tests", "native", "binaries", "hello_world" + ) + ) + tmp_dir = tempfile.TemporaryDirectory(prefix="mcore_test_fork_") + m = Manticore(binary, stdin_size=10, workspace_url=str(tmp_dir.name)) + + @m.hook(0x3E50) # Entrypoint + def concretize_var(state): + # Concretize symbolic var that has only 1 solution + var = BitVecVariable(size=32, name="bar") + state.constrain(var == 5) + raise Concretize(var) + + m.run() + m.finalize() + + # Check that no additional state was created when forking + states = f"{str(m.workspace)}/test_*.pkl" + self.assertEqual(len(glob(states)), 1) + + +if __name__ == "__main__": + unittest.main() From 9ed66b6970b16d783a387363cadfd4841b547a04 Mon Sep 17 00:00:00 2001 From: Eric Hennenfent Date: Thu, 17 Feb 2022 12:01:54 -0800 Subject: [PATCH 32/35] Release Manticore 0.3.7 (#2526) * Bump Version Numbers * Disable pip audit on PR * Update CHANGELOG.md --- .github/workflows/pip-audit.yml | 4 ++-- CHANGELOG.md | 32 +++++++++++++++++++++++++++++++- docs/conf.py | 4 ++-- setup.py | 2 +- 4 files changed, 36 insertions(+), 6 deletions(-) diff --git a/.github/workflows/pip-audit.yml b/.github/workflows/pip-audit.yml index ad399e80e..cdf967dba 100644 --- a/.github/workflows/pip-audit.yml +++ b/.github/workflows/pip-audit.yml @@ -3,8 +3,8 @@ name: pip-audit on: push: branches: [ master ] - pull_request: - branches: [ master ] +# pull_request: +# branches: [ master ] schedule: [ cron: "0 7 * * 2" ] jobs: diff --git a/CHANGELOG.md b/CHANGELOG.md index 452fcb487..fe1c8e828 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,36 @@ # Change Log -## [Unreleased](https://github.com/trailofbits/manticore/compare/0.3.6...HEAD) +## [Unreleased](https://github.com/trailofbits/manticore/compare/0.3.7...HEAD) + +## 0.3.7 - 2022-02 + +Thanks to our external contributors! + - [sobolevn](https://github.com/trailofbits/manticore/pulls?q=is%3Apr+author%3Asobolevn) + - [G-11-P](https://github.com/trailofbits/manticore/pulls?q=is%3Apr+author%3AG-11-P) + +### Ethereum +* Use `crytic-compile` 0.2.2 [#2530](https://github.com/trailofbits/manticore/pull/2530) +* Multi-transaction analysis now uses fixed attacker and owner contracts [#2464](https://github.com/trailofbits/manticore/pull/2464) + +### Native +* **[Added API]** Retrieve list of unimplemented syscalls [#2491](https://github.com/trailofbits/manticore/pull/2491) +* Add `FXSAVE`/`FXRSTOR` concrete support on x86 [#2511](https://github.com/trailofbits/manticore/pull/2511) +* Add `last_executed_pc` property to CPU [#2475](https://github.com/trailofbits/manticore/pull/2475) +* Support LD_LIBRARY_PATH [#2476](https://github.com/trailofbits/manticore/pull/2476) +* Optional `will/did_read_memory` events [#2488](https://github.com/trailofbits/manticore/pull/2488) +* Fixed base address handling on Linux [#2500](https://github.com/trailofbits/manticore/pull/2500) +* Add `ENDBR`-style NOPs [#2533](https://github.com/trailofbits/manticore/pull/2533) +* Support `epoll`-related syscalls [#2529](https://github.com/trailofbits/manticore/pull/2529) + +### Other +* **[Added API]** Add fork policy for providing explicit values [#2514](https://github.com/trailofbits/manticore/pull/2514) +* Fixed Constant Folding [#2524](https://github.com/trailofbits/manticore/pull/2524) +* Add simplifications for subtraction [#2504](https://github.com/trailofbits/manticore/pull/2504) +* Parent state ID, last PC now available in state descriptors [#2479](https://github.com/trailofbits/manticore/pull/2479), [#2471](https://github.com/trailofbits/manticore/pull/2471) +* States now contain a reference to the current manticore instance [#2486](https://github.com/trailofbits/manticore/pull/2486) +* `fast_fail` config to exit after first state exception [#2487](https://github.com/trailofbits/manticore/pull/2487) +* Scaling bugfix for large solver queries [#2502](https://github.com/trailofbits/manticore/pull/2502) +* Don't fork when only one solution is found for `Concretize` [#2527](https://github.com/trailofbits/manticore/pull/2527) ## 0.3.6 - 2021-06-09 diff --git a/docs/conf.py b/docs/conf.py index b205a37fd..a23f841ee 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -54,9 +54,9 @@ # built documents. # # The short X.Y version. -version = "0.3.6" +version = "0.3.7" # The full version, including alpha/beta/rc tags. -release = "0.3.6" +release = "0.3.7" # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. diff --git a/setup.py b/setup.py index 4cd2135ac..ec2c558fd 100644 --- a/setup.py +++ b/setup.py @@ -45,7 +45,7 @@ def rtd_dependent_deps(): # https://stackoverflow.com/a/4792601 grumble grumble -version = "0.3.6" +version = "0.3.7" if "--dev_release" in sys.argv: major, minor, point = tuple(int(t) for t in version.split(".")) dev_extension = f"dev{date.today().strftime('%y%m%d')}" From c3eabe03cf94f410bedd96d850df09cb0bda1711 Mon Sep 17 00:00:00 2001 From: Eric Hennenfent Date: Thu, 17 Feb 2022 12:05:30 -0800 Subject: [PATCH 33/35] Revert CI changes made in #2526 We briefly disabled `pip-audit` on PRs to get the release PR to pass, as https://github.com/trailofbits/pip-audit/issues/81 hasn't been merged yet and the version of Manticore we told it to look at hadn't been published to PyPI yet. --- .github/workflows/pip-audit.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/pip-audit.yml b/.github/workflows/pip-audit.yml index cdf967dba..ad399e80e 100644 --- a/.github/workflows/pip-audit.yml +++ b/.github/workflows/pip-audit.yml @@ -3,8 +3,8 @@ name: pip-audit on: push: branches: [ master ] -# pull_request: -# branches: [ master ] + pull_request: + branches: [ master ] schedule: [ cron: "0 7 * * 2" ] jobs: From 6c553a482c4efb0a866f5d01381e575f29dff7fb Mon Sep 17 00:00:00 2001 From: kokrui Date: Fri, 25 Feb 2022 02:40:39 +0800 Subject: [PATCH 34/35] Fix typo in Manticore.linux constructor docstring (#2535) --- manticore/native/manticore.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manticore/native/manticore.py b/manticore/native/manticore.py index 73ae24039..897f5fe13 100644 --- a/manticore/native/manticore.py +++ b/manticore/native/manticore.py @@ -120,7 +120,7 @@ def linux( :param envp: Environment to provide to the binary :type envp: dict[str, str] :param entry_symbol: Entry symbol to resolve to start execution - :type envp: str + :type entry_symbol: str :param symbolic_files: Filenames to mark as having symbolic input :type symbolic_files: list[str] :param str concrete_start: Concrete stdin to use before symbolic input From 904f33667024de80a7b66dee618ad085ca21c0da Mon Sep 17 00:00:00 2001 From: Eric Hennenfent Date: Tue, 1 Mar 2022 09:36:01 -0800 Subject: [PATCH 35/35] Switch to stable Black (#2536) * Switch to stable Black version `black` has recently stabilized on version 22, which means that we can loosen the version restrictions a bit to get upstream bugfixes, without needing to worry about our formatting breaking unexpectedly. In 2023, they may issue a new release with breaking changes, but we won't be automatically upgraded. There have been a large number of formatting changes since 20.8.b1, which is the last version we standardized on. This will likely require rebase of several of the existing PRs, but with relatively few of them currently active, I think it's as good a time as any. More info about black's further development in their [stability policy](https://black.readthedocs.io/en/latest/the_black_code_style/index.html#stability-policy) * Add new formatting changes Mostly docstrings and exponentiation --- examples/evm/mappingchallenge.py | 2 +- examples/script/concolic.py | 2 +- examples/wasm/if_check/solve.py | 4 +- manticore/core/parser/parser.py | 2 +- manticore/core/plugin.py | 16 +- manticore/core/smtlib/constraints.py | 16 +- manticore/core/smtlib/expression.py | 2 +- manticore/core/worker.py | 10 +- manticore/ethereum/abi.py | 2 +- manticore/ethereum/manticore.py | 4 +- manticore/ethereum/plugins.py | 2 +- manticore/ethereum/solidity.py | 2 +- manticore/ethereum/verifier.py | 6 +- manticore/native/cpu/aarch64.py | 2 +- manticore/native/cpu/abstractcpu.py | 20 +- manticore/native/cpu/bitwise.py | 2 +- manticore/native/memory.py | 12 +- manticore/platforms/decree.py | 8 +- manticore/platforms/evm.py | 10 +- manticore/platforms/linux.py | 6 +- manticore/platforms/linux_syscall_stubs.py | 444 +++++++++--------- manticore/platforms/wasm.py | 2 +- manticore/utils/deprecated.py | 2 +- manticore/utils/helpers.py | 2 +- manticore/wasm/executor.py | 24 +- manticore/wasm/structure.py | 2 +- manticore/wasm/types.py | 4 +- setup.py | 2 +- tests/auto_generators/make_VMTests.py | 2 +- tests/ethereum/test_detectors.py | 6 +- tests/ethereum/test_general.py | 36 +- .../test_consensys_benchmark.py | 2 +- tests/native/test_aarch64rf.py | 10 +- tests/native/test_armv7cpu.py | 44 +- tests/native/test_armv7unicorn.py | 46 +- tests/native/test_cpu_automatic.py | 4 +- tests/native/test_dyn.py | 4 +- tests/native/test_memory.py | 6 +- tests/native/test_register.py | 2 +- tests/native/test_slam_regre.py | 4 +- tests/native/test_x86_pcmpxstrx.py | 4 +- tests/wasm/json2mc.py | 2 +- tests/wasm_sym/json2smc.py | 2 +- 43 files changed, 393 insertions(+), 393 deletions(-) diff --git a/examples/evm/mappingchallenge.py b/examples/evm/mappingchallenge.py index 3de1fc785..2937c1ef3 100644 --- a/examples/evm/mappingchallenge.py +++ b/examples/evm/mappingchallenge.py @@ -27,7 +27,7 @@ class StopAtDepth(Detector): - """ This just aborts explorations that are too deep """ + """This just aborts explorations that are too deep""" def will_run_callback(self, *args): with self.manticore.locked_context("seen_rep", dict) as reps: diff --git a/examples/script/concolic.py b/examples/script/concolic.py index df3c17fb8..ddf9aed89 100755 --- a/examples/script/concolic.py +++ b/examples/script/concolic.py @@ -155,7 +155,7 @@ def constraints_to_constraintset(constupl): def input_from_cons(constupl, datas): - " solve bytes in |datas| based on " + "solve bytes in |datas| based on" def make_chr(c): try: diff --git a/examples/wasm/if_check/solve.py b/examples/wasm/if_check/solve.py index c9feed91a..b2e50ef21 100644 --- a/examples/wasm/if_check/solve.py +++ b/examples/wasm/if_check/solve.py @@ -3,7 +3,7 @@ def getchar(state): - """ Symbolic `getchar` implementation. Returns an arbitrary single byte """ + """Symbolic `getchar` implementation. Returns an arbitrary single byte""" res = state.new_symbolic_value(32, "getchar_res") state.constrain(0 < res) state.constrain(res < 256) @@ -11,7 +11,7 @@ def getchar(state): class PrintRetPlugin(Plugin): - """ A plugin that looks for states that returned zero and solves for their inputs """ + """A plugin that looks for states that returned zero and solves for their inputs""" def will_terminate_state_callback(self, state, *args): retval = state.stack.peek() diff --git a/manticore/core/parser/parser.py b/manticore/core/parser/parser.py index 9a96a0474..244f358ff 100644 --- a/manticore/core/parser/parser.py +++ b/manticore/core/parser/parser.py @@ -202,7 +202,7 @@ def p_expression_or(p): def p_expression_neg(p): - "expression : NEG expression " + "expression : NEG expression" p[0] = ~p[1] diff --git a/manticore/core/plugin.py b/manticore/core/plugin.py index d56b39245..d3c8eae16 100644 --- a/manticore/core/plugin.py +++ b/manticore/core/plugin.py @@ -17,7 +17,7 @@ class DecorateAllMeta(type): @staticmethod def _if_enabled(f): - """ decorator used to guard callbacks """ + """decorator used to guard callbacks""" @wraps(f) def g(self, *args, **kwargs): @@ -44,17 +44,17 @@ def __init__(self): self._plugin_context_name = f"{classname}_context_{hex(hash(self))}" def enable(self): - """ Enable all callbacks """ + """Enable all callbacks""" with self.manticore.locked_context() as context: context[self._enabled_key] = True def disable(self): - """ Disable all callbacks """ + """Disable all callbacks""" with self.manticore.locked_context() as context: context[self._enabled_key] = False def is_enabled(self): - """ True if callbacks are enabled """ + """True if callbacks are enabled""" with self.manticore.locked_context() as context: return context.get(self._enabled_key, True) @@ -85,18 +85,18 @@ def locked_context(self, key=None, value_type=list): @property def context(self): - """ Convenient access to shared context """ + """Convenient access to shared context""" plugin_context_name = self._plugin_context_name if plugin_context_name not in self.manticore.context: self.manticore.context[plugin_context_name] = {} return self.manticore.context[plugin_context_name] def on_register(self): - """ Called by parent manticore on registration """ + """Called by parent manticore on registration""" pass def on_unregister(self): - """ Called be parent manticore on un-registration """ + """Called be parent manticore on un-registration""" pass def generate_testcase(self, state, testcase, message): @@ -332,7 +332,7 @@ def create_stats(self): return ps def save_profiling_data(self, stream=None): - """:param stream: an output stream to write the profiling data """ + """:param stream: an output stream to write the profiling data""" ps = self.get_profiling_data() # XXX(yan): pstats does not support dumping to a file stream, only to a file # name. Below is essentially the implementation of pstats.dump_stats() without diff --git a/manticore/core/smtlib/constraints.py b/manticore/core/smtlib/constraints.py index 9612e027c..f541b1594 100644 --- a/manticore/core/smtlib/constraints.py +++ b/manticore/core/smtlib/constraints.py @@ -112,7 +112,7 @@ def add(self, constraint) -> None: self._constraints.append(constraint) def _get_sid(self) -> int: - """ Returns a unique id. """ + """Returns a unique id.""" assert self._child is None self._sid += 1 return self._sid @@ -232,23 +232,23 @@ def to_string(self, replace_constants: bool = False) -> str: return result def _declare(self, var): - """ Declare the variable `var` """ + """Declare the variable `var`""" if var.name in self._declarations: raise ValueError("Variable already declared") self._declarations[var.name] = var return var def get_declared_variables(self): - """ Returns the variable expressions of this constraint set """ + """Returns the variable expressions of this constraint set""" return self._declarations.values() def get_variable(self, name): - """ Returns the variable declared under name or None if it does not exists """ + """Returns the variable declared under name or None if it does not exists""" return self._declarations.get(name) @property def declarations(self): - """ Returns the variable expressions of this constraint set """ + """Returns the variable expressions of this constraint set""" declarations = GetDeclarations() for a in self.constraints: try: @@ -279,11 +279,11 @@ def __iter__(self): return iter(self.constraints) def __str__(self): - """ Returns a smtlib representation of the current state """ + """Returns a smtlib representation of the current state""" return self.to_string() def _make_unique_name(self, name="VAR"): - """ Makes a unique variable name""" + """Makes a unique variable name""" # the while loop is necessary because appending the result of _get_sid() # is not guaranteed to make a unique name on the first try; a colliding # name could have been added previously @@ -292,7 +292,7 @@ def _make_unique_name(self, name="VAR"): return name def is_declared(self, expression_var) -> bool: - """ True if expression_var is declared in this constraint set """ + """True if expression_var is declared in this constraint set""" if not isinstance(expression_var, Variable): raise ValueError(f"Expression must be a Variable (not a {type(expression_var)})") return any(expression_var is x for x in self.get_declared_variables()) diff --git a/manticore/core/smtlib/expression.py b/manticore/core/smtlib/expression.py index 53de5bda6..9924feaeb 100644 --- a/manticore/core/smtlib/expression.py +++ b/manticore/core/smtlib/expression.py @@ -744,7 +744,7 @@ class Array(Expression, abstract=True): def __init__(self, *, index_bits: int, index_max: Optional[int], value_bits: int, **kwargs): assert index_bits in (32, 64, 256) assert value_bits in (8, 16, 32, 64, 256) - assert index_max is None or index_max >= 0 and index_max < 2 ** index_bits + assert index_max is None or index_max >= 0 and index_max < 2**index_bits self._index_bits = index_bits self._index_max = index_max self._value_bits = value_bits diff --git a/manticore/core/worker.py b/manticore/core/worker.py index 66514df1c..a3ce6579a 100644 --- a/manticore/core/worker.py +++ b/manticore/core/worker.py @@ -221,7 +221,7 @@ def join(self): class WorkerThread(Worker): - """ A worker thread """ + """A worker thread""" def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) @@ -237,7 +237,7 @@ def join(self): class WorkerProcess(Worker): - """ A worker process """ + """A worker process""" def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) @@ -278,21 +278,21 @@ def start(self, target: typing.Optional[typing.Callable] = None): class DumpTCPHandler(socketserver.BaseRequestHandler): - """ TCP Handler that calls the `dump` method bound to the server """ + """TCP Handler that calls the `dump` method bound to the server""" def handle(self): self.request.sendall(self.server.dump()) class ReusableTCPServer(socketserver.TCPServer): - """ Custom socket server that gracefully allows the address to be reused """ + """Custom socket server that gracefully allows the address to be reused""" allow_reuse_address = True dump: typing.Optional[typing.Callable] = None class LogCaptureWorker(DaemonThread): - """ Extended DaemonThread that runs a TCP server that dumps the captured logs """ + """Extended DaemonThread that runs a TCP server that dumps the captured logs""" def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) diff --git a/manticore/ethereum/abi.py b/manticore/ethereum/abi.py index 9655e29f2..1350b3cef 100644 --- a/manticore/ethereum/abi.py +++ b/manticore/ethereum/abi.py @@ -31,7 +31,7 @@ class ABI: @staticmethod def _type_size(ty): - """ Calculate `static` type size """ + """Calculate `static` type size""" if ty[0] in ("int", "uint", "bytesM", "function"): return 32 elif ty[0] in ("tuple"): diff --git a/manticore/ethereum/manticore.py b/manticore/ethereum/manticore.py index ca6dcac5e..507aece04 100644 --- a/manticore/ethereum/manticore.py +++ b/manticore/ethereum/manticore.py @@ -1075,8 +1075,8 @@ def multi_tx_analysis( args=None, compile_args=None, ): - owner_account = self.create_account(balance=10 ** 10, name="owner", address=0x10000) - attacker_account = self.create_account(balance=10 ** 10, name="attacker", address=0x20000) + owner_account = self.create_account(balance=10**10, name="owner", address=0x10000) + attacker_account = self.create_account(balance=10**10, name="attacker", address=0x20000) # Pretty print logger.info("Starting symbolic create contract") diff --git a/manticore/ethereum/plugins.py b/manticore/ethereum/plugins.py index dad5a53bb..18f00f3c1 100644 --- a/manticore/ethereum/plugins.py +++ b/manticore/ethereum/plugins.py @@ -100,7 +100,7 @@ def will_open_transaction_callback(self, state, tx): class LoopDepthLimiter(Plugin): - """ This just aborts explorations that are too deep """ + """This just aborts explorations that are too deep""" def __init__(self, loop_count_threshold=5, **kwargs): super().__init__(**kwargs) diff --git a/manticore/ethereum/solidity.py b/manticore/ethereum/solidity.py index 38dd241ed..d310c0a1c 100644 --- a/manticore/ethereum/solidity.py +++ b/manticore/ethereum/solidity.py @@ -42,7 +42,7 @@ def __init__( abi, warnings, ): - """ Contract metadata for Solidity-based contracts """ + """Contract metadata for Solidity-based contracts""" self.name = name if isinstance(source_code, bytes): source_code = source_code.decode() diff --git a/manticore/ethereum/verifier.py b/manticore/ethereum/verifier.py index f400d1f1f..986450c44 100644 --- a/manticore/ethereum/verifier.py +++ b/manticore/ethereum/verifier.py @@ -149,10 +149,10 @@ def manticore_verifier( user_accounts = [] for n, address_i in enumerate(senders): user_accounts.append( - m.create_account(balance=10 ** 10, address=address_i, name=f"sender_{n}") + m.create_account(balance=10**10, address=address_i, name=f"sender_{n}") ) # the address used for deployment - owner_account = m.create_account(balance=10 ** 10, address=deployer, name="deployer") + owner_account = m.create_account(balance=10**10, address=deployer, name="deployer") # the target contract account contract_account = m.solidity_create_contract( source_code, @@ -162,7 +162,7 @@ def manticore_verifier( name="contract_account", ) # the address used for checking porperties - checker_account = m.create_account(balance=10 ** 10, address=psender, name="psender") + checker_account = m.create_account(balance=10**10, address=psender, name="psender") print(f"# Owner account: 0x{int(owner_account):x}") print(f"# Contract account: 0x{int(contract_account):x}") diff --git a/manticore/native/cpu/aarch64.py b/manticore/native/cpu/aarch64.py index 6a34fe4d1..cc406bfc8 100644 --- a/manticore/native/cpu/aarch64.py +++ b/manticore/native/cpu/aarch64.py @@ -193,7 +193,7 @@ def write(self, register, value): name = self._alias(register) parent, size = self._table[name] if isinstance(value, int): - assert value <= 2 ** size - 1 + assert value <= 2**size - 1 else: assert value.size == size diff --git a/manticore/native/cpu/abstractcpu.py b/manticore/native/cpu/abstractcpu.py index 44dbf5305..1c43b6ca0 100644 --- a/manticore/native/cpu/abstractcpu.py +++ b/manticore/native/cpu/abstractcpu.py @@ -39,7 +39,7 @@ def _sig_is_varargs(sig: inspect.Signature) -> bool: class CpuException(Exception): - """ Base cpu exception """ + """Base cpu exception""" class DecodeException(CpuException): @@ -66,11 +66,11 @@ class InstructionEmulationError(CpuException): class DivideByZeroError(CpuException): - """ A division by zero """ + """A division by zero""" class Interruption(CpuException): - """ A software interrupt. """ + """A software interrupt.""" def __init__(self, N): super().__init__("CPU Software Interruption %08x" % N) @@ -191,7 +191,7 @@ def type(self): @property def size(self): - """ Return bit size of operand """ + """Return bit size of operand""" raise NotImplementedError @property @@ -199,15 +199,15 @@ def reg(self): return self._reg_name(self.op.reg) def address(self): - """ On a memory operand it returns the effective address """ + """On a memory operand it returns the effective address""" raise NotImplementedError def read(self): - """ It reads the operand value from the registers or memory """ + """It reads the operand value from the registers or memory""" raise NotImplementedError def write(self, value): - """ It writes the value of specific type to the registers or memory """ + """It writes the value of specific type to the registers or memory""" raise NotImplementedError @@ -252,12 +252,12 @@ def read(self, register): @property def all_registers(self): - """ Lists all possible register names (Including aliases) """ + """Lists all possible register names (Including aliases)""" return tuple(self._aliases) @property def canonical_registers(self): - """ List the minimal most beautiful set of registers needed """ + """List the minimal most beautiful set of registers needed""" raise NotImplementedError def __contains__(self, register): @@ -602,7 +602,7 @@ def last_executed_insn(self) -> Optional[Instruction]: # Register access @property def regfile(self): - """ The RegisterFile of this cpu """ + """The RegisterFile of this cpu""" return self._regfile @property diff --git a/manticore/native/cpu/bitwise.py b/manticore/native/cpu/bitwise.py index d00dba1d5..b9307e1ea 100644 --- a/manticore/native/cpu/bitwise.py +++ b/manticore/native/cpu/bitwise.py @@ -60,7 +60,7 @@ def SInt(value, width): return Operators.ITEBV( width, Bit(value, width - 1) == 1, - GetNBits(value, width) - 2 ** width, + GetNBits(value, width) - 2**width, GetNBits(value, width), ) diff --git a/manticore/native/memory.py b/manticore/native/memory.py index cf04e4fdf..9f7fb8b5e 100644 --- a/manticore/native/memory.py +++ b/manticore/native/memory.py @@ -145,7 +145,7 @@ def __init__(self, start: int, size: int, perms: str, name=None): self._name = name def _get_perms(self) -> str: - """ Gets the access permissions of the map. """ + """Gets the access permissions of the map.""" return self._perms def _set_perms(self, perms: str) -> None: @@ -165,7 +165,7 @@ def _set_perms(self, perms: str) -> None: perms = property(_get_perms, _set_perms) def access_ok(self, access) -> bool: - """ Check if there is enough permissions for access """ + """Check if there is enough permissions for access""" for c in access: if c not in self.perms: return False @@ -184,7 +184,7 @@ def name(self): return self._name def __len__(self): - """Returns the current size in bytes. """ + """Returns the current size in bytes.""" return self._end - self._start def __repr__(self): @@ -223,7 +223,7 @@ def __hash__(self) -> int: return object.__hash__(self) def _in_range(self, index) -> bool: - """ Returns True if index is in range """ + """Returns True if index is in range""" if isinstance(index, slice): in_range = ( index.start < index.stop and index.start >= self.start and index.stop <= self.end @@ -278,7 +278,7 @@ def split(self, address): class AnonMap(Map): - """ A concrete anonymous memory map """ + """A concrete anonymous memory map""" def __init__(self, start: int, size: int, perms: str, data_init=None, name=None): """ @@ -1350,7 +1350,7 @@ def _try_get_solutions(self, address, size, access, max_solutions=0x1000, force= from ..core.state import Concretize def setstate(state, _value): - """ Roll back PC to redo last instruction """ + """Roll back PC to redo last instruction""" state.cpu.PC = state.cpu._last_pc raise Concretize( diff --git a/manticore/platforms/decree.py b/manticore/platforms/decree.py index be36986a1..1835ef11b 100644 --- a/manticore/platforms/decree.py +++ b/manticore/platforms/decree.py @@ -865,7 +865,7 @@ def wait(self, readfds, writefds, timeout): self.check_timers() def awake(self, procid): - """ Remove procid from waitlists and reestablish it in the running list """ + """Remove procid from waitlists and reestablish it in the running list""" logger.info( "Remove procid:%d from waitlists and reestablish it in the running list", procid ) @@ -889,21 +889,21 @@ def connections(self, fd): return fd - 1 def signal_receive(self, fd): - """ Awake one process waiting to receive data on fd """ + """Awake one process waiting to receive data on fd""" connections = self.connections if connections(fd) and self.twait[connections(fd)]: procid = random.sample(self.twait[connections(fd)], 1)[0] self.awake(procid) def signal_transmit(self, fd): - """ Awake one process waiting to transmit data on fd """ + """Awake one process waiting to transmit data on fd""" connections = self.connections if connections(fd) and self.rwait[connections(fd)]: procid = random.sample(self.rwait[connections(fd)], 1)[0] self.awake(procid) def check_timers(self): - """ Awake process if timer has expired """ + """Awake process if timer has expired""" if self._current is None: # Advance the clocks. Go to future!! advance = min([x for x in self.timers if x is not None]) + 1 diff --git a/manticore/platforms/evm.py b/manticore/platforms/evm.py index 37f889096..04567cd69 100644 --- a/manticore/platforms/evm.py +++ b/manticore/platforms/evm.py @@ -110,10 +110,10 @@ def globalfakesha3(data): # Auxiliary constants and functions -TT256 = 2 ** 256 -TT256M1 = 2 ** 256 - 1 -MASK160 = 2 ** 160 - 1 -TT255 = 2 ** 255 +TT256 = 2**256 +TT256M1 = 2**256 - 1 +MASK160 = 2**160 - 1 +TT255 = 2**255 TOOHIGHMEM = 0x1000 DEFAULT_FORK = "istanbul" @@ -2165,7 +2165,7 @@ def CREATE(self, value, offset, size): return tx.return_value def CALL_gas(self, wanted_gas, address, value, in_offset, in_size, out_offset, out_size): - """ Dynamic gas for CALL instruction. _arguably turing complete in itself_ """ + """Dynamic gas for CALL instruction. _arguably turing complete in itself_""" GCALLVALUE = 9000 GCALLNEW = 25000 wanted_gas = Operators.ZEXTEND(wanted_gas, 512) diff --git a/manticore/platforms/linux.py b/manticore/platforms/linux.py index b1ab3fce9..a013bc31d 100644 --- a/manticore/platforms/linux.py +++ b/manticore/platforms/linux.py @@ -2118,7 +2118,7 @@ def _ep_poll(self, ep: EventPoll, events, maxevents: int, timeout) -> int: def _do_epoll_wait(self, epfd, events, maxevents, to) -> int: # EP_MAX_EVENTS = (INT_MAX / sizeof(struct epoll_event)) sizeof_epoll_event = 12 - EP_MAX_EVENTS = (2 ** 32 - 1) // sizeof_epoll_event + EP_MAX_EVENTS = (2**32 - 1) // sizeof_epoll_event if maxevents <= 0 or maxevents > EP_MAX_EVENTS: return -errno.EINVAL @@ -3095,9 +3095,9 @@ def sys_gettimeofday(self, tv, tz) -> int: error: Returns -1 """ if tv != 0: - microseconds = int(time.time() * 10 ** 6) + microseconds = int(time.time() * 10**6) self.current.write_bytes( - tv, struct.pack("L", microseconds // (10 ** 6)) + struct.pack("L", microseconds) + tv, struct.pack("L", microseconds // (10**6)) + struct.pack("L", microseconds) ) if tz != 0: logger.warning("No support for time zones in sys_gettimeofday") diff --git a/manticore/platforms/linux_syscall_stubs.py b/manticore/platforms/linux_syscall_stubs.py index 6a1524cb3..d496bf35a 100644 --- a/manticore/platforms/linux_syscall_stubs.py +++ b/manticore/platforms/linux_syscall_stubs.py @@ -57,1112 +57,1112 @@ def complicated_both(self, num): @unimplemented def sys_accept4(self, fd, upeer_sockaddr, upeer_addrlen, flags) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.complicated_success(288) @unimplemented def sys_add_key(self, _type, _description, _payload, plen) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.complicated_success(248) @unimplemented def sys_adjtimex(self, txc_p) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.complicated_success(159) @unimplemented def sys_alarm(self, seconds) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.complicated_success(37) @unimplemented def sys_bpf(self, cmd, attr, size) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.complicated_success(321) @unimplemented def sys_capget(self, header, dataptr) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.simple_returns() @unimplemented def sys_capset(self, header, data) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.simple_returns() @unimplemented def sys_clock_getres(self, which_clock, tp) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.simple_returns() @unimplemented def sys_clock_nanosleep(self, which_clock, flags, rqtp, rmtp) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.complicated_error(230) @unimplemented def sys_clock_settime(self, which_clock, tp) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.simple_returns() @unimplemented def sys_connect(self, fd, uservaddr, addrlen) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.simple_returns() @unimplemented def sys_creat(self, pathname, mode) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.complicated_success(85) @unimplemented def sys_delete_module(self, name_user, flags) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.simple_returns() @unimplemented def sys_dup3(self, oldfd, newfd, flags) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.complicated_success(292) @unimplemented def sys_eventfd(self, count) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.complicated_success(284) @unimplemented def sys_faccessat(self, dfd, filename, mode) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.simple_returns() @unimplemented def sys_fallocate(self, fd, mode, offset, len) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.simple_returns() @unimplemented def sys_fanotify_init(self, flags, event_f_flags) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.complicated_success(300) @unimplemented def sys_fanotify_mark(self, fanotify_fd, flags, mask, dfd, pathname) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.simple_returns() @unimplemented def sys_fchdir(self, fd) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.simple_returns() @unimplemented def sys_fchmod(self, fd, mode) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.simple_returns() @unimplemented def sys_fchmodat(self, dfd, filename, mode) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.simple_returns() @unimplemented def sys_fchown(self, fd, user, group) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.simple_returns() @unimplemented def sys_fchownat(self, dfd, filename, user, group, flag) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.simple_returns() @unimplemented def sys_fcntl(self, fd, cmd, arg) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.complicated_success(72) @unimplemented def sys_fdatasync(self, fd) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.simple_returns() @unimplemented def sys_fgetxattr(self, fd, name, value, size) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.complicated_success(193) @unimplemented def sys_finit_module(self, fd, uargs, flags) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.simple_returns() @unimplemented def sys_flistxattr(self, fd, list, size) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.complicated_success(196) @unimplemented def sys_flock(self, fd, cmd) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.simple_returns() @unimplemented def sys_fremovexattr(self, fd, name) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.simple_returns() @unimplemented def sys_fsetxattr(self, fd, name, value, size, flags) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.simple_returns() @unimplemented def sys_fstatfs(self, fd, buf) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.simple_returns() @unimplemented def sys_futimesat(self, dfd, filename, utimes) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.simple_returns() @unimplemented def sys_get_mempolicy(self, policy, nmask, maxnode, addr, flags) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.simple_returns() @unimplemented def sys_get_robust_list(self, pid, head_ptr, len_ptr) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.complicated_error(274) @unimplemented def sys_getcpu(self, cpup, nodep, unused) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.simple_returns() @unimplemented def sys_getdents64(self, fd, dirent, count) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.complicated_success(217) @unimplemented def sys_getgroups(self, gidsetsize, grouplist) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.complicated_success(115) @unimplemented def sys_getitimer(self, which, value) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.simple_returns() @unimplemented def sys_getpeername(self, fd, usockaddr, usockaddr_len) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.simple_returns() @unimplemented def sys_getpgid(self, pid) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.complicated_success(121) @unimplemented def sys_getpgrp(self) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.complicated_success(111) @unimplemented def sys_getppid(self) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.complicated_success(110) @unimplemented def sys_getpriority(self, which, who) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.complicated_success(140) @unimplemented def sys_getresgid(self, rgid, egid, sgid) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.simple_returns() @unimplemented def sys_getresuid(self, ruid, euid, suid) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.simple_returns() @unimplemented def sys_getrusage(self, who, ru) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.simple_returns() @unimplemented def sys_getsid(self, pid) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.complicated_success(124) @unimplemented def sys_getsockname(self, fd, usockaddr, usockaddr_len) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.simple_returns() @unimplemented def sys_getsockopt(self, fd, level, optname, optval, optlen) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.simple_returns() @unimplemented def sys_gettimeofday(self, tv, tz) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.simple_returns() @unimplemented def sys_getxattr(self, pathname, name, value, size) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.complicated_success(191) @unimplemented def sys_init_module(self, umod, len, uargs) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.simple_returns() @unimplemented def sys_inotify_add_watch(self, fd, pathname, mask) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.complicated_success(254) @unimplemented def sys_inotify_init(self) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.complicated_success(253) @unimplemented def sys_inotify_init1(self, flags) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.complicated_success(294) @unimplemented def sys_inotify_rm_watch(self, fd, wd) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.simple_returns() @unimplemented def sys_io_cancel(self, ctx_id, iocb, result) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.simple_returns() @unimplemented def sys_io_destroy(self, ctx) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.simple_returns() @unimplemented def sys_io_getevents(self, ctx_id, min_nr, nr, events) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.complicated_success(208) @unimplemented def sys_io_setup(self, nr_events, ctxp) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.simple_returns() @unimplemented def sys_io_submit(self, ctx_id, nr, iocbpp) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.complicated_success(209) @unimplemented def sys_ioperm(self, _from, num, turn_on) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.simple_returns() @unimplemented def sys_ioprio_get(self, which, who) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.complicated_success(252) @unimplemented def sys_ioprio_set(self, which, who, ioprio) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.simple_returns() @unimplemented def sys_kcmp(self, pid1, pid2, type, idx1, idx2) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.complicated_success(312) @unimplemented def sys_kexec_file_load(self, kernel_fd, initrd_fd, cmdline_len, cmdline_ptr, flags) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.complicated_success(320) @unimplemented def sys_kexec_load(self, entry, nr_segments, segments, flags) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.complicated_success(246) @unimplemented def sys_keyctl(self, option, arg2, arg3, arg4, arg5) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.complicated_success(250) @unimplemented def sys_lchown(self, filename, user, group) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.simple_returns() @unimplemented def sys_lgetxattr(self, pathname, name, value, size) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.complicated_success(192) @unimplemented def sys_linkat(self, oldfd, oldname, newfd, newname, flags) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.simple_returns() @unimplemented def sys_listxattr(self, pathname, list, size) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.complicated_success(194) @unimplemented def sys_llistxattr(self, pathname, list, size) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.complicated_success(195) @unimplemented def sys_lookup_dcookie(self, cookie64, buf, len) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.complicated_success(212) @unimplemented def sys_lremovexattr(self, pathname, name) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.simple_returns() @unimplemented def sys_lsetxattr(self, pathname, name, value, size, flags) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.simple_returns() @unimplemented def sys_mbind(self, start, len, mode, nmask, maxnode, flags) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.simple_returns() @unimplemented def sys_membarrier(self, cmd, flags) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.complicated_success(324) @unimplemented def sys_memfd_create(self, uname_ptr, flags) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.complicated_success(319) @unimplemented def sys_migrate_pages(self, pid, maxnode, old_nodes, new_nodes) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.complicated_success(256) @unimplemented def sys_mincore(self, start, len, vec) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.simple_returns() @unimplemented def sys_mknod(self, filename, mode, dev) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.simple_returns() @unimplemented def sys_mknodat(self, dfd, filename, mode, dev) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.simple_returns() @unimplemented def sys_mlock(self, start, len) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.simple_returns() @unimplemented def sys_mlock2(self, start, len, flags) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.simple_returns() @unimplemented def sys_mlockall(self, flags) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.simple_returns() @unimplemented def sys_modify_ldt(self, func, ptr, bytecount) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.complicated_success(154) @unimplemented def sys_mount(self, dev_name, dir_name, type, flags, data) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.simple_returns() @unimplemented def sys_move_pages(self, pid, nr_pages, pages, nodes, status, flags) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.simple_returns() @unimplemented def sys_mq_notify(self, mqdes, u_notification) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.simple_returns() @unimplemented def sys_mq_open(self, u_name, oflag, mode, u_attr) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.complicated_success(240) @unimplemented def sys_mq_timedreceive(self, mqdes, u_msg_ptr, msg_len, u_msg_prio, u_abs_timeout) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.complicated_success(243) @unimplemented def sys_mq_timedsend(self, mqdes, u_msg_ptr, msg_len, msg_prio, u_abs_timeout) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.simple_returns() @unimplemented def sys_mq_unlink(self, u_name) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.simple_returns() @unimplemented def sys_mremap(self, addr, old_len, new_len, flags, new_addr) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.complicated_success(25) @unimplemented def sys_msgctl(self, msqid, cmd, buf) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.complicated_success(71) @unimplemented def sys_msgget(self, key, msgflg) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.complicated_success(68) @unimplemented def sys_msgrcv(self, msqid, msgp, msgsz, msgtyp, msgflg) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.complicated_success(70) @unimplemented def sys_msgsnd(self, msqid, msgp, msgsz, msgflg) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.simple_returns() @unimplemented def sys_msync(self, start, len, flags) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.simple_returns() @unimplemented def sys_munlock(self, start, len) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.simple_returns() @unimplemented def sys_munlockall(self) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.simple_returns() @unimplemented def sys_name_to_handle_at(self, dfd, name, handle, mnt_id, flag) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.simple_returns() @unimplemented def sys_open_by_handle_at(self, dfd, name, handle, mnt_id, flags) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.complicated_success(304) @unimplemented def sys_pause(self) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return -1 @unimplemented def sys_perf_event_open(self, attr_uptr, pid, cpu, group_fd, flags) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.complicated_success(298) @unimplemented def sys_personality(self, personality) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.complicated_success(135) @unimplemented def sys_pivot_root(self, new_root, put_old) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.simple_returns() @unimplemented def sys_poll(self, ufds, nfds, timeout_msecs) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.complicated_success(7) @unimplemented def sys_ppoll(self, ufds, nfds, tsp, sigmask, sigsetsize) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.complicated_success(271) @unimplemented def sys_prctl(self, option, arg2, arg3, arg4, arg5) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.complicated_success(157) @unimplemented def sys_preadv(self, fd, vec, vlen, pos_l, pos_h) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.complicated_success(295) @unimplemented def sys_process_vm_readv(self, pid, lvec, liovcnt, rvec, riovcnt, flags) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.complicated_success(310) @unimplemented def sys_process_vm_writev(self, pid, lvec, liovcnt, rvec, riovcnt, flags) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.complicated_success(311) @unimplemented def sys_ptrace(self, request, pid, addr, data) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.complicated_success(101) @unimplemented def sys_pwritev(self, fd, vec, vlen, pos_l, pos_h) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.complicated_success(296) @unimplemented def sys_quotactl(self, cmd, special, id, addr) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.simple_returns() @unimplemented def sys_readahead(self, fd, offset, count) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.simple_returns() @unimplemented def sys_readlinkat(self, dfd, pathname, buf, bufsiz) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.complicated_success(267) @unimplemented def sys_reboot(self, magic1, magic2, cmd, arg) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.simple_returns() @unimplemented def sys_recvfrom(self, fd, ubuf, size, flags, addr, addr_len) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.complicated_success(45) @unimplemented def sys_recvmmsg(self, fd, mmsg, vlen, flags, timeout) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.complicated_success(299) @unimplemented def sys_recvmsg(self, fd, msg, flags) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.complicated_success(47) @unimplemented def sys_remap_file_pages(self, start, size, prot, pgoff, flags) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.simple_returns() @unimplemented def sys_removexattr(self, pathname, name) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.simple_returns() @unimplemented def sys_renameat(self, oldfd, oldname, newfd, newname) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.simple_returns() @unimplemented def sys_renameat2(self, olddfd, oldname, newdfd, newname, flags) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.simple_returns() @unimplemented def sys_request_key(self, _type, _description, _callout_info, destringid) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.complicated_success(249) @unimplemented def sys_restart_syscall(self) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.complicated_both(219) @unimplemented def sys_rt_sigpending(self, set, sigsetsize) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.simple_returns() @unimplemented def sys_rt_sigqueueinfo(self, pid, sig, uinfo) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.simple_returns() @unimplemented def sys_rt_sigsuspend(self, unewset, sigsetsize) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.simple_returns() @unimplemented def sys_rt_sigtimedwait(self, uthese, uinfo, uts, sigsetsize) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.complicated_success(128) @unimplemented def sys_rt_tgsigqueueinfo(self, tgid, pid, sig, uinfo) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.simple_returns() @unimplemented def sys_sched_get_priority_max(self, policy) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.complicated_success(146) @unimplemented def sys_sched_get_priority_min(self, policy) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.complicated_success(147) @unimplemented def sys_sched_getaffinity(self, pid, len, user_mask_ptr) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.simple_returns() @unimplemented def sys_sched_getattr(self, pid, attr, size, flags) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.simple_returns() @unimplemented def sys_sched_getparam(self, pid, param) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.simple_returns() @unimplemented def sys_sched_getscheduler(self, pid) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.complicated_success(145) @unimplemented def sys_sched_rr_get_interval(self, pid, interval) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.simple_returns() @unimplemented def sys_sched_setaffinity(self, pid, len, user_mask_ptr) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.simple_returns() @unimplemented def sys_sched_setattr(self, pid, attr, flags) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.simple_returns() @unimplemented def sys_sched_setparam(self, pid, param) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.simple_returns() @unimplemented def sys_sched_setscheduler(self, pid, policy, param) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.simple_returns() @unimplemented def sys_sched_yield(self) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.simple_returns() @unimplemented def sys_seccomp(self, op, flags, uargs) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.simple_returns() @unimplemented def sys_select(self, n, inp, outp, fd_setexp, tvp) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.complicated_success(23) @unimplemented def sys_semctl(self, semid, semnum, cmd, arg) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.complicated_success(66) @unimplemented def sys_semget(self, key, nsems, semflg) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.complicated_success(64) @unimplemented def sys_semop(self, semid, tsops, nsops) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.simple_returns() @unimplemented def sys_semtimedop(self, semid, tsops, nsops, timeout) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.simple_returns() @unimplemented def sys_sendmmsg(self, fd, mmsg, vlen, flags) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.complicated_success(307) @unimplemented def sys_sendmsg(self, fd, msg, flags) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.complicated_success(46) @unimplemented def sys_sendto(self, fd, buff, len, flags, addr, addr_len) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.complicated_success(44) @unimplemented def sys_set_mempolicy(self, mode, nmask, maxnode) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.simple_returns() @unimplemented def sys_set_robust_list(self, head, len) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.complicated_error(273) @unimplemented def sys_setdomainname(self, name, len) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.simple_returns() @unimplemented def sys_setfsgid(self, gid) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.complicated_both(123) @unimplemented def sys_setfsuid(self, uid) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.complicated_both(122) @unimplemented def sys_setgid(self, gid) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.simple_returns() @unimplemented def sys_setgroups(self, gidsetsize, grouplist) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.simple_returns() @unimplemented def sys_sethostname(self, name, len) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.simple_returns() @unimplemented def sys_setitimer(self, which, value, ovalue) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.simple_returns() @unimplemented def sys_setns(self, fd, nstype) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.simple_returns() @unimplemented def sys_setpgid(self, pid, pgid) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.simple_returns() @unimplemented def sys_setpriority(self, which, who, niceval) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.simple_returns() @unimplemented def sys_setregid(self, rgid, egid) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.simple_returns() @unimplemented def sys_setresgid(self, rgid, egid, sgid) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.simple_returns() @unimplemented def sys_setresuid(self, ruid, euid, suid) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.simple_returns() @unimplemented def sys_setreuid(self, ruid, euid) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.simple_returns() @unimplemented def sys_setrlimit(self, resource, rlim) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.simple_returns() @unimplemented def sys_setsid(self) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.complicated_success(112) @unimplemented def sys_setsockopt(self, fd, level, optname, optval, optlen) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.simple_returns() @unimplemented def sys_settimeofday(self, tv, tz) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.simple_returns() @unimplemented def sys_setuid(self, uid) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.simple_returns() @unimplemented def sys_setxattr(self, pathname, name, value, size, flags) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.simple_returns() @unimplemented def sys_shmat(self, shmid, shmaddr, shmflg) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.complicated_success(30) @unimplemented def sys_shmctl(self, shmid, cmd, buf) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.complicated_success(31) @unimplemented def sys_shmdt(self, shmaddr) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.simple_returns() @unimplemented def sys_shmget(self, key, size, shmflg) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.complicated_success(29) @unimplemented def sys_shutdown(self, fd, how) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.simple_returns() @unimplemented def sys_sigaltstack(self, uss, uoss) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.simple_returns() @unimplemented def sys_signalfd(self, ufd, user_mask, sizemask) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.complicated_success(282) @unimplemented def sys_socketpair(self, family, type, protocol, usockvec) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.simple_returns() @unimplemented def sys_splice(self, fd_in, off_in, fd_out, off_out, len, flags) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.complicated_success(275) @unimplemented def sys_statfs(self, pathname, buf) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.simple_returns() @unimplemented def sys_swapoff(self, specialfile) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.simple_returns() @unimplemented def sys_swapon(self, specialfile, swap_flags) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.simple_returns() @unimplemented def sys_symlink(self, oldname, newname) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.simple_returns() @unimplemented def sys_symlinkat(self, oldname, newfd, newname) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.simple_returns() @unimplemented def sys_sync(self) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.simple_returns() @unimplemented def sys_sync_file_range(self, fd, offset, bytes, flags) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.simple_returns() @unimplemented def sys_syncfs(self, fd) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.simple_returns() @unimplemented def sys_sysfs(self, option, arg1, arg2) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.complicated_success(139) @unimplemented def sys_sysinfo(self, info) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.simple_returns() @unimplemented def sys_syslog(self, type, buf, len) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.complicated_success(103) @unimplemented def sys_tee(self, fdin, fdout, len, flags) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.complicated_success(276) @unimplemented def sys_tgkill(self, tgid, pid, sig) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.simple_returns() @unimplemented def sys_timer_create(self, which_clock, timer_event_spec, created_timer_id) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.simple_returns() @unimplemented def sys_timer_delete(self, timer_id) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.simple_returns() @unimplemented def sys_timer_getoverrun(self, timer_id) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.complicated_success(225) @unimplemented def sys_timer_gettime(self, timer_id, setting) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.simple_returns() @unimplemented def sys_timer_settime(self, timer_id, flags, new_setting, old_setting) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.simple_returns() @unimplemented def sys_timerfd_create(self, clockid, flags) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.complicated_success(283) @unimplemented def sys_timerfd_gettime(self, ufd, otmr) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.simple_returns() @unimplemented def sys_timerfd_settime(self, ufd, flags, utmr, otmr) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.simple_returns() @unimplemented def sys_times(self, info) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.complicated_success(100) @unimplemented def sys_tkill(self, pid, sig) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.simple_returns() @unimplemented def sys_truncate(self, path, length) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.simple_returns() @unimplemented def sys_unlinkat(self, dfd, pathname, flag) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.simple_returns() @unimplemented def sys_unshare(self, unshare_flags) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.simple_returns() @unimplemented def sys_ustat(self, dev, ubuf) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.simple_returns() @unimplemented def sys_utime(self, filename, times) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.simple_returns() @unimplemented def sys_utimensat(self, dfd, filename, utimes, flags) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.simple_returns() @unimplemented def sys_utimes(self, filename, utimes) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.simple_returns() @unimplemented def sys_vhangup(self) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.simple_returns() @unimplemented def sys_vmsplice(self, fd, iov, nr_segs, flags) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.complicated_success(278) @unimplemented def sys_wait4(self, upid, stat_addr, options, ru) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.complicated_success(61) @unimplemented def sys_waitid(self, which, upid, infop, options, ru) -> int: - """ AUTOGENERATED UNIMPLEMENTED STUB """ + """AUTOGENERATED UNIMPLEMENTED STUB""" return self.simple_returns() @staticmethod diff --git a/manticore/platforms/wasm.py b/manticore/platforms/wasm.py index 8b47dfaee..9a6f5a6d1 100644 --- a/manticore/platforms/wasm.py +++ b/manticore/platforms/wasm.py @@ -28,7 +28,7 @@ def stub(arity, _state, *args): - """Default function used for hostfunc calls when a proper import wasn't provided """ + """Default function used for hostfunc calls when a proper import wasn't provided""" logger.info("Called stub function with args: %s", args) return [0 for _ in range(arity)] # TODO: Return symbolic values diff --git a/manticore/utils/deprecated.py b/manticore/utils/deprecated.py index 40dc2df13..6e7e96dfc 100644 --- a/manticore/utils/deprecated.py +++ b/manticore/utils/deprecated.py @@ -15,7 +15,7 @@ class ManticoreDeprecationWarning(DeprecationWarning): def deprecated(message: str): - """A decorator for marking functions as deprecated. """ + """A decorator for marking functions as deprecated.""" assert isinstance(message, str), "The deprecated decorator requires a message string argument." def decorator(func): diff --git a/manticore/utils/helpers.py b/manticore/utils/helpers.py index 6c1d431f1..47e814392 100644 --- a/manticore/utils/helpers.py +++ b/manticore/utils/helpers.py @@ -204,7 +204,7 @@ def pretty_print_state_descriptors(desc: Dict): class deque(collections.deque): - """ A wrapper around collections.deque that adds a few APIs present in SyncManager.Queue """ + """A wrapper around collections.deque that adds a few APIs present in SyncManager.Queue""" def empty(self) -> bool: return len(self) == 0 diff --git a/manticore/wasm/executor.py b/manticore/wasm/executor.py index 4bab43dff..b49771c92 100644 --- a/manticore/wasm/executor.py +++ b/manticore/wasm/executor.py @@ -782,7 +782,7 @@ def i32_sub(self, store, stack): stack.has_type_on_top(I32, 2) c2 = stack.pop() c1 = stack.pop() - stack.push(I32.cast((c1 - c2 + 2 ** 32) & MASK_32)) + stack.push(I32.cast((c1 - c2 + 2**32) & MASK_32)) def i32_mul(self, store, stack): stack.has_type_on_top(I32, 2) @@ -798,7 +798,7 @@ def i32_div_s(self, store, stack): if self.check_zero_div(can_div_0): raise ZeroDivisionTrap() res = Operators.SDIV(c1, c2) - can_overflow = res == 2 ** 31 + can_overflow = res == 2**31 if self.check_overflow(can_overflow): raise OverflowDivisionTrap() stack.push(I32.cast(res)) @@ -939,7 +939,7 @@ def i64_sub(self, store, stack): stack.has_type_on_top(I64, 2) c2 = stack.pop() c1 = stack.pop() - stack.push(I64.cast((c1 - c2 + 2 ** 64) & MASK_64)) + stack.push(I64.cast((c1 - c2 + 2**64) & MASK_64)) def i64_mul(self, store, stack): stack.has_type_on_top(I64, 2) @@ -958,7 +958,7 @@ def i64_div_s(self, store, stack): res = Operators.SDIV(c1, c2) else: res = int(math.trunc(Decimal(c1) / Decimal(c2))) - can_overflow = res == 2 ** 63 + can_overflow = res == 2**63 if self.check_overflow(can_overflow): raise OverflowDivisionTrap() stack.push(I64.cast(res)) @@ -1075,7 +1075,7 @@ def i32_trunc_s_f32(self, store, stack): raise InvalidConversionTrap(I32, "NaN") if math.isinf(c1): raise InvalidConversionTrap(I32, "infinity") - if c1 >= 2 ** 31 or c1 <= -(2 ** 31) - 1: + if c1 >= 2**31 or c1 <= -(2**31) - 1: raise InvalidConversionTrap(I32, c1) stack.push(I32.cast(c1)) @@ -1088,7 +1088,7 @@ def i32_trunc_u_f32(self, store, stack): raise InvalidConversionTrap(I32, "NaN") if math.isinf(c1): raise InvalidConversionTrap(I32, "infinity") - if c1 >= 2 ** 32 or c1 <= -1: + if c1 >= 2**32 or c1 <= -1: raise InvalidConversionTrap(I32, c1) stack.push(I32.cast(c1)) @@ -1101,7 +1101,7 @@ def i32_trunc_s_f64(self, store, stack): raise InvalidConversionTrap(I32, "NaN") if math.isinf(c1): raise InvalidConversionTrap(I32, "infinity") - if c1 >= 2 ** 31 or c1 <= -(2 ** 31) - 1: + if c1 >= 2**31 or c1 <= -(2**31) - 1: raise InvalidConversionTrap(I32, c1) stack.push(I32.cast(c1)) @@ -1114,7 +1114,7 @@ def i32_trunc_u_f64(self, store, stack): raise InvalidConversionTrap(I32, "NaN") if math.isinf(c1): raise InvalidConversionTrap(I32, "infinity") - if c1 >= 2 ** 32 or c1 <= -1: + if c1 >= 2**32 or c1 <= -1: raise InvalidConversionTrap(I32, c1) stack.push(I32.cast(c1)) @@ -1143,7 +1143,7 @@ def i64_trunc_s_f32(self, store, stack): raise InvalidConversionTrap(I64, "NaN") if math.isinf(c1): raise InvalidConversionTrap(I64, "infinity") - if c1 >= 2 ** 63 or c1 <= -(2 ** 63) - 1: + if c1 >= 2**63 or c1 <= -(2**63) - 1: raise InvalidConversionTrap(I64, c1) stack.push(I64.cast(c1)) @@ -1156,7 +1156,7 @@ def i64_trunc_u_f32(self, store, stack): raise InvalidConversionTrap(I64, "NaN") if math.isinf(c1): raise InvalidConversionTrap(I64, "infinity") - if c1 >= 2 ** 64 or c1 <= -1: + if c1 >= 2**64 or c1 <= -1: raise InvalidConversionTrap(I64, c1) stack.push(I64.cast(c1)) @@ -1169,7 +1169,7 @@ def i64_trunc_s_f64(self, store, stack): raise InvalidConversionTrap(I64, "NaN") if math.isinf(c1): raise InvalidConversionTrap(I64, "infinity") - if c1 >= 2 ** 63 or c1 <= -(2 ** 63) - 1: + if c1 >= 2**63 or c1 <= -(2**63) - 1: raise InvalidConversionTrap(I64, c1) stack.push(I64.cast(c1)) @@ -1182,7 +1182,7 @@ def i64_trunc_u_f64(self, store, stack): raise InvalidConversionTrap(I64, "NaN") if math.isinf(c1): raise InvalidConversionTrap(I64, "infinity") - if c1 >= 2 ** 64 or c1 <= -1: + if c1 >= 2**64 or c1 <= -1: raise InvalidConversionTrap(I64, c1) stack.push(I64.cast(c1)) diff --git a/manticore/wasm/structure.py b/manticore/wasm/structure.py index 0488524b8..c0a882b88 100644 --- a/manticore/wasm/structure.py +++ b/manticore/wasm/structure.py @@ -79,7 +79,7 @@ ) #: Size of a standard WASM memory page -PAGESIZE = 2 ** 16 +PAGESIZE = 2**16 # Wrappers around integers that we use for indexing the store. diff --git a/manticore/wasm/types.py b/manticore/wasm/types.py index fdecc8034..d916c1700 100644 --- a/manticore/wasm/types.py +++ b/manticore/wasm/types.py @@ -325,7 +325,7 @@ class F64ConstImm: class Instruction: - """Internal instruction class that's pickle-friendly and works with the type system """ + """Internal instruction class that's pickle-friendly and works with the type system""" __slots__ = ["opcode", "mnemonic", "imm"] opcode: int #: Opcode, used for dispatching instructions @@ -443,7 +443,7 @@ def __init__(self, ty1, ty2): class ConcretizeStack(Concretize): - """Tells Manticore to concretize the value `depth` values from the end of the stack. """ + """Tells Manticore to concretize the value `depth` values from the end of the stack.""" def __init__(self, depth: int, ty: type, message: str, expression, policy=None, **kwargs): """ diff --git a/setup.py b/setup.py index ec2c558fd..3e603428f 100644 --- a/setup.py +++ b/setup.py @@ -18,7 +18,7 @@ def rtd_dependent_deps(): # (we need to know how to import a given native dependency so we can check if native dependencies are installed) native_deps = ["capstone==4.0.2", "pyelftools", "unicorn==1.0.2"] -lint_deps = ["black==20.8b1", "mypy==0.790"] +lint_deps = ["black~=22.0", "mypy==0.790"] auto_test_deps = ["py-evm"] diff --git a/tests/auto_generators/make_VMTests.py b/tests/auto_generators/make_VMTests.py index bd32b30a4..592bb5f5b 100644 --- a/tests/auto_generators/make_VMTests.py +++ b/tests/auto_generators/make_VMTests.py @@ -30,7 +30,7 @@ def fake_open(filename, mode="r", *args, **kwargs): - """ Replace normal global open with this for a wuick dry run """ + """Replace normal global open with this for a wuick dry run""" from io import StringIO logging.info("Fake openning %r", (filename, mode) + args) diff --git a/tests/ethereum/test_detectors.py b/tests/ethereum/test_detectors.py index 00924eea9..967878c83 100644 --- a/tests/ethereum/test_detectors.py +++ b/tests/ethereum/test_detectors.py @@ -90,7 +90,7 @@ def _test(self, name: str, should_find, use_ctor_sym_arg=False): class EthRetVal(EthDetectorTest): - """ Detect when a return value of a low level transaction instruction is ignored """ + """Detect when a return value of a low level transaction instruction is ignored""" DETECTOR_CLASS = DetectUnusedRetVal @@ -263,7 +263,7 @@ def test_predictable_not_ok(self): class EthDelegatecall(EthDetectorTest): - """ Test the detection of funny delegatecalls """ + """Test the detection of funny delegatecalls""" DETECTOR_CLASS = DetectDelegatecall @@ -403,7 +403,7 @@ def test_race_condition2(self): class EthBalance(EthDetectorTest): - """ Test the detection of funny delegatecalls """ + """Test the detection of funny delegatecalls""" DETECTOR_CLASS = DetectManipulableBalance diff --git a/tests/ethereum/test_general.py b/tests/ethereum/test_general.py index 661b8cde2..97feb0af9 100644 --- a/tests/ethereum/test_general.py +++ b/tests/ethereum/test_general.py @@ -130,7 +130,7 @@ def test_parse_tx(self): } } """ - user_account = m.create_account(balance=10 ** 10, name="user_account") + user_account = m.create_account(balance=10**10, name="user_account") contract_account = m.solidity_create_contract( source_code, owner=user_account, name="contract_account", gas=36225 ) @@ -179,7 +179,7 @@ def test_simple_types0(self): d = b"".join(d) funcname, dynargs = ABI.deserialize(type_spec="func(uint256,uint256)", data=d) # self.assertEqual(funcname, 'AAAA') - self.assertEqual(dynargs, (32, 2 ** 256 - 1)) + self.assertEqual(dynargs, (32, 2**256 - 1)) def test_simple_types1(self): d = [ @@ -192,7 +192,7 @@ def test_simple_types1(self): d = b"".join(d) funcname, dynargs = ABI.deserialize(type_spec="func(uint256,uint256,bool,address)", data=d) # self.assertEqual(funcname, 'AAAA') - self.assertEqual(dynargs, (32, 2 ** 256 - 1, 0xFF, 0x424242)) + self.assertEqual(dynargs, (32, 2**256 - 1, 0xFF, 0x424242)) def test_simple_types_ints(self): d = [ @@ -203,7 +203,7 @@ def test_simple_types_ints(self): d = b"".join(d) func_id, dynargs = ABI.deserialize(type_spec="func(int256,int256)", data=d) self.assertEqual(func_id, b"AAAA") - self.assertEqual(dynargs, (2 ** 255 - 1, -(2 ** 255))) + self.assertEqual(dynargs, (2**255 - 1, -(2**255))) def test_simple_types_ints_symbolic(self): cs = ConstraintSet() @@ -335,11 +335,11 @@ def test_valid_uint(self): data = b"\xFF" * 32 parsed = ABI.deserialize("uint", data) - self.assertEqual(parsed, 2 ** 256 - 1) + self.assertEqual(parsed, 2**256 - 1) for i in range(8, 257, 8): parsed = ABI.deserialize(f"uint{i}", data) - self.assertEqual(parsed, 2 ** i - 1) + self.assertEqual(parsed, 2**i - 1) def test_empty_types(self): name, args = ABI.deserialize("func()", "\0" * 32) @@ -487,7 +487,7 @@ def tearDown(self): def test_solidity_create_contract_no_args(self): source_code = "contract A { constructor() {} }" - owner = self.mevm.create_account(balance=10 ** 10) + owner = self.mevm.create_account(balance=10**10) # The default `args=()` makes it pass no arguments contract1 = self.mevm.solidity_create_contract(source_code, owner=owner) @@ -525,7 +525,7 @@ def test_solidity_create_contract_with_payable_constructor_and_balance_owner_ins def test_solidity_create_contract_with_payable_constructor(self): source_code = "contract A { constructor() public payable {} }" - owner = self.mevm.create_account(balance=10 ** 10) + owner = self.mevm.create_account(balance=10**10) contract = self.mevm.solidity_create_contract(source_code, owner=owner, balance=100) @@ -613,7 +613,7 @@ def test_invalid_function_signature(self): } """ - user_account = self.mevm.create_account(balance=10 ** 10) + user_account = self.mevm.create_account(balance=10**10) contract_account = self.mevm.solidity_create_contract(source_code, owner=user_account) with self.assertRaises(EthereumError) as ctx: contract_account.ret(self.mevm.make_symbolic_value(), signature="(uint8)") @@ -674,7 +674,7 @@ def test_states_querying_1325(self): """ Tests issue 1325. """ - owner = self.mevm.create_account(balance=10 ** 10) + owner = self.mevm.create_account(balance=10**10) A = self.mevm.solidity_create_contract( "contract A { function foo() { revert(); } }", owner=owner ) @@ -755,7 +755,7 @@ def test_gen_testcase_only_if(self): """ consts = config.get_group("evm") consts.events = True - user_account = self.mevm.create_account(balance=10 ** 10) + user_account = self.mevm.create_account(balance=10**10) contract_account = self.mevm.solidity_create_contract(source_code, owner=user_account) input_sym = self.mevm.make_symbolic_value() contract_account.f(input_sym) @@ -813,7 +813,7 @@ def test_function_name_with_signature(self): } } """ - user_account = self.mevm.create_account(balance=10 ** 10) + user_account = self.mevm.create_account(balance=10**10) contract_account = self.mevm.solidity_create_contract(source_code, owner=user_account) contract_account.ret( self.mevm.make_symbolic_value(), @@ -838,8 +838,8 @@ def test_migrate_integration(self): } """ - owner_account = m.create_account(balance=10 ** 10) - attacker_account = m.create_account(balance=10 ** 10) + owner_account = m.create_account(balance=10**10) + attacker_account = m.create_account(balance=10**10) contract_account = m.solidity_create_contract(contract_src, owner=owner_account, balance=0) # Some global expression `sym_add1` @@ -886,7 +886,7 @@ def test_account_names(self): def test_regression_internal_tx(self): m = self.mevm - owner_account = m.create_account(balance=10 ** 10) + owner_account = m.create_account(balance=10**10) c = """ contract C1 { function g() returns (uint) { @@ -971,7 +971,7 @@ def test_call_with_concretized_args(self): } """ - owner = m.create_account(balance=20 ** 10) + owner = m.create_account(balance=20**10) contract = m.solidity_create_contract(contract_src, owner=owner) receiver = m.create_account(balance=0) symbolic_address = m.make_symbolic_address() @@ -1169,7 +1169,7 @@ def test_graceful_handle_no_alive_states(self): """ # Initiate the accounts - user_account = m.create_account(balance=10 ** 10) + user_account = m.create_account(balance=10**10) contract_account = m.solidity_create_contract(source_code, owner=user_account, balance=0) contract_account.f(1) # it works @@ -1331,7 +1331,7 @@ def test_preconstraints(self): """ m: ManticoreEVM = self.mevm - creator_account = m.create_account(balance=10 ** 10) + creator_account = m.create_account(balance=10**10) contract_account = m.solidity_create_contract(source_code, owner=creator_account, balance=0) data = m.make_symbolic_buffer(320) diff --git a/tests/ethereum_bench/test_consensys_benchmark.py b/tests/ethereum_bench/test_consensys_benchmark.py index b6a9fe9cd..b4242b7a3 100644 --- a/tests/ethereum_bench/test_consensys_benchmark.py +++ b/tests/ethereum_bench/test_consensys_benchmark.py @@ -21,7 +21,7 @@ class EthBenchmark(unittest.TestCase): - """ https://consensys.net/diligence/evm-analyzer-benchmark-suite/ """ + """https://consensys.net/diligence/evm-analyzer-benchmark-suite/""" def setUp(self): self.mevm = ManticoreEVM() diff --git a/tests/native/test_aarch64rf.py b/tests/native/test_aarch64rf.py index df821118a..2f945965a 100644 --- a/tests/native/test_aarch64rf.py +++ b/tests/native/test_aarch64rf.py @@ -2,11 +2,11 @@ from manticore.native.cpu.aarch64 import Aarch64RegisterFile as RF -MAX_128 = 2 ** 128 - 1 -MAX_64 = 2 ** 64 - 1 -MAX_32 = 2 ** 32 - 1 -MAX_16 = 2 ** 16 - 1 -MAX_8 = 2 ** 8 - 1 +MAX_128 = 2**128 - 1 +MAX_64 = 2**64 - 1 +MAX_32 = 2**32 - 1 +MAX_16 = 2**16 - 1 +MAX_8 = 2**8 - 1 MAGIC_128 = 0x41424344454647484950515253545556 MAGIC_64 = MAGIC_128 & MAX_64 diff --git a/tests/native/test_armv7cpu.py b/tests/native/test_armv7cpu.py index 640f4ec76..3563e854e 100644 --- a/tests/native/test_armv7cpu.py +++ b/tests/native/test_armv7cpu.py @@ -557,7 +557,7 @@ def test_mov_immreg(self): @itest_custom("mov r0, r1") def test_mov_immreg1(self): - self.rf.write("R1", 2 ** 32) + self.rf.write("R1", 2**32) self.cpu.execute() self.assertEqual(self.rf.read("R0"), 0) @@ -634,7 +634,7 @@ def test_movs_reg(self): @itest_custom("movs r0, r1") def test_movs_reg1(self): - self.rf.write("R1", 2 ** 32) + self.rf.write("R1", 2**32) pre_c = self.rf.read("APSR_C") pre_v = self.rf.read("APSR_V") self.cpu.execute() @@ -643,11 +643,11 @@ def test_movs_reg1(self): @itest_custom("movs r0, r1") def test_movs_reg2(self): - self.rf.write("R1", 2 ** 32 - 1) + self.rf.write("R1", 2**32 - 1) pre_c = self.rf.read("APSR_C") pre_v = self.rf.read("APSR_V") self.cpu.execute() - self.assertEqual(self.rf.read("R0"), 2 ** 32 - 1) + self.assertEqual(self.rf.read("R0"), 2**32 - 1) self._checkFlagsNZCV(1, 0, pre_c, pre_v) @itest_custom("movs r0, r1") @@ -699,7 +699,7 @@ def test_add_imm_carry(self): @itest_custom("add r3, r1, 0x1") def test_add_imm_overflow(self): - self.rf.write("R1", (2 ** 31 - 1)) + self.rf.write("R1", (2**31 - 1)) self.cpu.execute() self.assertEqual(self.rf.read("R3"), 0x80000000) @@ -733,7 +733,7 @@ def test_add_reg_carry(self): @itest_custom("add r3, r1, r2") def test_add_reg_overflow(self): - self.rf.write("R1", (2 ** 31 - 1)) + self.rf.write("R1", (2**31 - 1)) self.rf.write("R2", 1) self.cpu.execute() self.assertEqual(self.rf.read("R3"), (1 << 31)) @@ -820,17 +820,17 @@ def test_adc_mod_imm_2(self): def test_add_reg_sft_rrx(self): self.rf.write("APSR_C", 0x0) self.rf.write("R1", 0x0) - self.rf.write("R2", 2 ** 32 - 1) + self.rf.write("R2", 2**32 - 1) self.cpu.execute() - self.assertEqual(self.rf.read("R3"), 2 ** 31 - 1) + self.assertEqual(self.rf.read("R3"), 2**31 - 1) @itest_custom("add r3, r1, r2, rrx") def test_add_reg_sft_rrx2(self): self.rf.write("APSR_C", 0x1) self.rf.write("R1", 0x0) - self.rf.write("R2", 2 ** 32 - 1) + self.rf.write("R2", 2**32 - 1) self.cpu.execute() - self.assertEqual(self.rf.read("R3"), 2 ** 32 - 1) + self.assertEqual(self.rf.read("R3"), 2**32 - 1) @itest_custom("add r3, r1, r2, lsl r4") def test_add_reg_sft_lsl_reg(self): @@ -884,17 +884,17 @@ def test_add_reg_sft_ror_reg(self): def test_add_reg_sft_rrx_reg(self): self.rf.write("R1", 0x0) self.rf.write("APSR_C", 0x0) - self.rf.write("R2", 2 ** 32 - 1) + self.rf.write("R2", 2**32 - 1) self.cpu.execute() - self.assertEqual(self.rf.read("R3"), 2 ** 31 - 1) + self.assertEqual(self.rf.read("R3"), 2**31 - 1) @itest_custom("add r3, r1, r2, rrx") def test_add_reg_sft_rrx2_reg(self): self.rf.write("R1", 0x0) self.rf.write("APSR_C", 0x1) - self.rf.write("R2", 2 ** 32 - 1) + self.rf.write("R2", 2**32 - 1) self.cpu.execute() - self.assertEqual(self.rf.read("R3"), 2 ** 32 - 1) + self.assertEqual(self.rf.read("R3"), 2**32 - 1) # ADDS @@ -935,7 +935,7 @@ def test_adds_imm_carry_overflow(self): @itest_custom("adds r3, r1, 0x1") def test_adds_imm_overflow(self): - self.rf.write("R1", (2 ** 31 - 1)) + self.rf.write("R1", (2**31 - 1)) self.cpu.execute() self.assertEqual(self.rf.read("R3"), 0x80000000) self._checkFlagsNZCV(1, 0, 0, 1) @@ -981,7 +981,7 @@ def test_adds_reg_carry(self): @itest_custom("adds r3, r1, r2") def test_adds_reg_overflow(self): - self.rf.write("R1", (2 ** 31 - 1)) + self.rf.write("R1", (2**31 - 1)) self.rf.write("R2", 1) self.cpu.execute() self.assertEqual(self.rf.read("R3"), (1 << 31)) @@ -1023,18 +1023,18 @@ def test_adds_reg_sft_asr2(self): def test_adds_reg_sft_rrx(self): self.rf.write("APSR_C", 0x0) self.rf.write("R1", 0x0) - self.rf.write("R2", 2 ** 32 - 1) + self.rf.write("R2", 2**32 - 1) self.cpu.execute() - self.assertEqual(self.rf.read("R3"), 2 ** 31 - 1) + self.assertEqual(self.rf.read("R3"), 2**31 - 1) self._checkFlagsNZCV(0, 0, 0, 0) @itest_custom("adds r3, r1, r2, rrx") def test_adds_reg_sft_rrx2(self): self.rf.write("APSR_C", 0x1) self.rf.write("R1", 0x0) - self.rf.write("R2", 2 ** 32 - 1) + self.rf.write("R2", 2**32 - 1) self.cpu.execute() - self.assertEqual(self.rf.read("R3"), 2 ** 32 - 1) + self.assertEqual(self.rf.read("R3"), 2**32 - 1) self._checkFlagsNZCV(1, 0, 0, 0) @itest_setregs("R0=0") @@ -2240,7 +2240,7 @@ def test_flag_state_continuity(self): // ovf should still be 1 """ - self.rf.write("R1", (2 ** 31 - 1)) + self.rf.write("R1", (2**31 - 1)) self._setupCpu("adds r2, r1, #0x1") self.cpu.execute() self.rf.write("R1", 1) @@ -2321,7 +2321,7 @@ def test_umull_still32(self): @itest_setregs("R1=0xfffffffe", "R2=0xfffffffe") @itest("UMULLS R1, R2, R1, R2") def test_umull_max(self): - mul = 0xFFFFFFFE ** 2 + mul = 0xFFFFFFFE**2 pre_c = self.rf.read("APSR_C") pre_v = self.rf.read("APSR_V") self.assertEqual(self.rf.read("R1"), mul & Mask(32)) diff --git a/tests/native/test_armv7unicorn.py b/tests/native/test_armv7unicorn.py index 41574328c..c5d9add58 100644 --- a/tests/native/test_armv7unicorn.py +++ b/tests/native/test_armv7unicorn.py @@ -193,7 +193,7 @@ def assemble(asm: str, mode=CS_MODE_ARM) -> bytes: def emulate_next(cpu): - "Read the next instruction and emulate it with Unicorn " + "Read the next instruction and emulate it with Unicorn" cpu.decode_instruction(cpu.PC) emu = UnicornEmulator(cpu) emu.emulate(cpu.instruction) @@ -300,7 +300,7 @@ def test_mov_immreg(self): @itest_custom("mov r0, r1") def test_mov_immreg1(self): - self.rf.write("R1", 2 ** 32) + self.rf.write("R1", 2**32) emulate_next(self.cpu) self.assertEqual(self.rf.read("R0"), 0) @@ -377,7 +377,7 @@ def test_movs_reg(self): @itest_custom("movs r0, r1") def test_movs_reg1(self): - self.rf.write("R1", 2 ** 32) + self.rf.write("R1", 2**32) pre_c = self.rf.read("APSR_C") pre_v = self.rf.read("APSR_V") emulate_next(self.cpu) @@ -386,11 +386,11 @@ def test_movs_reg1(self): @itest_custom("movs r0, r1") def test_movs_reg2(self): - self.rf.write("R1", 2 ** 32 - 1) + self.rf.write("R1", 2**32 - 1) pre_c = self.rf.read("APSR_C") pre_v = self.rf.read("APSR_V") emulate_next(self.cpu) - self.assertEqual(self.rf.read("R0"), 2 ** 32 - 1) + self.assertEqual(self.rf.read("R0"), 2**32 - 1) self._checkFlagsNZCV(1, 0, pre_c, pre_v) @itest_custom("movs r0, r1") @@ -430,7 +430,7 @@ def test_add_imm_carry(self): @itest_custom("add r3, r1, 0x1") def test_add_imm_overflow(self): - self.rf.write("R1", (2 ** 31 - 1)) + self.rf.write("R1", (2**31 - 1)) emulate_next(self.cpu) self.assertEqual(self.rf.read("R3"), 0x80000000) @@ -464,7 +464,7 @@ def test_add_reg_carry(self): @itest_custom("add r3, r1, r2") def test_add_reg_overflow(self): - self.rf.write("R1", (2 ** 31 - 1)) + self.rf.write("R1", (2**31 - 1)) self.rf.write("R2", 1) emulate_next(self.cpu) self.assertEqual(self.rf.read("R3"), (1 << 31)) @@ -532,17 +532,17 @@ def test_adc_reg_sft_ror(self): def test_add_reg_sft_rrx(self): self.rf.write("APSR_C", 0x0) self.rf.write("R1", 0x0) - self.rf.write("R2", 2 ** 32 - 1) + self.rf.write("R2", 2**32 - 1) emulate_next(self.cpu) - self.assertEqual(self.rf.read("R3"), 2 ** 31 - 1) + self.assertEqual(self.rf.read("R3"), 2**31 - 1) @itest_custom("add r3, r1, r2, rrx") def test_add_reg_sft_rrx2(self): self.rf.write("APSR_C", 0x1) self.rf.write("R1", 0x0) - self.rf.write("R2", 2 ** 32 - 1) + self.rf.write("R2", 2**32 - 1) emulate_next(self.cpu) - self.assertEqual(self.rf.read("R3"), 2 ** 32 - 1) + self.assertEqual(self.rf.read("R3"), 2**32 - 1) @itest_custom("add r3, r1, r2, lsl r4") def test_add_reg_sft_lsl_reg(self): @@ -596,17 +596,17 @@ def test_add_reg_sft_ror_reg(self): def test_add_reg_sft_rrx_reg(self): self.rf.write("R1", 0x0) self.rf.write("APSR_C", 0x0) - self.rf.write("R2", 2 ** 32 - 1) + self.rf.write("R2", 2**32 - 1) emulate_next(self.cpu) - self.assertEqual(self.rf.read("R3"), 2 ** 31 - 1) + self.assertEqual(self.rf.read("R3"), 2**31 - 1) @itest_custom("add r3, r1, r2, rrx") def test_add_reg_sft_rrx2_reg(self): self.rf.write("R1", 0x0) self.rf.write("APSR_C", 0x1) - self.rf.write("R2", 2 ** 32 - 1) + self.rf.write("R2", 2**32 - 1) emulate_next(self.cpu) - self.assertEqual(self.rf.read("R3"), 2 ** 32 - 1) + self.assertEqual(self.rf.read("R3"), 2**32 - 1) # ADDS @@ -647,7 +647,7 @@ def test_adds_imm_carry_overflow(self): @itest_custom("adds r3, r1, 0x1") def test_adds_imm_overflow(self): - self.rf.write("R1", (2 ** 31 - 1)) + self.rf.write("R1", (2**31 - 1)) emulate_next(self.cpu) self.assertEqual(self.rf.read("R3"), 0x80000000) self._checkFlagsNZCV(1, 0, 0, 1) @@ -693,7 +693,7 @@ def test_adds_reg_carry(self): @itest_custom("adds r3, r1, r2") def test_adds_reg_overflow(self): - self.rf.write("R1", (2 ** 31 - 1)) + self.rf.write("R1", (2**31 - 1)) self.rf.write("R2", 1) emulate_next(self.cpu) self.assertEqual(self.rf.read("R3"), (1 << 31)) @@ -735,18 +735,18 @@ def test_adds_reg_sft_asr2(self): def test_adds_reg_sft_rrx(self): self.rf.write("APSR_C", 0x0) self.rf.write("R1", 0x0) - self.rf.write("R2", 2 ** 32 - 1) + self.rf.write("R2", 2**32 - 1) emulate_next(self.cpu) - self.assertEqual(self.rf.read("R3"), 2 ** 31 - 1) + self.assertEqual(self.rf.read("R3"), 2**31 - 1) self._checkFlagsNZCV(0, 0, 0, 0) @itest_custom("adds r3, r1, r2, rrx") def test_adds_reg_sft_rrx2(self): self.rf.write("APSR_C", 0x1) self.rf.write("R1", 0x0) - self.rf.write("R2", 2 ** 32 - 1) + self.rf.write("R2", 2**32 - 1) emulate_next(self.cpu) - self.assertEqual(self.rf.read("R3"), 2 ** 32 - 1) + self.assertEqual(self.rf.read("R3"), 2**32 - 1) self._checkFlagsNZCV(1, 0, 0, 0) # LDR imm @@ -1386,7 +1386,7 @@ def test_flag_state_continuity(self): // ovf should still be 1 """ - self.rf.write("R1", (2 ** 31 - 1)) + self.rf.write("R1", (2**31 - 1)) self._setupCpu("adds r2, r1, #0x1") emulate_next(self.cpu) self.rf.write("R1", 1) @@ -1450,7 +1450,7 @@ def test_umull_still32(self): @itest_setregs("R1=0xfffffffe", "R2=0xfffffffe") @itest("UMULLS R1, R2, R1, R2") def test_umull_max(self): - mul = 0xFFFFFFFE ** 2 + mul = 0xFFFFFFFE**2 pre_c = self.rf.read("APSR_C") pre_v = self.rf.read("APSR_V") self.assertEqual(self.rf.read("R1"), mul & Mask(32)) diff --git a/tests/native/test_cpu_automatic.py b/tests/native/test_cpu_automatic.py index a3d97f3fd..6f68201d8 100644 --- a/tests/native/test_cpu_automatic.py +++ b/tests/native/test_cpu_automatic.py @@ -10,7 +10,7 @@ class CPUTest(unittest.TestCase): _multiprocess_can_split_ = True class ROOperand: - """ Mocking class for operand ronly """ + """Mocking class for operand ronly""" def __init__(self, size, value): self.size = size @@ -20,7 +20,7 @@ def read(self): return self.value & ((1 << self.size) - 1) class RWOperand(ROOperand): - """ Mocking class for operand rw """ + """Mocking class for operand rw""" def write(self, value): self.value = value & ((1 << self.size) - 1) diff --git a/tests/native/test_dyn.py b/tests/native/test_dyn.py index bf4d9d28f..ca4d40737 100644 --- a/tests/native/test_dyn.py +++ b/tests/native/test_dyn.py @@ -12,7 +12,7 @@ class CPUTest(unittest.TestCase): _multiprocess_can_split_ = True class ROOperand: - """ Mocking class for operand ronly """ + """Mocking class for operand ronly""" def __init__(self, size, value): self.size = size @@ -22,7 +22,7 @@ def read(self): return self.value & ((1 << self.size) - 1) class RWOperand(ROOperand): - """ Mocking class for operand rw """ + """Mocking class for operand rw""" def write(self, value): self.value = value & ((1 << self.size) - 1) diff --git a/tests/native/test_memory.py b/tests/native/test_memory.py index 7743644eb..5591af450 100644 --- a/tests/native/test_memory.py +++ b/tests/native/test_memory.py @@ -1373,7 +1373,7 @@ def testmprotectFailReading(self): mem.mprotect(addr, size, "w") with self.assertRaisesRegex( - InvalidMemoryAccess, fr"Invalid memory access \(mode:.\) <{addr:x}>" + InvalidMemoryAccess, rf"Invalid memory access \(mode:.\) <{addr:x}>" ): _ = mem[addr] @@ -1448,7 +1448,7 @@ def testmprotectFailWriting(self): mem[addr] = "a" mem.mprotect(addr, size, "r") with self.assertRaisesRegex( - InvalidMemoryAccess, fr"Invalid memory access \(mode:w\) <{addr:x}>" + InvalidMemoryAccess, rf"Invalid memory access \(mode:w\) <{addr:x}>" ): mem[addr] = "a" @@ -1464,7 +1464,7 @@ def testmprotecNoReadthenOkRead(self): mem[addr] = "a" with self.assertRaisesRegex( - InvalidMemoryAccess, fr"Invalid memory access \(mode:r\) <{addr:x}>" + InvalidMemoryAccess, rf"Invalid memory access \(mode:r\) <{addr:x}>" ): _ = mem[addr] diff --git a/tests/native/test_register.py b/tests/native/test_register.py index 71df2a9a8..27dea9d81 100644 --- a/tests/native/test_register.py +++ b/tests/native/test_register.py @@ -18,7 +18,7 @@ def test_basic_write(self): def test_truncate(self): r = Register(32) - r.write(2 ** 32) + r.write(2**32) self.assertEqual(r.read(), 0) def test_largest_write(self): diff --git a/tests/native/test_slam_regre.py b/tests/native/test_slam_regre.py index 518971ac2..e19f269ed 100644 --- a/tests/native/test_slam_regre.py +++ b/tests/native/test_slam_regre.py @@ -12,7 +12,7 @@ class CPUTest(unittest.TestCase): _multiprocess_can_split_ = True class ROOperand: - """ Mocking class for operand ronly """ + """Mocking class for operand ronly""" def __init__(self, size, value): self.size = size @@ -22,7 +22,7 @@ def read(self): return self.value & ((1 << self.size) - 1) class RWOperand(ROOperand): - """ Mocking class for operand rw """ + """Mocking class for operand rw""" def write(self, value): self.value = value & ((1 << self.size) - 1) diff --git a/tests/native/test_x86_pcmpxstrx.py b/tests/native/test_x86_pcmpxstrx.py index 23c778639..b0dacb8de 100644 --- a/tests/native/test_x86_pcmpxstrx.py +++ b/tests/native/test_x86_pcmpxstrx.py @@ -37,7 +37,7 @@ class CPUTest(unittest.TestCase): _multiprocess_can_split_ = True class ROOperand: - """ Mocking class for operand ronly """ + """Mocking class for operand ronly""" def __init__(self, size, value): self.size = size @@ -47,7 +47,7 @@ def read(self): return self.value & ((1 << self.size) - 1) class RWOperand(ROOperand): - """ Mocking class for operand rw """ + """Mocking class for operand rw""" def write(self, value): self.value = value & ((1 << self.size) - 1) diff --git a/tests/wasm/json2mc.py b/tests/wasm/json2mc.py index 3611cc1c4..3bbc272b6 100644 --- a/tests/wasm/json2mc.py +++ b/tests/wasm/json2mc.py @@ -37,7 +37,7 @@ def __repr__(self): def convert_types(to_convert): - """ Convert unsigned ints from JSON into WASM Types (I32, F64, etc) """ + """Convert unsigned ints from JSON into WASM Types (I32, F64, etc)""" out = [] for item in to_convert: out.append(f"{item['type'].upper()}({item.get('value', 0)})") diff --git a/tests/wasm_sym/json2smc.py b/tests/wasm_sym/json2smc.py index e97320367..35cd8b8aa 100644 --- a/tests/wasm_sym/json2smc.py +++ b/tests/wasm_sym/json2smc.py @@ -80,7 +80,7 @@ def convert_rets(to_convert): def escape_null(in_str: str): - """ Base-64 encode non-printable characters in test names so we can handle that obnoxious names module """ + """Base-64 encode non-printable characters in test names so we can handle that obnoxious names module""" if in_str.isprintable() and not any((c in in_str) for c in {'"', "'", ";"}): return f'"{in_str}"' else: