angr 9.2.115__py3-none-manylinux2014_aarch64.whl → 9.2.116__py3-none-manylinux2014_aarch64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of angr might be problematic. Click here for more details.
- angr/__init__.py +1 -1
- angr/__main__.py +1 -1
- angr/analyses/decompiler/optimization_passes/stack_canary_simplifier.py +5 -1
- angr/analyses/decompiler/structured_codegen/c.py +10 -13
- angr/analyses/decompiler/structuring/dream.py +3 -4
- angr/analyses/decompiler/structuring/phoenix.py +4 -5
- angr/analyses/decompiler/structuring/structurer_base.py +2 -3
- angr/analyses/decompiler/structuring/structurer_nodes.py +3 -3
- angr/analyses/reaching_definitions/dep_graph.py +62 -5
- angr/analyses/reaching_definitions/function_handler_library/__init__.py +11 -0
- angr/analyses/reaching_definitions/function_handler_library/stdio.py +15 -13
- angr/analyses/reaching_definitions/function_handler_library/stdlib.py +17 -11
- angr/analyses/reaching_definitions/function_handler_library/string.py +1 -1
- angr/analyses/reaching_definitions/function_handler_library/unistd.py +2 -2
- angr/analyses/reaching_definitions/rd_state.py +26 -29
- angr/analyses/variable_recovery/engine_vex.py +0 -9
- angr/engines/pcode/cc.py +2 -0
- angr/knowledge_plugins/key_definitions/live_definitions.py +12 -13
- angr/storage/memory_mixins/paged_memory/pages/cooperation.py +2 -1
- {angr-9.2.115.dist-info → angr-9.2.116.dist-info}/METADATA +7 -7
- {angr-9.2.115.dist-info → angr-9.2.116.dist-info}/RECORD +25 -25
- {angr-9.2.115.dist-info → angr-9.2.116.dist-info}/WHEEL +1 -1
- {angr-9.2.115.dist-info → angr-9.2.116.dist-info}/LICENSE +0 -0
- {angr-9.2.115.dist-info → angr-9.2.116.dist-info}/entry_points.txt +0 -0
- {angr-9.2.115.dist-info → angr-9.2.116.dist-info}/top_level.txt +0 -0
angr/__init__.py
CHANGED
angr/__main__.py
CHANGED
|
@@ -182,7 +182,11 @@ class StackCanarySimplifier(OptimizationPass):
|
|
|
182
182
|
|
|
183
183
|
while True:
|
|
184
184
|
traversed.add(block_addr)
|
|
185
|
-
|
|
185
|
+
try:
|
|
186
|
+
first_block = next(self._get_blocks(block_addr))
|
|
187
|
+
except StopIteration:
|
|
188
|
+
break
|
|
189
|
+
|
|
186
190
|
if first_block is None:
|
|
187
191
|
break
|
|
188
192
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# pylint:disable=missing-class-docstring,too-many-boolean-expressions,unused-argument,no-self-use
|
|
2
2
|
from typing import Optional, Any, TYPE_CHECKING
|
|
3
3
|
from collections.abc import Callable
|
|
4
|
-
from collections import defaultdict
|
|
4
|
+
from collections import defaultdict, Counter
|
|
5
5
|
import logging
|
|
6
6
|
import struct
|
|
7
7
|
|
|
@@ -491,19 +491,16 @@ class CFunction(CConstruct): # pylint:disable=abstract-method
|
|
|
491
491
|
else:
|
|
492
492
|
name = str(variable)
|
|
493
493
|
|
|
494
|
-
# sort by
|
|
494
|
+
# sort by the following:
|
|
495
|
+
# * if it's a a non-basic type
|
|
496
|
+
# * the number of occurrences
|
|
497
|
+
# * the repr of the type itself
|
|
495
498
|
# TODO: The type selection should actually happen during variable unification
|
|
496
499
|
vartypes = [x[1] for x in cvar_and_vartypes]
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
if nonprimitive_vartypes:
|
|
502
|
-
nonprimitive_vartypes = list(
|
|
503
|
-
dict.fromkeys(sorted(nonprimitive_vartypes, key=nonprimitive_vartypes.count, reverse=True))
|
|
504
|
-
)
|
|
505
|
-
vartypes.remove(nonprimitive_vartypes[0])
|
|
506
|
-
vartypes.insert(0, nonprimitive_vartypes[0])
|
|
500
|
+
count = Counter(vartypes)
|
|
501
|
+
vartypes = sorted(
|
|
502
|
+
count.copy(), key=lambda x: (isinstance(x, (SimTypeChar, SimTypeInt, SimTypeFloat)), count[x], repr(x))
|
|
503
|
+
)
|
|
507
504
|
|
|
508
505
|
for i, var_type in enumerate(vartypes):
|
|
509
506
|
if i == 0:
|
|
@@ -2177,8 +2174,8 @@ class CConstant(CExpression):
|
|
|
2177
2174
|
v = refval.content.decode("utf-8")
|
|
2178
2175
|
else:
|
|
2179
2176
|
# it's a string
|
|
2180
|
-
assert isinstance(v, str)
|
|
2181
2177
|
v = refval
|
|
2178
|
+
assert isinstance(v, str)
|
|
2182
2179
|
yield CConstant.str_to_c_str(v), self
|
|
2183
2180
|
elif isinstance(self._type, SimTypePointer) and isinstance(self._type.pts_to, SimTypeWideChar):
|
|
2184
2181
|
refval = self.reference_values[self._type]
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
# pylint:disable=multiple-statements,line-too-long,consider-using-enumerate
|
|
2
2
|
from typing import Optional, Any, TYPE_CHECKING
|
|
3
|
-
from collections import OrderedDict as ODict
|
|
4
3
|
import logging
|
|
5
4
|
from collections import defaultdict, OrderedDict
|
|
6
5
|
|
|
@@ -661,7 +660,7 @@ class DreamStructurer(StructurerBase):
|
|
|
661
660
|
i,
|
|
662
661
|
node,
|
|
663
662
|
cmp_expr,
|
|
664
|
-
cases:
|
|
663
|
+
cases: OrderedDict,
|
|
665
664
|
node_default,
|
|
666
665
|
addr,
|
|
667
666
|
addr2nodes,
|
|
@@ -909,7 +908,7 @@ class DreamStructurer(StructurerBase):
|
|
|
909
908
|
head_node_idx: int,
|
|
910
909
|
node_b_addr: int,
|
|
911
910
|
addr2nodes: dict[int, set[CodeNode]],
|
|
912
|
-
) -> tuple[
|
|
911
|
+
) -> tuple[OrderedDict, Any, Any]:
|
|
913
912
|
"""
|
|
914
913
|
Discover all cases for the switch-case structure and build the switch-cases dict.
|
|
915
914
|
|
|
@@ -922,7 +921,7 @@ class DreamStructurer(StructurerBase):
|
|
|
922
921
|
:return: A tuple of (dict of cases, the default node if exists, nodes to remove).
|
|
923
922
|
"""
|
|
924
923
|
|
|
925
|
-
cases:
|
|
924
|
+
cases: OrderedDict[int | tuple[int, ...], SequenceNode] = OrderedDict()
|
|
926
925
|
to_remove = set()
|
|
927
926
|
node_default = addr2nodes.get(node_b_addr, None)
|
|
928
927
|
if node_default is not None:
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
# pylint:disable=line-too-long,import-outside-toplevel,import-error,multiple-statements,too-many-boolean-expressions
|
|
2
2
|
from typing import Any, DefaultDict, Optional, TYPE_CHECKING
|
|
3
|
-
from collections import OrderedDict
|
|
4
|
-
from collections import defaultdict
|
|
3
|
+
from collections import defaultdict, OrderedDict
|
|
5
4
|
from enum import Enum
|
|
6
5
|
import logging
|
|
7
6
|
|
|
@@ -1308,8 +1307,8 @@ class PhoenixStructurer(StructurerBase):
|
|
|
1308
1307
|
node_b_addr,
|
|
1309
1308
|
graph,
|
|
1310
1309
|
full_graph,
|
|
1311
|
-
) -> tuple[
|
|
1312
|
-
cases:
|
|
1310
|
+
) -> tuple[OrderedDict, Any, set[Any]]:
|
|
1311
|
+
cases: OrderedDict[int | tuple[int], SequenceNode] = OrderedDict()
|
|
1313
1312
|
to_remove = set()
|
|
1314
1313
|
|
|
1315
1314
|
# it is possible that the default node gets duplicated by other analyses and creates a default node (addr.a)
|
|
@@ -1418,7 +1417,7 @@ class PhoenixStructurer(StructurerBase):
|
|
|
1418
1417
|
self,
|
|
1419
1418
|
head,
|
|
1420
1419
|
cmp_expr,
|
|
1421
|
-
cases:
|
|
1420
|
+
cases: OrderedDict,
|
|
1422
1421
|
node_default_addr: int,
|
|
1423
1422
|
node_default,
|
|
1424
1423
|
addr,
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
# pylint:disable=unused-argument
|
|
2
2
|
from typing import Optional, Any, TYPE_CHECKING
|
|
3
|
-
from collections import OrderedDict as ODict
|
|
4
3
|
from collections import defaultdict, OrderedDict
|
|
5
4
|
import logging
|
|
6
5
|
|
|
@@ -739,8 +738,8 @@ class StructurerBase(Analysis):
|
|
|
739
738
|
#
|
|
740
739
|
|
|
741
740
|
def _reorganize_switch_cases(
|
|
742
|
-
self, cases:
|
|
743
|
-
) ->
|
|
741
|
+
self, cases: OrderedDict[int | tuple[int, ...], SequenceNode]
|
|
742
|
+
) -> OrderedDict[int | tuple[int, ...], SequenceNode]:
|
|
744
743
|
new_cases = OrderedDict()
|
|
745
744
|
|
|
746
745
|
caseid2gotoaddrs = {}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# pylint:disable=missing-class-docstring
|
|
2
2
|
from typing import Any
|
|
3
|
-
from collections import OrderedDict
|
|
3
|
+
from collections import OrderedDict
|
|
4
4
|
|
|
5
5
|
import claripy
|
|
6
6
|
import ailment
|
|
@@ -358,9 +358,9 @@ class SwitchCaseNode(BaseNode):
|
|
|
358
358
|
"addr",
|
|
359
359
|
)
|
|
360
360
|
|
|
361
|
-
def __init__(self, switch_expr, cases:
|
|
361
|
+
def __init__(self, switch_expr, cases: OrderedDict[int | tuple[int, ...], SequenceNode], default_node, addr=None):
|
|
362
362
|
self.switch_expr = switch_expr
|
|
363
|
-
self.cases:
|
|
363
|
+
self.cases: OrderedDict[int | tuple[int, ...], SequenceNode] = cases
|
|
364
364
|
self.default_node = default_node
|
|
365
365
|
self.addr = addr
|
|
366
366
|
|
|
@@ -213,6 +213,68 @@ class DepGraph:
|
|
|
213
213
|
|
|
214
214
|
self.graph.add_edge(memory_location_definition, definition)
|
|
215
215
|
|
|
216
|
+
@overload
|
|
217
|
+
def find_definitions(
|
|
218
|
+
self,
|
|
219
|
+
*,
|
|
220
|
+
kind: type[A],
|
|
221
|
+
**kwargs: Any,
|
|
222
|
+
) -> list[Definition[A]]: ...
|
|
223
|
+
|
|
224
|
+
@overload
|
|
225
|
+
def find_definitions(
|
|
226
|
+
self,
|
|
227
|
+
*,
|
|
228
|
+
kind: Literal[AtomKind.REGISTER] = AtomKind.REGISTER,
|
|
229
|
+
**kwargs: Any,
|
|
230
|
+
) -> list[Definition[Register]]: ...
|
|
231
|
+
|
|
232
|
+
@overload
|
|
233
|
+
def find_definitions(
|
|
234
|
+
self,
|
|
235
|
+
*,
|
|
236
|
+
kind: Literal[AtomKind.MEMORY] = AtomKind.MEMORY,
|
|
237
|
+
**kwargs: Any,
|
|
238
|
+
) -> list[Definition[MemoryLocation]]: ...
|
|
239
|
+
|
|
240
|
+
@overload
|
|
241
|
+
def find_definitions(
|
|
242
|
+
self,
|
|
243
|
+
*,
|
|
244
|
+
kind: Literal[AtomKind.TMP] = AtomKind.TMP,
|
|
245
|
+
**kwargs: Any,
|
|
246
|
+
) -> list[Definition[Tmp]]: ...
|
|
247
|
+
|
|
248
|
+
@overload
|
|
249
|
+
def find_definitions(
|
|
250
|
+
self,
|
|
251
|
+
*,
|
|
252
|
+
kind: Literal[AtomKind.CONSTANT] = AtomKind.CONSTANT,
|
|
253
|
+
**kwargs: Any,
|
|
254
|
+
) -> list[Definition[ConstantSrc]]: ...
|
|
255
|
+
|
|
256
|
+
@overload
|
|
257
|
+
def find_definitions(
|
|
258
|
+
self,
|
|
259
|
+
*,
|
|
260
|
+
kind: Literal[AtomKind.GUARD] = AtomKind.GUARD,
|
|
261
|
+
**kwargs: Any,
|
|
262
|
+
) -> list[Definition[GuardUse]]: ...
|
|
263
|
+
|
|
264
|
+
@overload
|
|
265
|
+
def find_definitions(
|
|
266
|
+
self,
|
|
267
|
+
*,
|
|
268
|
+
reg_name: int | str = ...,
|
|
269
|
+
**kwargs: Any,
|
|
270
|
+
) -> list[Definition[Register]]: ...
|
|
271
|
+
|
|
272
|
+
@overload
|
|
273
|
+
def find_definitions(self, *, stack_offset: int = ..., **kwargs: Any) -> list[Definition[MemoryLocation]]: ...
|
|
274
|
+
|
|
275
|
+
@overload
|
|
276
|
+
def find_definitions(self, *, const_val: int = ..., **kwargs: Any) -> list[Definition[ConstantSrc]]: ...
|
|
277
|
+
|
|
216
278
|
def find_definitions(self, **kwargs) -> list[Definition]:
|
|
217
279
|
"""
|
|
218
280
|
Filter the definitions present in the graph based on various criteria.
|
|
@@ -299,11 +361,6 @@ class DepGraph:
|
|
|
299
361
|
self, starts: Definition[Atom] | Iterable[Definition[Atom]], *, const_val: int = ..., **kwargs: Any
|
|
300
362
|
) -> list[Definition[ConstantSrc]]: ...
|
|
301
363
|
|
|
302
|
-
@overload
|
|
303
|
-
def find_all_predecessors(
|
|
304
|
-
self, starts: Definition[Atom] | Iterable[Definition[Atom]], **kwargs: Any
|
|
305
|
-
) -> list[Definition[Atom]]: ...
|
|
306
|
-
|
|
307
364
|
def find_all_predecessors(self, starts, **kwargs):
|
|
308
365
|
"""
|
|
309
366
|
Filter the ancestors of the given start node or nodes that match various criteria.
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
from .stdlib import LibcStdlibHandlers, EnvironAtom, SystemAtom, ExecveAtom
|
|
2
|
+
from .stdio import LibcStdioHandlers, StdoutAtom, StdinAtom
|
|
3
|
+
from .unistd import LibcUnistdHandlers
|
|
4
|
+
from .string import LibcStringHandlers
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class LibcHandlers(LibcStdlibHandlers, LibcStdioHandlers, LibcUnistdHandlers, LibcStringHandlers):
|
|
8
|
+
pass
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
__all__ = ["EnvironAtom", "SystemAtom", "ExecveAtom", "StdoutAtom", "StdinAtom", "LibcHandlers"]
|
|
@@ -19,10 +19,10 @@ _l = logging.getLogger(__name__)
|
|
|
19
19
|
|
|
20
20
|
|
|
21
21
|
class StdoutAtom(Atom):
|
|
22
|
-
def __init__(self, sink: str):
|
|
22
|
+
def __init__(self, sink: str, size: int | None):
|
|
23
23
|
self.nonce = random.randint(0, 999999999999)
|
|
24
24
|
self.sink = sink
|
|
25
|
-
super().__init__(1)
|
|
25
|
+
super().__init__(size if size is not None else 1)
|
|
26
26
|
|
|
27
27
|
def _identity(self):
|
|
28
28
|
return (self.nonce,)
|
|
@@ -32,10 +32,10 @@ class StdoutAtom(Atom):
|
|
|
32
32
|
|
|
33
33
|
|
|
34
34
|
class StdinAtom(Atom):
|
|
35
|
-
def __init__(self, source: str):
|
|
35
|
+
def __init__(self, source: str, size: int | None):
|
|
36
36
|
self.nonce = random.randint(0, 999999999999)
|
|
37
37
|
self.source = source
|
|
38
|
-
super().__init__(1)
|
|
38
|
+
super().__init__(size if size is not None else 1)
|
|
39
39
|
|
|
40
40
|
def _identity(self):
|
|
41
41
|
return (self.nonce,)
|
|
@@ -83,19 +83,19 @@ class LibcStdioHandlers(FunctionHandler):
|
|
|
83
83
|
@FunctionCallDataUnwrapped.decorate
|
|
84
84
|
def handle_impl_printf(self, state: ReachingDefinitionsState, data: FunctionCallDataUnwrapped):
|
|
85
85
|
result, source_atoms = handle_printf(state, data, 0)
|
|
86
|
-
dst_atoms = StdoutAtom("printf")
|
|
86
|
+
dst_atoms = StdoutAtom("printf", len(result) if result is not None else None)
|
|
87
87
|
data.depends(dst_atoms, source_atoms, value=result)
|
|
88
88
|
|
|
89
89
|
@FunctionCallDataUnwrapped.decorate
|
|
90
90
|
def handle_impl_dprintf(self, state: ReachingDefinitionsState, data: FunctionCallDataUnwrapped):
|
|
91
91
|
result, source_atoms = handle_printf(state, data, 1)
|
|
92
|
-
dst_atoms = StdoutAtom("dprintf")
|
|
92
|
+
dst_atoms = StdoutAtom("dprintf", len(result) if result is not None else None)
|
|
93
93
|
data.depends(dst_atoms, source_atoms, value=result)
|
|
94
94
|
|
|
95
95
|
@FunctionCallDataUnwrapped.decorate
|
|
96
96
|
def handle_impl_fprintf(self, state: ReachingDefinitionsState, data: FunctionCallDataUnwrapped):
|
|
97
97
|
result, source_atoms = handle_printf(state, data, 1)
|
|
98
|
-
dst_atoms = StdoutAtom("fprintf")
|
|
98
|
+
dst_atoms = StdoutAtom("fprintf", len(result) if result is not None else None)
|
|
99
99
|
data.depends(dst_atoms, source_atoms, value=result)
|
|
100
100
|
|
|
101
101
|
@FunctionCallDataUnwrapped.decorate
|
|
@@ -108,6 +108,8 @@ class LibcStdioHandlers(FunctionHandler):
|
|
|
108
108
|
def handle_impl_snprintf(self, state: ReachingDefinitionsState, data: FunctionCallDataUnwrapped):
|
|
109
109
|
result, source_atoms = handle_printf(state, data, 2)
|
|
110
110
|
size = state.get_concrete_value(data.args_atoms[1]) or 2
|
|
111
|
+
if result is not None:
|
|
112
|
+
size = min(size, len(result) // 8)
|
|
111
113
|
dst_atoms = state.deref(data.args_atoms[0], size=size)
|
|
112
114
|
data.depends(dst_atoms, source_atoms, value=result)
|
|
113
115
|
|
|
@@ -126,7 +128,7 @@ class LibcStdioHandlers(FunctionHandler):
|
|
|
126
128
|
|
|
127
129
|
@FunctionCallDataUnwrapped.decorate
|
|
128
130
|
def handle_impl_scanf(self, state: ReachingDefinitionsState, data: FunctionCallDataUnwrapped):
|
|
129
|
-
handle_scanf(state, data, 0, {StdinAtom("scanf")})
|
|
131
|
+
handle_scanf(state, data, 0, {StdinAtom("scanf", None)})
|
|
130
132
|
|
|
131
133
|
handle_impl___isoc99_scanf = handle_impl_scanf
|
|
132
134
|
|
|
@@ -140,13 +142,13 @@ class LibcStdioHandlers(FunctionHandler):
|
|
|
140
142
|
def handle_impl_fgets(self, state: ReachingDefinitionsState, data: FunctionCallDataUnwrapped):
|
|
141
143
|
size = state.get_concrete_value(data.args_atoms[1]) or 2
|
|
142
144
|
dst_atom = state.deref(data.args_atoms[0], size)
|
|
143
|
-
input_value = claripy.BVS("weh", 8).concat(claripy.BVV(0, 8))
|
|
144
|
-
data.depends(dst_atom, StdinAtom("fgets"), value=input_value)
|
|
145
|
+
input_value = claripy.BVS("weh", (size - 1) * 8).concat(claripy.BVV(0, 8))
|
|
146
|
+
data.depends(dst_atom, StdinAtom("fgets", size), value=input_value)
|
|
145
147
|
data.depends(data.ret_atoms, data.args_atoms[0])
|
|
146
148
|
|
|
147
149
|
@FunctionCallDataUnwrapped.decorate
|
|
148
150
|
def handle_impl_fgetc(self, state: ReachingDefinitionsState, data: FunctionCallDataUnwrapped):
|
|
149
|
-
data.depends(data.ret_atoms, StdinAtom(data.function.name))
|
|
151
|
+
data.depends(data.ret_atoms, StdinAtom(data.function.name, 1))
|
|
150
152
|
|
|
151
153
|
handle_impl_getchar = handle_impl_getc = handle_impl_fgetc
|
|
152
154
|
|
|
@@ -155,14 +157,14 @@ class LibcStdioHandlers(FunctionHandler):
|
|
|
155
157
|
size = state.get_concrete_value(data.args_atoms[1]) or 1
|
|
156
158
|
nmemb = state.get_concrete_value(data.args_atoms[1]) or 2
|
|
157
159
|
dst_atom = state.deref(data.args_atoms[0], size * nmemb)
|
|
158
|
-
data.depends(dst_atom, StdinAtom("fread"))
|
|
160
|
+
data.depends(dst_atom, StdinAtom("fread", size * nmemb))
|
|
159
161
|
|
|
160
162
|
@FunctionCallDataUnwrapped.decorate
|
|
161
163
|
def handle_impl_fwrite(self, state: ReachingDefinitionsState, data: FunctionCallDataUnwrapped):
|
|
162
164
|
size = state.get_concrete_value(data.args_atoms[1]) or 1
|
|
163
165
|
nmemb = state.get_concrete_value(data.args_atoms[1]) or 2
|
|
164
166
|
src_atom = state.deref(data.args_atoms[0], size * nmemb)
|
|
165
|
-
data.depends(StdoutAtom("fwrite"), src_atom, value=state.get_values(src_atom))
|
|
167
|
+
data.depends(StdoutAtom("fwrite", size * nmemb), src_atom, value=state.get_values(src_atom))
|
|
166
168
|
|
|
167
169
|
|
|
168
170
|
def handle_printf(
|
|
@@ -16,9 +16,9 @@ if TYPE_CHECKING:
|
|
|
16
16
|
|
|
17
17
|
|
|
18
18
|
class EnvironAtom(Atom):
|
|
19
|
-
def __init__(self, name: str | None):
|
|
19
|
+
def __init__(self, size: int, name: str | None):
|
|
20
20
|
self.name = name
|
|
21
|
-
super().__init__(
|
|
21
|
+
super().__init__(size)
|
|
22
22
|
|
|
23
23
|
def _identity(self):
|
|
24
24
|
if self.name is not None:
|
|
@@ -31,9 +31,9 @@ class EnvironAtom(Atom):
|
|
|
31
31
|
|
|
32
32
|
|
|
33
33
|
class SystemAtom(Atom):
|
|
34
|
-
def __init__(self):
|
|
34
|
+
def __init__(self, size: int = 1):
|
|
35
35
|
self.nonce = random.randint(0, 999999999999)
|
|
36
|
-
super().__init__(
|
|
36
|
+
super().__init__(size)
|
|
37
37
|
|
|
38
38
|
def _identity(self):
|
|
39
39
|
return (self.nonce,)
|
|
@@ -49,7 +49,7 @@ class ExecveAtom(Atom):
|
|
|
49
49
|
super().__init__(size)
|
|
50
50
|
|
|
51
51
|
def _identity(self):
|
|
52
|
-
return (self.nonce,)
|
|
52
|
+
return (self.nonce, self.idx)
|
|
53
53
|
|
|
54
54
|
def __repr__(self):
|
|
55
55
|
return f"<ExecveAtom {self.idx}>"
|
|
@@ -61,7 +61,10 @@ class LibcStdlibHandlers(FunctionHandler):
|
|
|
61
61
|
buf_atoms = state.deref(data.args_atoms[0], DerefSize.NULL_TERMINATE)
|
|
62
62
|
buf_value = state.get_concrete_value(buf_atoms, cast_to=bytes)
|
|
63
63
|
if buf_value is not None:
|
|
64
|
-
|
|
64
|
+
try:
|
|
65
|
+
buf_value = int(buf_value.decode().strip("\0"))
|
|
66
|
+
except ValueError:
|
|
67
|
+
buf_value = 0
|
|
65
68
|
data.depends(data.ret_atoms, buf_atoms, value=buf_value)
|
|
66
69
|
|
|
67
70
|
@FunctionCallDataUnwrapped.decorate
|
|
@@ -92,7 +95,7 @@ class LibcStdlibHandlers(FunctionHandler):
|
|
|
92
95
|
heap_ptr = state.heap_allocator.allocate(2)
|
|
93
96
|
heap_atom = state.deref(heap_ptr, 2)
|
|
94
97
|
heap_value = claripy.BVS("weh", 8).concat(claripy.BVV(0, 8))
|
|
95
|
-
data.depends(heap_atom, EnvironAtom(name_value), value=heap_value)
|
|
98
|
+
data.depends(heap_atom, EnvironAtom(2, name_value), value=heap_value)
|
|
96
99
|
data.depends(data.ret_atoms, value=state.heap_address(heap_ptr))
|
|
97
100
|
|
|
98
101
|
@FunctionCallDataUnwrapped.decorate
|
|
@@ -105,12 +108,15 @@ class LibcStdlibHandlers(FunctionHandler):
|
|
|
105
108
|
|
|
106
109
|
src_atom = state.deref(data.args_atoms[1], DerefSize.NULL_TERMINATE)
|
|
107
110
|
src_value = state.get_values(src_atom)
|
|
108
|
-
data.depends(
|
|
111
|
+
data.depends(
|
|
112
|
+
EnvironAtom(len(src_value) // 8 if src_value is not None else 1, name_value), src_atom, value=src_value
|
|
113
|
+
)
|
|
109
114
|
|
|
110
115
|
@FunctionCallDataUnwrapped.decorate
|
|
111
116
|
def handle_impl_system(self, state: ReachingDefinitionsState, data: FunctionCallDataUnwrapped):
|
|
112
117
|
buf_atom = state.deref(data.args_atoms[0], DerefSize.NULL_TERMINATE)
|
|
113
|
-
|
|
118
|
+
buf_value = state.get_values(buf_atom)
|
|
119
|
+
data.depends(SystemAtom(len(buf_value) // 8 if buf_value is not None else 1), buf_atom, value=buf_value)
|
|
114
120
|
|
|
115
121
|
handle_impl_popen = handle_impl_execl = handle_impl_system
|
|
116
122
|
|
|
@@ -131,12 +137,12 @@ class LibcStdlibHandlers(FunctionHandler):
|
|
|
131
137
|
# unknown if array continues
|
|
132
138
|
break
|
|
133
139
|
|
|
134
|
-
argv_deref_concrete = state.
|
|
140
|
+
argv_deref_concrete = state.get_one_value(argv_deref_atom)
|
|
135
141
|
if argv_deref_concrete is None:
|
|
136
142
|
# unknown if array continues
|
|
137
143
|
break
|
|
138
144
|
|
|
139
|
-
if argv_deref_concrete == 0:
|
|
145
|
+
if (argv_deref_concrete == 0).is_true():
|
|
140
146
|
# End of array
|
|
141
147
|
break
|
|
142
148
|
|
|
@@ -6,7 +6,7 @@ from angr.knowledge_plugins.key_definitions.live_definitions import DerefSize
|
|
|
6
6
|
# pylint: disable=no-self-use,missing-class-docstring,unused-argument
|
|
7
7
|
|
|
8
8
|
|
|
9
|
-
class
|
|
9
|
+
class LibcStringHandlers(FunctionHandler):
|
|
10
10
|
@FunctionCallDataUnwrapped.decorate
|
|
11
11
|
def handle_impl_strcat(self, state: ReachingDefinitionsState, data: FunctionCallDataUnwrapped):
|
|
12
12
|
src0_atom = state.deref(data.args_atoms[0], DerefSize.NULL_TERMINATE)
|
|
@@ -10,7 +10,7 @@ class LibcUnistdHandlers(FunctionHandler):
|
|
|
10
10
|
def handle_impl_read(self, state: ReachingDefinitionsState, data: FunctionCallDataUnwrapped):
|
|
11
11
|
size = state.get_concrete_value(data.args_atoms[2]) or 1
|
|
12
12
|
dst_atom = state.deref(data.args_atoms[1], size)
|
|
13
|
-
data.depends(dst_atom, StdinAtom(data.function.name))
|
|
13
|
+
data.depends(dst_atom, StdinAtom(data.function.name, size))
|
|
14
14
|
|
|
15
15
|
handle_impl_recv = handle_impl_recvfrom = handle_impl_read
|
|
16
16
|
|
|
@@ -18,6 +18,6 @@ class LibcUnistdHandlers(FunctionHandler):
|
|
|
18
18
|
def handle_impl_write(self, state: ReachingDefinitionsState, data: FunctionCallDataUnwrapped):
|
|
19
19
|
size = state.get_concrete_value(data.args_atoms[2]) or 1
|
|
20
20
|
src_atom = state.deref(data.args_atoms[1], size)
|
|
21
|
-
data.depends(StdoutAtom(data.function.name), src_atom, value=state.get_values(src_atom))
|
|
21
|
+
data.depends(StdoutAtom(data.function.name, size), src_atom, value=state.get_values(src_atom))
|
|
22
22
|
|
|
23
23
|
handle_impl_send = handle_impl_write
|
|
@@ -9,6 +9,7 @@ from angr.misc.ux import deprecated
|
|
|
9
9
|
from angr.knowledge_plugins.key_definitions.environment import Environment
|
|
10
10
|
from angr.knowledge_plugins.key_definitions.tag import Tag
|
|
11
11
|
from angr.knowledge_plugins.key_definitions.heap_address import HeapAddress
|
|
12
|
+
from angr.knowledge_plugins.key_definitions.definition import A
|
|
12
13
|
from angr.engines.light import SpOffset
|
|
13
14
|
from angr.code_location import CodeLocation
|
|
14
15
|
from ...storage.memory_mixins.paged_memory.pages.multi_values import MultiValues
|
|
@@ -90,7 +91,7 @@ class ReachingDefinitionsState:
|
|
|
90
91
|
heap_allocator: HeapAllocator = None,
|
|
91
92
|
environment: Environment = None,
|
|
92
93
|
sp_adjusted: bool = False,
|
|
93
|
-
all_definitions: set[Definition] | None = None,
|
|
94
|
+
all_definitions: set[Definition[A]] | None = None,
|
|
94
95
|
initializer: Optional["RDAStateInitializer"] = None,
|
|
95
96
|
element_limit: int = 5,
|
|
96
97
|
merge_into_tops: bool = True,
|
|
@@ -106,12 +107,12 @@ class ReachingDefinitionsState:
|
|
|
106
107
|
self._sp_adjusted: bool = sp_adjusted
|
|
107
108
|
self._element_limit: int = element_limit
|
|
108
109
|
|
|
109
|
-
self.all_definitions: set[Definition] = set() if all_definitions is None else all_definitions
|
|
110
|
+
self.all_definitions: set[Definition[A]] = set() if all_definitions is None else all_definitions
|
|
110
111
|
|
|
111
112
|
self.heap_allocator = heap_allocator or HeapAllocator(canonical_size)
|
|
112
113
|
self._environment: Environment = environment or Environment()
|
|
113
114
|
|
|
114
|
-
self.codeloc_uses: set[Definition] = set()
|
|
115
|
+
self.codeloc_uses: set[Definition[A]] = set()
|
|
115
116
|
|
|
116
117
|
# have we observed an exit statement or not during the analysis of the *last instruction* of a block? we should
|
|
117
118
|
# not perform any sp updates if it is the case. this is for handling conditional returns in ARM binaries.
|
|
@@ -189,7 +190,7 @@ class ReachingDefinitionsState:
|
|
|
189
190
|
return n - 2**self.arch.bits
|
|
190
191
|
return n
|
|
191
192
|
|
|
192
|
-
def annotate_with_def(self, symvar: claripy.ast.Base, definition: Definition) -> claripy.ast.Base:
|
|
193
|
+
def annotate_with_def(self, symvar: claripy.ast.Base, definition: Definition[A]) -> claripy.ast.Base:
|
|
193
194
|
"""
|
|
194
195
|
|
|
195
196
|
:param symvar:
|
|
@@ -198,14 +199,14 @@ class ReachingDefinitionsState:
|
|
|
198
199
|
"""
|
|
199
200
|
return self.live_definitions.annotate_with_def(symvar, definition)
|
|
200
201
|
|
|
201
|
-
def annotate_mv_with_def(self, mv: MultiValues, definition: Definition) -> MultiValues:
|
|
202
|
+
def annotate_mv_with_def(self, mv: MultiValues, definition: Definition[A]) -> MultiValues:
|
|
202
203
|
return MultiValues(
|
|
203
204
|
offset_to_values={
|
|
204
205
|
offset: {self.annotate_with_def(value, definition) for value in values} for offset, values in mv.items()
|
|
205
206
|
}
|
|
206
207
|
)
|
|
207
208
|
|
|
208
|
-
def extract_defs(self, symvar: claripy.ast.Base) -> Iterator[Definition]:
|
|
209
|
+
def extract_defs(self, symvar: claripy.ast.Base) -> Iterator[Definition[A]]:
|
|
209
210
|
yield from self.live_definitions.extract_defs(symvar)
|
|
210
211
|
|
|
211
212
|
#
|
|
@@ -364,9 +365,9 @@ class ReachingDefinitionsState:
|
|
|
364
365
|
tags: set[Tag] = None,
|
|
365
366
|
endness=None, # XXX destroy
|
|
366
367
|
annotated: bool = False,
|
|
367
|
-
uses: set[Definition] | None = None,
|
|
368
|
+
uses: set[Definition[A]] | None = None,
|
|
368
369
|
override_codeloc: CodeLocation | None = None,
|
|
369
|
-
) -> tuple[MultiValues | None, set[Definition]]:
|
|
370
|
+
) -> tuple[MultiValues | None, set[Definition[A]]]:
|
|
370
371
|
codeloc = override_codeloc or self.codeloc
|
|
371
372
|
existing_defs = self.live_definitions.get_definitions(atom)
|
|
372
373
|
mv = self.live_definitions.kill_and_add_definition(
|
|
@@ -446,7 +447,7 @@ class ReachingDefinitionsState:
|
|
|
446
447
|
self.codeloc_uses.update(self.get_definitions(atom))
|
|
447
448
|
self.live_definitions.add_use(atom, self.codeloc, expr=expr)
|
|
448
449
|
|
|
449
|
-
def add_use_by_def(self, definition: Definition, expr: Any | None = None) -> None:
|
|
450
|
+
def add_use_by_def(self, definition: Definition[A], expr: Any | None = None) -> None:
|
|
450
451
|
self.codeloc_uses.add(definition)
|
|
451
452
|
self.live_definitions.add_use_by_def(definition, self.codeloc, expr=expr)
|
|
452
453
|
|
|
@@ -455,7 +456,7 @@ class ReachingDefinitionsState:
|
|
|
455
456
|
self.add_tmp_use_by_defs(defs, expr=expr)
|
|
456
457
|
|
|
457
458
|
def add_tmp_use_by_defs(
|
|
458
|
-
self, defs: Iterable[Definition], expr: Any | None = None
|
|
459
|
+
self, defs: Iterable[Definition[A]], expr: Any | None = None
|
|
459
460
|
) -> None: # pylint:disable=unused-argument
|
|
460
461
|
for definition in defs:
|
|
461
462
|
self.codeloc_uses.add(definition)
|
|
@@ -466,7 +467,7 @@ class ReachingDefinitionsState:
|
|
|
466
467
|
defs = self.live_definitions.get_register_definitions(reg_offset, size)
|
|
467
468
|
self.add_register_use_by_defs(defs, expr=expr)
|
|
468
469
|
|
|
469
|
-
def add_register_use_by_defs(self, defs: Iterable[Definition], expr: Any | None = None) -> None:
|
|
470
|
+
def add_register_use_by_defs(self, defs: Iterable[Definition[A]], expr: Any | None = None) -> None:
|
|
470
471
|
for definition in defs:
|
|
471
472
|
self.codeloc_uses.add(definition)
|
|
472
473
|
self.live_definitions.add_register_use_by_def(definition, self.codeloc, expr=expr)
|
|
@@ -475,7 +476,7 @@ class ReachingDefinitionsState:
|
|
|
475
476
|
defs = self.live_definitions.get_stack_definitions(stack_offset, size)
|
|
476
477
|
self.add_stack_use_by_defs(defs, expr=expr)
|
|
477
478
|
|
|
478
|
-
def add_stack_use_by_defs(self, defs: Iterable[Definition], expr: Any | None = None):
|
|
479
|
+
def add_stack_use_by_defs(self, defs: Iterable[Definition[A]], expr: Any | None = None):
|
|
479
480
|
for definition in defs:
|
|
480
481
|
self.codeloc_uses.add(definition)
|
|
481
482
|
self.live_definitions.add_stack_use_by_def(definition, self.codeloc, expr=expr)
|
|
@@ -484,43 +485,39 @@ class ReachingDefinitionsState:
|
|
|
484
485
|
defs = self.live_definitions.get_heap_definitions(heap_offset, size)
|
|
485
486
|
self.add_heap_use_by_defs(defs, expr=expr)
|
|
486
487
|
|
|
487
|
-
def add_heap_use_by_defs(self, defs: Iterable[Definition], expr: Any | None = None):
|
|
488
|
+
def add_heap_use_by_defs(self, defs: Iterable[Definition[A]], expr: Any | None = None):
|
|
488
489
|
for definition in defs:
|
|
489
490
|
self.codeloc_uses.add(definition)
|
|
490
491
|
self.live_definitions.add_heap_use_by_def(definition, self.codeloc, expr=expr)
|
|
491
492
|
|
|
492
|
-
def add_memory_use_by_def(self, definition: Definition, expr: Any | None = None):
|
|
493
|
+
def add_memory_use_by_def(self, definition: Definition[A], expr: Any | None = None):
|
|
493
494
|
self.codeloc_uses.add(definition)
|
|
494
495
|
self.live_definitions.add_memory_use_by_def(definition, self.codeloc, expr=expr)
|
|
495
496
|
|
|
496
|
-
def add_memory_use_by_defs(self, defs: Iterable[Definition], expr: Any | None = None):
|
|
497
|
+
def add_memory_use_by_defs(self, defs: Iterable[Definition[A]], expr: Any | None = None):
|
|
497
498
|
for definition in defs:
|
|
498
499
|
self.codeloc_uses.add(definition)
|
|
499
500
|
self.live_definitions.add_memory_use_by_def(definition, self.codeloc, expr=expr)
|
|
500
501
|
|
|
501
|
-
def get_definitions(self, atom:
|
|
502
|
+
def get_definitions(self, atom: A | Definition[A] | Iterable[A] | Iterable[Definition[A]]) -> set[Definition[A]]:
|
|
502
503
|
return self.live_definitions.get_definitions(atom)
|
|
503
504
|
|
|
504
|
-
def get_values(self, spec:
|
|
505
|
+
def get_values(self, spec: A | Definition[A] | Iterable[A]) -> MultiValues | None:
|
|
505
506
|
return self.live_definitions.get_values(spec)
|
|
506
507
|
|
|
507
508
|
def get_one_value(
|
|
508
|
-
self, spec:
|
|
509
|
+
self, spec: A | Definition[A] | Iterable[A] | Iterable[Definition[A]], strip_annotations: bool = False
|
|
509
510
|
) -> claripy.ast.bv.BV | None:
|
|
510
511
|
return self.live_definitions.get_one_value(spec, strip_annotations=strip_annotations)
|
|
511
512
|
|
|
512
513
|
@overload
|
|
513
|
-
def get_concrete_value(
|
|
514
|
-
self, spec: Atom | Definition[Atom] | Iterable[Atom], cast_to: type[int] = ...
|
|
515
|
-
) -> int | None: ...
|
|
514
|
+
def get_concrete_value(self, spec: A | Definition[A] | Iterable[A], cast_to: type[int] = ...) -> int | None: ...
|
|
516
515
|
|
|
517
516
|
@overload
|
|
518
|
-
def get_concrete_value(
|
|
519
|
-
self, spec: Atom | Definition[Atom] | Iterable[Atom], cast_to: type[bytes] = ...
|
|
520
|
-
) -> bytes | None: ...
|
|
517
|
+
def get_concrete_value(self, spec: A | Definition[A] | Iterable[A], cast_to: type[bytes] = ...) -> bytes | None: ...
|
|
521
518
|
|
|
522
519
|
def get_concrete_value(
|
|
523
|
-
self, spec:
|
|
520
|
+
self, spec: A | Definition[A] | Iterable[A], cast_to: type[int] | type[bytes] = int
|
|
524
521
|
) -> int | bytes | None:
|
|
525
522
|
return self.live_definitions.get_concrete_value(spec, cast_to)
|
|
526
523
|
|
|
@@ -593,7 +590,7 @@ class ReachingDefinitionsState:
|
|
|
593
590
|
@overload
|
|
594
591
|
def deref(
|
|
595
592
|
self,
|
|
596
|
-
pointer: MultiValues |
|
|
593
|
+
pointer: MultiValues | A | Definition | Iterable[A] | Iterable[Definition[A]],
|
|
597
594
|
size: int | DerefSize,
|
|
598
595
|
endness: str = ...,
|
|
599
596
|
) -> set[MemoryLocation]: ...
|
|
@@ -602,10 +599,10 @@ class ReachingDefinitionsState:
|
|
|
602
599
|
self,
|
|
603
600
|
pointer: (
|
|
604
601
|
MultiValues
|
|
605
|
-
|
|
|
602
|
+
| A
|
|
606
603
|
| Definition
|
|
607
|
-
| Iterable[
|
|
608
|
-
| Iterable[Definition]
|
|
604
|
+
| Iterable[A]
|
|
605
|
+
| Iterable[Definition[A]]
|
|
609
606
|
| int
|
|
610
607
|
| claripy.ast.BV
|
|
611
608
|
| HeapAddress
|
|
@@ -563,15 +563,6 @@ class SimEngineVRVEX(
|
|
|
563
563
|
return RichR(self.state.top(expr_0.data.size()))
|
|
564
564
|
return RichR(self.state.top(expr_0.data.size()))
|
|
565
565
|
|
|
566
|
-
def _handle_Ctz(self, expr):
|
|
567
|
-
arg0 = expr.args[0]
|
|
568
|
-
expr_0 = self._expr(arg0)
|
|
569
|
-
if expr_0 is None:
|
|
570
|
-
return None
|
|
571
|
-
if self.state.is_top(expr_0.data):
|
|
572
|
-
return RichR(self.state.top(expr_0.data.size()))
|
|
573
|
-
return RichR(self.state.top(expr_0.data.size()))
|
|
574
|
-
|
|
575
566
|
_handle_CmpEQ_v = _handle_Cmp_v
|
|
576
567
|
_handle_CmpNE_v = _handle_Cmp_v
|
|
577
568
|
_handle_CmpLE_v = _handle_Cmp_v
|
angr/engines/pcode/cc.py
CHANGED
|
@@ -10,6 +10,7 @@ from ...calling_conventions import (
|
|
|
10
10
|
register_default_cc,
|
|
11
11
|
SimCCUnknown,
|
|
12
12
|
default_cc,
|
|
13
|
+
SimCCO32,
|
|
13
14
|
)
|
|
14
15
|
|
|
15
16
|
|
|
@@ -107,6 +108,7 @@ def register_pcode_arch_default_cc(arch: ArchPcode):
|
|
|
107
108
|
"PowerPC:BE:32:e200": SimCCPowerPC,
|
|
108
109
|
"PowerPC:BE:32:MPC8270": SimCCPowerPC,
|
|
109
110
|
"Xtensa:LE:32:default": SimCCXtensa,
|
|
111
|
+
"MIPS:LE:32:default": SimCCO32,
|
|
110
112
|
}
|
|
111
113
|
if arch.name in manual_cc_mapping:
|
|
112
114
|
# first attempt: manually specified mappings
|
|
@@ -14,6 +14,7 @@ from angr.misc.ux import deprecated
|
|
|
14
14
|
from angr.errors import SimMemoryMissingError, SimMemoryError
|
|
15
15
|
from angr.storage.memory_mixins import MultiValuedMemory
|
|
16
16
|
from angr.storage.memory_mixins.paged_memory.pages.multi_values import MultiValues
|
|
17
|
+
from angr.knowledge_plugins.key_definitions.definition import A
|
|
17
18
|
from angr.engines.light import SpOffset
|
|
18
19
|
from angr.code_location import CodeLocation, ExternalCodeLocation
|
|
19
20
|
from .atoms import Atom, Register, MemoryLocation, Tmp, ConstantSrc
|
|
@@ -660,7 +661,7 @@ class LiveDefinitions:
|
|
|
660
661
|
self.other_uses.add_use(definition, code_loc, expr)
|
|
661
662
|
|
|
662
663
|
def get_definitions(
|
|
663
|
-
self, thing:
|
|
664
|
+
self, thing: A | Definition[A] | Iterable[A] | Iterable[Definition[A]] | MultiValues
|
|
664
665
|
) -> set[Definition[Atom]]:
|
|
665
666
|
if isinstance(thing, MultiValues):
|
|
666
667
|
defs = set()
|
|
@@ -693,9 +694,9 @@ class LiveDefinitions:
|
|
|
693
694
|
return self.get_tmp_definitions(thing.tmp_idx)
|
|
694
695
|
else:
|
|
695
696
|
defs = set()
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
697
|
+
mv = self.others.get(thing, None)
|
|
698
|
+
if mv is not None:
|
|
699
|
+
defs |= self.get_definitions(mv)
|
|
699
700
|
return defs
|
|
700
701
|
|
|
701
702
|
def get_tmp_definitions(self, tmp_idx: int) -> set[Definition]:
|
|
@@ -749,7 +750,7 @@ class LiveDefinitions:
|
|
|
749
750
|
return LiveDefinitions.extract_defs_from_annotations(annotations)
|
|
750
751
|
|
|
751
752
|
@deprecated("get_definitions")
|
|
752
|
-
def get_definitions_from_atoms(self, atoms: Iterable[
|
|
753
|
+
def get_definitions_from_atoms(self, atoms: Iterable[A]) -> Iterable[Definition]:
|
|
753
754
|
result = set()
|
|
754
755
|
for atom in atoms:
|
|
755
756
|
result |= self.get_definitions(atom)
|
|
@@ -813,9 +814,7 @@ class LiveDefinitions:
|
|
|
813
814
|
return None
|
|
814
815
|
return r.concrete_value
|
|
815
816
|
|
|
816
|
-
def get_values(
|
|
817
|
-
self, spec: Atom | Definition[Atom] | Iterable[Atom] | Iterable[Definition[Atom]]
|
|
818
|
-
) -> MultiValues | None:
|
|
817
|
+
def get_values(self, spec: A | Definition[A] | Iterable[A] | Iterable[Definition[A]]) -> MultiValues | None:
|
|
819
818
|
if isinstance(spec, Definition):
|
|
820
819
|
atom = spec.atom
|
|
821
820
|
elif isinstance(spec, Atom):
|
|
@@ -874,7 +873,7 @@ class LiveDefinitions:
|
|
|
874
873
|
|
|
875
874
|
def get_one_value(
|
|
876
875
|
self,
|
|
877
|
-
spec:
|
|
876
|
+
spec: A | Definition[A] | Iterable[A] | Iterable[Definition[A]],
|
|
878
877
|
strip_annotations: bool = False,
|
|
879
878
|
) -> claripy.ast.bv.BV | None:
|
|
880
879
|
r = self.get_values(spec)
|
|
@@ -884,19 +883,19 @@ class LiveDefinitions:
|
|
|
884
883
|
|
|
885
884
|
@overload
|
|
886
885
|
def get_concrete_value(
|
|
887
|
-
self, spec:
|
|
886
|
+
self, spec: A | Definition[A] | Iterable[A] | Iterable[Definition[A]], cast_to: type[int] = ...
|
|
888
887
|
) -> int | None: ...
|
|
889
888
|
|
|
890
889
|
@overload
|
|
891
890
|
def get_concrete_value(
|
|
892
891
|
self,
|
|
893
|
-
spec:
|
|
892
|
+
spec: A | Definition[A] | Iterable[A] | Iterable[Definition[A]],
|
|
894
893
|
cast_to: type[bytes] = ...,
|
|
895
894
|
) -> bytes | None: ...
|
|
896
895
|
|
|
897
896
|
def get_concrete_value(
|
|
898
897
|
self,
|
|
899
|
-
spec:
|
|
898
|
+
spec: A | Definition[A] | Iterable[A] | Iterable[Definition[A]],
|
|
900
899
|
cast_to: type[int] | type[bytes] = int,
|
|
901
900
|
) -> int | bytes | None:
|
|
902
901
|
r = self.get_one_value(spec, strip_annotations=True)
|
|
@@ -983,7 +982,7 @@ class LiveDefinitions:
|
|
|
983
982
|
@overload
|
|
984
983
|
def deref(
|
|
985
984
|
self,
|
|
986
|
-
pointer: MultiValues |
|
|
985
|
+
pointer: MultiValues | A | Definition[A] | Iterable[A] | Iterable[Definition[A]],
|
|
987
986
|
size: int | DerefSize,
|
|
988
987
|
endness: archinfo.Endness = ...,
|
|
989
988
|
) -> set[MemoryLocation]: ...
|
|
@@ -266,7 +266,8 @@ class MemoryObjectSetMixin(CooperationBase):
|
|
|
266
266
|
old_size = size
|
|
267
267
|
|
|
268
268
|
size = yield mos, first_mo.base, first_mo.length
|
|
269
|
-
|
|
269
|
+
delta = min(first_mo.length - (cur_addr - first_mo.base), old_size)
|
|
270
|
+
cur_addr += delta
|
|
270
271
|
if sorted_offsets[pos] + first_mo.length <= cur_addr - addr - page_addr:
|
|
271
272
|
pos += 1
|
|
272
273
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: angr
|
|
3
|
-
Version: 9.2.
|
|
3
|
+
Version: 9.2.116
|
|
4
4
|
Summary: A multi-architecture binary analysis toolkit, with the ability to perform dynamic symbolic execution and various static analyses on binaries
|
|
5
5
|
Home-page: https://github.com/angr/angr
|
|
6
6
|
License: BSD-2-Clause
|
|
@@ -15,13 +15,13 @@ Description-Content-Type: text/markdown
|
|
|
15
15
|
License-File: LICENSE
|
|
16
16
|
Requires-Dist: CppHeaderParser
|
|
17
17
|
Requires-Dist: GitPython
|
|
18
|
-
Requires-Dist: ailment==9.2.
|
|
19
|
-
Requires-Dist: archinfo==9.2.
|
|
18
|
+
Requires-Dist: ailment==9.2.116
|
|
19
|
+
Requires-Dist: archinfo==9.2.116
|
|
20
20
|
Requires-Dist: cachetools
|
|
21
|
-
Requires-Dist: capstone==5.0.
|
|
21
|
+
Requires-Dist: capstone==5.0.2
|
|
22
22
|
Requires-Dist: cffi>=1.14.0
|
|
23
|
-
Requires-Dist: claripy==9.2.
|
|
24
|
-
Requires-Dist: cle==9.2.
|
|
23
|
+
Requires-Dist: claripy==9.2.116
|
|
24
|
+
Requires-Dist: cle==9.2.116
|
|
25
25
|
Requires-Dist: dpkt
|
|
26
26
|
Requires-Dist: itanium-demangler
|
|
27
27
|
Requires-Dist: mulpyplexer
|
|
@@ -31,7 +31,7 @@ Requires-Dist: protobuf>=3.19.0
|
|
|
31
31
|
Requires-Dist: psutil
|
|
32
32
|
Requires-Dist: pycparser>=2.18
|
|
33
33
|
Requires-Dist: pyformlang
|
|
34
|
-
Requires-Dist: pyvex==9.2.
|
|
34
|
+
Requires-Dist: pyvex==9.2.116
|
|
35
35
|
Requires-Dist: rich>=13.1.0
|
|
36
36
|
Requires-Dist: rpyc
|
|
37
37
|
Requires-Dist: sortedcontainers
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
angr/__init__.py,sha256=
|
|
2
|
-
angr/__main__.py,sha256=
|
|
1
|
+
angr/__init__.py,sha256=Gqti6Jpeux5trHTnayZ68afJ6dbMblbYvPeNzHVyF4o,3708
|
|
2
|
+
angr/__main__.py,sha256=r_0MUFPLo4SOr0ejkF194aKdfRFivsbB9EIOiqVaIHQ,1921
|
|
3
3
|
angr/annocfg.py,sha256=1tnBfxgLJh9I6Brm1JDdsWLHGmCQYdD6PTC_bFTOMrg,10775
|
|
4
4
|
angr/blade.py,sha256=B8QXVQ93jz1YCIlb-dZLeBqYmVFdMXI5GleP1Wnxjrw,15519
|
|
5
5
|
angr/block.py,sha256=tHxXlBBFrPZbp5phhTn63K55khjDIIUSNJgFn4lPd9I,14761
|
|
@@ -144,7 +144,7 @@ angr/analyses/decompiler/optimization_passes/return_duplicator_base.py,sha256=Nj
|
|
|
144
144
|
angr/analyses/decompiler/optimization_passes/return_duplicator_high.py,sha256=Cc7AA_Yi-zghlvJO90zZZjTkEo3o0jsAEhHthaOT1gY,1925
|
|
145
145
|
angr/analyses/decompiler/optimization_passes/return_duplicator_low.py,sha256=3RRwzrekCnGJjf5lv7OBajHVb5zo9HNuIVFTEIkSkBg,9783
|
|
146
146
|
angr/analyses/decompiler/optimization_passes/spilled_register_finder.py,sha256=YTRlIfcooZnTaYRN6FNJ60uBqRNH4rFcgkp1_QJCdXY,552
|
|
147
|
-
angr/analyses/decompiler/optimization_passes/stack_canary_simplifier.py,sha256=
|
|
147
|
+
angr/analyses/decompiler/optimization_passes/stack_canary_simplifier.py,sha256=cXnKp8Of3q6GxvSpBGRcadrvs00j0NDRFtTEWPCYc0Q,12615
|
|
148
148
|
angr/analyses/decompiler/optimization_passes/switch_default_case_duplicator.py,sha256=U9XIMXWYI_UHTamKHdjdXP4QVBvi386SSI0f2KoHu3I,4523
|
|
149
149
|
angr/analyses/decompiler/optimization_passes/win_stack_canary_simplifier.py,sha256=NVQH6WRUqVRLLDtu8gxgxmEI7Ro1Y6VD0hjFufsK4Aw,12275
|
|
150
150
|
angr/analyses/decompiler/optimization_passes/x86_gcc_getpc_simplifier.py,sha256=7Dc-RtZZiK-jCrcjAMtZhqB9b8pHS0vtRAx-k5u3u1M,3054
|
|
@@ -208,16 +208,16 @@ angr/analyses/decompiler/region_simplifiers/switch_cluster_simplifier.py,sha256=
|
|
|
208
208
|
angr/analyses/decompiler/region_simplifiers/switch_expr_simplifier.py,sha256=HGIiC6c3C91VfcqxUHe9aTsRohwmMXOHZH_G_dbwwx4,3327
|
|
209
209
|
angr/analyses/decompiler/structured_codegen/__init__.py,sha256=NLEvs8xnJwJiUgX8AmgS7rtFFW4SxtQcA1AjzE-GryA,313
|
|
210
210
|
angr/analyses/decompiler/structured_codegen/base.py,sha256=TdghqAsAkjZpPfzFarh8Wn1zfBYMFcMsBZhRqXgoPNo,3778
|
|
211
|
-
angr/analyses/decompiler/structured_codegen/c.py,sha256=
|
|
211
|
+
angr/analyses/decompiler/structured_codegen/c.py,sha256=ruJFOkWX8OOHbjGsJK9WAMNm-ySJHsAImVXulgiBICM,135250
|
|
212
212
|
angr/analyses/decompiler/structured_codegen/dummy.py,sha256=IVfmtcWpTgNCRVsuW3GdQgDnuPmvodX85V0bBYtF_BI,535
|
|
213
213
|
angr/analyses/decompiler/structured_codegen/dwarf_import.py,sha256=TMz65TkF_ID_Ipocj0aFDb84H6slolN90wq0tzhY2Rk,6773
|
|
214
214
|
angr/analyses/decompiler/structuring/__init__.py,sha256=-Gwtu4VQQZpt-SSQwVQzMCOYcYYT-ofaMAvBWtEpsrI,510
|
|
215
|
-
angr/analyses/decompiler/structuring/dream.py,sha256=
|
|
216
|
-
angr/analyses/decompiler/structuring/phoenix.py,sha256=
|
|
215
|
+
angr/analyses/decompiler/structuring/dream.py,sha256=29vU_n7biP45xRS1RkjbLG5Q4KOWEGmBwJf60Mk1lT8,48347
|
|
216
|
+
angr/analyses/decompiler/structuring/phoenix.py,sha256=wCbsLiPPqZIy6PDF1uZ_0ZefDcr1Uplsu2f_hMfXbNE,120724
|
|
217
217
|
angr/analyses/decompiler/structuring/recursive_structurer.py,sha256=XhQltVVA0Ljq2zzrPdO8ea8p9Fb1Guj__NGtiycGoXs,6913
|
|
218
218
|
angr/analyses/decompiler/structuring/sailr.py,sha256=oNxug0StTZyN8dERczpW0hIAYHhSaHCosI0shmks9Uw,5661
|
|
219
|
-
angr/analyses/decompiler/structuring/structurer_base.py,sha256=
|
|
220
|
-
angr/analyses/decompiler/structuring/structurer_nodes.py,sha256=
|
|
219
|
+
angr/analyses/decompiler/structuring/structurer_base.py,sha256=GAIUCA8vbOhqZgIiJqkzTtCiDkRvieWdCcu2QuRP3JI,41134
|
|
220
|
+
angr/analyses/decompiler/structuring/structurer_nodes.py,sha256=3O-lZ2y7Wr-_ZqlNqAE7xr3CjF9OLDacz8YpRjx1rOo,11933
|
|
221
221
|
angr/analyses/forward_analysis/__init__.py,sha256=0TNlM4hbX1KRMyUduqU_zEwbnVcuNX2A1mtVuM3KexY,144
|
|
222
222
|
angr/analyses/forward_analysis/forward_analysis.py,sha256=lNbW4MPitXrudNOV-qWHwMGwMyUJ_u0Y6qq21eoXBO0,19914
|
|
223
223
|
angr/analyses/forward_analysis/job_info.py,sha256=5TkrqLwNWzx0ckxYm1QTV2SXzJXrP2QHcpDWl1_eCmM,1579
|
|
@@ -269,21 +269,21 @@ angr/analyses/propagator/values.py,sha256=b8zg2VIPJoZj4qtF3_XRfoxA7LjXxO9OIkqZ3y
|
|
|
269
269
|
angr/analyses/propagator/vex_vars.py,sha256=O0W7GekEZIVwiNiOdyu-BuxCZmHFZPh_ho7jmbnYAwk,1433
|
|
270
270
|
angr/analyses/reaching_definitions/__init__.py,sha256=RDKtWljJCGI8dJd7d1Cz71c1d8z1y1LOxUjkbikR3SM,1986
|
|
271
271
|
angr/analyses/reaching_definitions/call_trace.py,sha256=YtARhVge7scV86niB8OvNDlv_HTOijHKVZWdl43FYG0,2175
|
|
272
|
-
angr/analyses/reaching_definitions/dep_graph.py,sha256=
|
|
272
|
+
angr/analyses/reaching_definitions/dep_graph.py,sha256=FCqv8zEXcfAEg00BFB0m8UDNvFL3nm7QAO-hEgtwTV4,16070
|
|
273
273
|
angr/analyses/reaching_definitions/engine_ail.py,sha256=ttWBhRhu5b3emY-0zLgNGlRd4p2Q9Tf8ZiWgsZfWeIo,46190
|
|
274
274
|
angr/analyses/reaching_definitions/engine_vex.py,sha256=v9nxvAnmjpwtancu0b-i_vwmOdl4zmjHGGMQv3rgros,43115
|
|
275
275
|
angr/analyses/reaching_definitions/external_codeloc.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
276
276
|
angr/analyses/reaching_definitions/function_handler.py,sha256=cH1kCdwpJ2KlHmUGTPtg6TomZcTm6YL3ntIMSeMCY2A,28114
|
|
277
277
|
angr/analyses/reaching_definitions/heap_allocator.py,sha256=DkzDT8_YIE0m9CBFsC3GRxNQM5GCBAYXZpnDRZtezSo,2591
|
|
278
278
|
angr/analyses/reaching_definitions/rd_initializer.py,sha256=zWjK7RZ4EJlIs-6dqZR7OY18TynfA0lOd1ipEi4kSe4,11183
|
|
279
|
-
angr/analyses/reaching_definitions/rd_state.py,sha256
|
|
279
|
+
angr/analyses/reaching_definitions/rd_state.py,sha256=B3KGPZWzl1GhQrwN_6v5ms40OdawuVq493A-9elUEj4,24012
|
|
280
280
|
angr/analyses/reaching_definitions/reaching_definitions.py,sha256=u0ZOHh2yBZckMbIMyJTlMsoIBchb0iU_kVphyUHkZCc,24352
|
|
281
281
|
angr/analyses/reaching_definitions/subject.py,sha256=f3Gjg6Q0qCwtL443ctdVB_F1_sbGchftdjTqX6qsnbo,1958
|
|
282
|
-
angr/analyses/reaching_definitions/function_handler_library/__init__.py,sha256=
|
|
283
|
-
angr/analyses/reaching_definitions/function_handler_library/stdio.py,sha256=
|
|
284
|
-
angr/analyses/reaching_definitions/function_handler_library/stdlib.py,sha256=
|
|
285
|
-
angr/analyses/reaching_definitions/function_handler_library/string.py,sha256=
|
|
286
|
-
angr/analyses/reaching_definitions/function_handler_library/unistd.py,sha256=
|
|
282
|
+
angr/analyses/reaching_definitions/function_handler_library/__init__.py,sha256=Ha7Ygiv_BhwT2ipNc3KaejqC5ZiKw7c-VzeH9qEa4eQ,423
|
|
283
|
+
angr/analyses/reaching_definitions/function_handler_library/stdio.py,sha256=8Rl7jiLd6C10t3m5qqGLVj-LrZ9Beuo2Au9R8e-Thlc,11122
|
|
284
|
+
angr/analyses/reaching_definitions/function_handler_library/stdlib.py,sha256=c41rgr6BmTUYkg91AuyIxfBdFA_xmAeJghFXjP3yscA,6444
|
|
285
|
+
angr/analyses/reaching_definitions/function_handler_library/string.py,sha256=PFwAivLrpcERRQtZun43tZmBpsIc5D0OOo9US9TMEN0,5060
|
|
286
|
+
angr/analyses/reaching_definitions/function_handler_library/unistd.py,sha256=KXpgC9fVl43T-CoIvhOmwbySuQLHc76v2MmHQgRqSmc,1203
|
|
287
287
|
angr/analyses/typehoon/__init__.py,sha256=kCQMAuvsUKAdYFiOstBzMBCqpquJKJCQSe0CGAr2Rng,31
|
|
288
288
|
angr/analyses/typehoon/dfa.py,sha256=Q1sR1RDmt7pmMJjFByco9grbr2qm92HihnB9qJmerSo,3488
|
|
289
289
|
angr/analyses/typehoon/lifter.py,sha256=3RogUtd8O6txb7_UAjbI7Bn1hc38oP_LsRYyBsPsEzg,2805
|
|
@@ -297,7 +297,7 @@ angr/analyses/variable_recovery/__init__.py,sha256=j2SZyfzCAagqNTj0IcYJtOx4b3oAv
|
|
|
297
297
|
angr/analyses/variable_recovery/annotations.py,sha256=eAifcWVmb1xUmEGtpiy8PzIupSuZtmEDEiUav-3_z20,1403
|
|
298
298
|
angr/analyses/variable_recovery/engine_ail.py,sha256=F1vC5xuXfe_tGI0a3zDwGEbjPimVGitoUQ031AWDzXg,25694
|
|
299
299
|
angr/analyses/variable_recovery/engine_base.py,sha256=HVCtyY4tgx8cjHyP1aPoCCgW5771L_vpCAf83qF9qFY,41707
|
|
300
|
-
angr/analyses/variable_recovery/engine_vex.py,sha256=
|
|
300
|
+
angr/analyses/variable_recovery/engine_vex.py,sha256=hUcunLk8YazEUQlAFuF3VOmsJgjbBPQM95s8F47NNq8,18907
|
|
301
301
|
angr/analyses/variable_recovery/irsb_scanner.py,sha256=IZVaL_axfPBcM_MvjIOXwICK3otK3B5AIbwjhVscylc,4878
|
|
302
302
|
angr/analyses/variable_recovery/variable_recovery.py,sha256=-chYezAPEMrgwu_w3pBv_uzGnJb1wi3zsa1DLPdTya8,21777
|
|
303
303
|
angr/analyses/variable_recovery/variable_recovery_base.py,sha256=EhqACAQwd6qKWC19-kbTvXEio3k9JNc3cyYg4MLHebw,14962
|
|
@@ -348,7 +348,7 @@ angr/engines/light/data.py,sha256=jZBAJxor2zg5m4s63joSrjUs8H-OeHBZiqZmc3dqEQQ,23
|
|
|
348
348
|
angr/engines/light/engine.py,sha256=4JNJO9kOkINMRwEyRpKKotXPEzMBJrExJk3Nr1CeRNE,45469
|
|
349
349
|
angr/engines/pcode/__init__.py,sha256=UwMEwXQvHXIIgedJn2ZOvBBEgfHg2rfREBSpcTSXCZ4,83
|
|
350
350
|
angr/engines/pcode/behavior.py,sha256=BuzA_nX_ebuFiGgup7aJ-bgD9KmUR2dPSGUM51MKxOM,29290
|
|
351
|
-
angr/engines/pcode/cc.py,sha256=
|
|
351
|
+
angr/engines/pcode/cc.py,sha256=0VR09dC2nRQPQ5pj0ExaiViaKAdSGbYtHz5jzywrtKQ,3143
|
|
352
352
|
angr/engines/pcode/emulate.py,sha256=l4MUuUEJDcCihfKCy5_4S6GOG_rzd1DdYzTQ1ObZdgI,16715
|
|
353
353
|
angr/engines/pcode/engine.py,sha256=WTiIXZ8moilS4BHU-nQSgMopOstLnuoTjXWHpLOKF98,10532
|
|
354
354
|
angr/engines/pcode/lifter.py,sha256=4y8kAIlqtb5xVL4gyyXZe74vTUXn9Bp6oMdOM_wNrWI,51942
|
|
@@ -474,7 +474,7 @@ angr/knowledge_plugins/key_definitions/definition.py,sha256=o0L7NZIAHPAbwxNiY7zI
|
|
|
474
474
|
angr/knowledge_plugins/key_definitions/environment.py,sha256=d1oRytninRakOwdoif4szyvyLIQyhEHYVBfVt4mRCdQ,3845
|
|
475
475
|
angr/knowledge_plugins/key_definitions/heap_address.py,sha256=gpHyXvuTz3udaw83DZ5ZGLnDwqZ3EmdMtykPS3mrfXo,890
|
|
476
476
|
angr/knowledge_plugins/key_definitions/key_definition_manager.py,sha256=N8RvK6WqksoB1frFM404Ea_CyyumNrjVao2bwPOgsTc,3272
|
|
477
|
-
angr/knowledge_plugins/key_definitions/live_definitions.py,sha256=
|
|
477
|
+
angr/knowledge_plugins/key_definitions/live_definitions.py,sha256=lYMIKbXthuQbz8f_oQpM_hWucd5qShkPbBNE0X2H0vE,40535
|
|
478
478
|
angr/knowledge_plugins/key_definitions/liveness.py,sha256=uC4N-8uPoYH_RdAWVUtA3aNuMVY5NQnpGp51VWP6BNU,7101
|
|
479
479
|
angr/knowledge_plugins/key_definitions/rd_model.py,sha256=NC4yg3FDO_0hDON1c7loBVl3BGefbDKrT8W0YtB6U-k,7249
|
|
480
480
|
angr/knowledge_plugins/key_definitions/tag.py,sha256=uBHlS71E3Ok_6V3K8NkMblctCrnAHmPYikaFTA02PyA,1682
|
|
@@ -1265,7 +1265,7 @@ angr/storage/memory_mixins/paged_memory/paged_memory_multivalue_mixin.py,sha256=
|
|
|
1265
1265
|
angr/storage/memory_mixins/paged_memory/privileged_mixin.py,sha256=Ls_QhPLKudESInlAhUR1GVeacJNTciz9E2DX-LatAZ4,1541
|
|
1266
1266
|
angr/storage/memory_mixins/paged_memory/stack_allocation_mixin.py,sha256=Fg_KtS7GiI6TLfBKoRAOiz4z-M9ZkcvT9UwCkAp9-rY,3283
|
|
1267
1267
|
angr/storage/memory_mixins/paged_memory/pages/__init__.py,sha256=rwGAcESljLORCDteXXJ0cJCFkaqymoxm8kziKLB3DFw,1469
|
|
1268
|
-
angr/storage/memory_mixins/paged_memory/pages/cooperation.py,sha256=
|
|
1268
|
+
angr/storage/memory_mixins/paged_memory/pages/cooperation.py,sha256=yqT8BDG8uJWLetwhu4wiS4Kr8yD5W6qzi0dl9PDS0OA,12785
|
|
1269
1269
|
angr/storage/memory_mixins/paged_memory/pages/history_tracking_mixin.py,sha256=P5ORlm26_7v--hNcxDwLzZGTRwcLcaHzKModa5yoUPA,3003
|
|
1270
1270
|
angr/storage/memory_mixins/paged_memory/pages/ispo_mixin.py,sha256=mHt5nQYXkXifwGT0_UGvKirECEC2v7jNNtf_6oY57uI,2050
|
|
1271
1271
|
angr/storage/memory_mixins/paged_memory/pages/list_page.py,sha256=FJhqPdF0fFkktIfUKaVZoDxD5jW7qwugn6US2yctcrc,14584
|
|
@@ -1302,9 +1302,9 @@ angr/utils/orderedset.py,sha256=6SRZz6PkOVavOzlUd2cIiqZQyWtKO72F2he_cG0aP9Q,1943
|
|
|
1302
1302
|
angr/utils/segment_list.py,sha256=5nnuVtdZk9NS2y_xUBVA9khWPueP_zagNtPSjaoMHbA,20410
|
|
1303
1303
|
angr/utils/timing.py,sha256=uOowCP8kotDrKDOjlAod-guBuYkAA8zEtiAwpdwMlIU,1334
|
|
1304
1304
|
angr/utils/typing.py,sha256=pCjA7JZAzcvrk-iyIE2cRHc1G66AMSGEON3aFfjtPVc,431
|
|
1305
|
-
angr-9.2.
|
|
1306
|
-
angr-9.2.
|
|
1307
|
-
angr-9.2.
|
|
1308
|
-
angr-9.2.
|
|
1309
|
-
angr-9.2.
|
|
1310
|
-
angr-9.2.
|
|
1305
|
+
angr-9.2.116.dist-info/LICENSE,sha256=cgL_ho5B1NH8UxwtBuqThRWdjear8b7hktycaS1sz6g,1327
|
|
1306
|
+
angr-9.2.116.dist-info/METADATA,sha256=oq0bcCV9TIJiAC8D2U7PtYkubT4NnIiGSGb4oWGws_I,4670
|
|
1307
|
+
angr-9.2.116.dist-info/WHEEL,sha256=VYshG4KRI6vto8ve-vqaQBMiFUCQ7Sdi3sM1A9fN-f4,109
|
|
1308
|
+
angr-9.2.116.dist-info/entry_points.txt,sha256=Vjh1C8PMyr5dZFMnik5WkEP01Uwr2T73I3a6N32sgQU,44
|
|
1309
|
+
angr-9.2.116.dist-info/top_level.txt,sha256=dKw0KWTbwLXytFvv15oAAG4sUs3ey47tt6DorJG9-hw,5
|
|
1310
|
+
angr-9.2.116.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|