angr 9.2.144__py3-none-macosx_10_9_x86_64.whl → 9.2.146__py3-none-macosx_10_9_x86_64.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 CHANGED
@@ -2,7 +2,7 @@
2
2
  # pylint: disable=wrong-import-position
3
3
  from __future__ import annotations
4
4
 
5
- __version__ = "9.2.144"
5
+ __version__ = "9.2.146"
6
6
 
7
7
  if bytes is str:
8
8
  raise Exception(
@@ -1540,6 +1540,19 @@ class CFGFast(ForwardAnalysis[CFGNode, CFGNode, CFGJob, int], CFGBase): # pylin
1540
1540
  }:
1541
1541
  func.info["is_alloca_probe"] = True
1542
1542
 
1543
+ elif self.project.arch.name == "X86":
1544
+ # determine if the function is __alloca_probe
1545
+ func = self.kb.functions.get_by_addr(func_addr) if self.kb.functions.contains_addr(func_addr) else None
1546
+ if func is not None and len(func.block_addrs_set) == 4:
1547
+ block_bytes = {func.get_block(block_addr).bytes for block_addr in func.block_addrs_set}
1548
+ if block_bytes == {
1549
+ b"-\x00\x10\x00\x00\x85\x00\xeb\xe9",
1550
+ b";\xc8r\n",
1551
+ b"Q\x8dL$\x04+\xc8\x1b\xc0\xf7\xd0#\xc8\x8b\xc4%\x00\xf0\xff\xff;\xc8r\n",
1552
+ b"\x8b\xc1Y\x94\x8b\x00\x89\x04$\xc3",
1553
+ }:
1554
+ func.info["is_alloca_probe"] = True
1555
+
1543
1556
  if self._collect_data_ref and self.project is not None and ":" in self.project.arch.name:
1544
1557
  # this is a pcode arch - use Clinic to recover data references
1545
1558
 
@@ -1829,7 +1842,7 @@ class CFGFast(ForwardAnalysis[CFGNode, CFGNode, CFGJob, int], CFGBase): # pylin
1829
1842
 
1830
1843
  if (
1831
1844
  self.project.simos is not None
1832
- and self.project.arch.name == "AMD64"
1845
+ and self.project.arch.name in {"X86", "AMD64"}
1833
1846
  and self.project.simos.name == "Win32"
1834
1847
  and isinstance(self.project.loader.main_object, cle.PE)
1835
1848
  ):
@@ -2951,7 +2951,7 @@ class Clinic(Analysis):
2951
2951
  if self.project.kb.functions.contains_addr(last_stmt.target.value)
2952
2952
  else None
2953
2953
  )
2954
- if func is not None and func.name == "__chkstk":
2954
+ if func is not None and (func.name == "__chkstk" or func.info.get("is_alloca_probe", False) is True):
2955
2955
  # get rid of this call
2956
2956
  node.statements = node.statements[:-1]
2957
2957
  if self.project.arch.call_pushes_ret and node.statements:
@@ -312,7 +312,15 @@ class SimplifierAILEngine(
312
312
  return expr
313
313
 
314
314
  def _handle_expr_ITE(self, expr):
315
- return expr
315
+ return ailment.expression.ITE(
316
+ expr.idx,
317
+ self._expr(expr.cond),
318
+ self._expr(expr.iffalse),
319
+ self._expr(expr.iftrue),
320
+ variable=expr.variable,
321
+ variable_offset=expr.variable_offset,
322
+ **expr.tags,
323
+ )
316
324
 
317
325
  def _handle_expr_Call(self, expr):
318
326
  return expr
@@ -110,8 +110,11 @@ class WinStackCanarySimplifier(OptimizationPass):
110
110
  _l.debug("Cannot find the statement calling _security_check_cookie() in the predecessor.")
111
111
  continue
112
112
 
113
- # TODO: Support x86
114
- canary_storing_stmt_idx = self._find_amd64_canary_storing_stmt(pred, store_offset)
113
+ canary_storing_stmt_idx = (
114
+ self._find_amd64_canary_storing_stmt(pred, store_offset)
115
+ if self.project.arch.name == "AMD64"
116
+ else self._find_x86_canary_storing_stmt(pred, store_offset)
117
+ )
115
118
  if canary_storing_stmt_idx is None:
116
119
  _l.debug("Cannot find the canary check statement in the predecessor.")
117
120
  continue
@@ -270,6 +273,59 @@ class WinStackCanarySimplifier(OptimizationPass):
270
273
  return idx
271
274
  return None
272
275
 
276
+ def _find_x86_canary_storing_stmt(self, block, canary_value_stack_offset):
277
+ load_stmt_idx = None
278
+
279
+ for idx, stmt in enumerate(block.statements):
280
+ # when we are lucky, we have one instruction
281
+ if (
282
+ (
283
+ isinstance(stmt, ailment.Stmt.Assignment)
284
+ and isinstance(stmt.dst, ailment.Expr.VirtualVariable)
285
+ and stmt.dst.was_reg
286
+ and stmt.dst.reg_offset == self.project.arch.registers["eax"][0]
287
+ )
288
+ and isinstance(stmt.src, ailment.Expr.BinaryOp)
289
+ and stmt.src.op == "Xor"
290
+ ):
291
+ op0, op1 = stmt.src.operands
292
+ if (
293
+ isinstance(op0, ailment.Expr.Load)
294
+ and isinstance(op0.addr, ailment.Expr.StackBaseOffset)
295
+ and op0.addr.offset == canary_value_stack_offset
296
+ ) and isinstance(op1, ailment.Expr.StackBaseOffset):
297
+ # found it
298
+ return idx
299
+ # or when we are unlucky, we have two instructions...
300
+ if (
301
+ isinstance(stmt, ailment.Stmt.Assignment)
302
+ and isinstance(stmt.dst, ailment.Expr.VirtualVariable)
303
+ and stmt.dst.reg_offset == self.project.arch.registers["eax"][0]
304
+ and isinstance(stmt.src, ailment.Expr.Load)
305
+ and isinstance(stmt.src.addr, ailment.Expr.StackBaseOffset)
306
+ and stmt.src.addr.offset == canary_value_stack_offset
307
+ ):
308
+ load_stmt_idx = idx
309
+ if (
310
+ load_stmt_idx is not None
311
+ and idx >= load_stmt_idx + 1
312
+ and (
313
+ isinstance(stmt, ailment.Stmt.Assignment)
314
+ and isinstance(stmt.dst, ailment.Expr.VirtualVariable)
315
+ and stmt.dst.was_reg
316
+ and isinstance(stmt.src, ailment.Expr.BinaryOp)
317
+ and stmt.src.op == "Xor"
318
+ )
319
+ and (
320
+ isinstance(stmt.src.operands[0], ailment.Expr.VirtualVariable)
321
+ and stmt.src.operands[0].was_reg
322
+ and stmt.src.operands[0].reg_offset == self.project.arch.registers["eax"][0]
323
+ and isinstance(stmt.src.operands[1], ailment.Expr.StackBaseOffset)
324
+ )
325
+ ):
326
+ return idx
327
+ return None
328
+
273
329
  @staticmethod
274
330
  def _find_return_addr_storing_stmt(block):
275
331
  for idx, stmt in enumerate(block.statements):
@@ -222,6 +222,17 @@ class EagerEvaluation(PeepholeOptimizationExprBase):
222
222
  )
223
223
  return BinaryOp(expr.idx, "Div", (mul, new_const_0), expr.signed, bits=expr.bits, **expr.tags)
224
224
 
225
+ elif expr.op == "Mod":
226
+ op0, op1 = expr.operands
227
+ if (
228
+ isinstance(op0, Const)
229
+ and isinstance(op0.value, int)
230
+ and isinstance(op1, Const)
231
+ and isinstance(op1.value, int)
232
+ and op1.value != 0
233
+ ):
234
+ return Const(expr.idx, None, op0.value % op1.value, expr.bits, **expr.tags)
235
+
225
236
  elif expr.op in {"Shr", "Sar"} and isinstance(expr.operands[1], Const):
226
237
  expr0, expr1 = expr.operands
227
238
  if isinstance(expr0, BinaryOp) and expr0.op == "Shr" and isinstance(expr0.operands[1], Const):
@@ -145,7 +145,7 @@ class Ssailification(Analysis): # pylint:disable=abstract-method
145
145
  stackvar_locs = {}
146
146
  sorted_stackvar_offs = []
147
147
 
148
- # computer phi node locations for each unified definition
148
+ # compute phi node locations for each unified definition
149
149
  udef_to_defs = defaultdict(set)
150
150
  udef_to_blockkeys = defaultdict(set)
151
151
  for def_, loc in def_to_loc:
@@ -15,6 +15,7 @@ from angr.analyses import AnalysesHub
15
15
  from angr.knowledge_plugins import Function
16
16
  from angr.block import BlockNode
17
17
  from angr.errors import SimTranslationError
18
+ from angr.calling_conventions import SimStackArg
18
19
  from .analysis import Analysis
19
20
 
20
21
  try:
@@ -554,7 +555,7 @@ class StackPointerTracker(Analysis, ForwardAnalysis):
554
555
  if vex_block is not None:
555
556
  if isinstance(vex_block, pyvex.IRSB):
556
557
  curr_stmt_start_addr = self._process_vex_irsb(node, vex_block, state)
557
- elif pypcode is not None and isinstance(vex_block, pcode.lifter.IRSB):
558
+ elif pypcode is not None and isinstance(vex_block, pcode.lifter.IRSB): # type: ignore
558
559
  curr_stmt_start_addr = self._process_pcode_irsb(node, vex_block, state)
559
560
  else:
560
561
  raise NotImplementedError(f"Unsupported block type {type(vex_block)}")
@@ -587,7 +588,7 @@ class StackPointerTracker(Analysis, ForwardAnalysis):
587
588
  raise CouldNotResolveException
588
589
  if arg1_expr is BOTTOM:
589
590
  return BOTTOM
590
- return arg0_expr + arg1_expr
591
+ return arg0_expr + arg1_expr # type: ignore
591
592
  if expr.op.startswith("Iop_Sub"):
592
593
  arg0_expr = _resolve_expr(arg0)
593
594
  if arg0_expr is None:
@@ -599,7 +600,7 @@ class StackPointerTracker(Analysis, ForwardAnalysis):
599
600
  raise CouldNotResolveException
600
601
  if arg1_expr is BOTTOM:
601
602
  return BOTTOM
602
- return arg0_expr - arg1_expr
603
+ return arg0_expr - arg1_expr # type: ignore
603
604
  if expr.op.startswith("Iop_And"):
604
605
  # handle stack pointer alignments
605
606
  arg0_expr = _resolve_expr(arg0)
@@ -713,43 +714,78 @@ class StackPointerTracker(Analysis, ForwardAnalysis):
713
714
  pass
714
715
  # who are we calling?
715
716
  callees = [] if self._func is None else self._find_callees(node)
717
+ sp_adjusted = False
716
718
  if callees:
717
719
  if len(callees) == 1:
720
+
718
721
  callee = callees[0]
719
- track_rax = False
720
- if (
721
- (callee.info.get("is_rust_probestack", False) and self.project.arch.name == "AMD64")
722
- or (callee.info.get("is_alloca_probe", False) and self.project.arch.name == "AMD64")
723
- or callee.name == "__chkstk"
724
- ):
725
- # sp = sp - rax right after returning from the call
726
- track_rax = True
727
-
728
- if track_rax:
729
- for stmt in reversed(vex_block.statements):
730
- if (
731
- isinstance(stmt, pyvex.IRStmt.Put)
732
- and stmt.offset == self.project.arch.registers["rax"][0]
733
- and isinstance(stmt.data, pyvex.IRExpr.Const)
734
- ):
735
- state.put(stmt.offset, Constant(stmt.data.con.value), force=True)
736
- break
722
+ if callee.info.get("is_rust_probestack", False):
723
+ # sp = sp - rax/eax right after returning from the call
724
+ rust_probe_stack_rax_regname: str | None = None
725
+ if self.project.arch.name == "AMD64":
726
+ rust_probe_stack_rax_regname = "rax"
727
+ elif self.project.arch.name == "X86":
728
+ rust_probe_stack_rax_regname = "eax"
729
+
730
+ if rust_probe_stack_rax_regname is not None:
731
+ for stmt in reversed(vex_block.statements):
732
+ if (
733
+ isinstance(stmt, pyvex.IRStmt.Put)
734
+ and stmt.offset == self.project.arch.registers[rust_probe_stack_rax_regname][0]
735
+ and isinstance(stmt.data, pyvex.IRExpr.Const)
736
+ ):
737
+ sp_adjusted = True
738
+ state.put(stmt.offset, Constant(stmt.data.con.value), force=True)
739
+ break
740
+
741
+ if not sp_adjusted and (callee.info.get("is_alloca_probe", False) or callee.name == "__chkstk"):
742
+ # sp = sp - rax, but it's adjusted within the callee
743
+ chkstk_stack_rax_regname: str | None = None
744
+ if self.project.arch.name == "AMD64":
745
+ chkstk_stack_rax_regname = "rax"
746
+ elif self.project.arch.name == "X86":
747
+ chkstk_stack_rax_regname = "eax"
748
+
749
+ if chkstk_stack_rax_regname is not None:
750
+ for stmt in reversed(vex_block.statements):
751
+ if (
752
+ isinstance(stmt, pyvex.IRStmt.Put)
753
+ and stmt.offset == self.project.arch.registers[chkstk_stack_rax_regname][0]
754
+ and isinstance(stmt.data, pyvex.IRExpr.Const)
755
+ and self.project.arch.sp_offset in state.regs
756
+ ):
757
+ sp_adjusted = True
758
+ sp_v = state.regs[self.project.arch.sp_offset]
759
+ sp_v -= Constant(stmt.data.con.value)
760
+ state.put(self.project.arch.sp_offset, sp_v, force=True)
761
+ break
737
762
 
738
763
  callee_cleanups = [
739
764
  callee
740
765
  for callee in callees
741
- if callee.calling_convention is not None and callee.calling_convention.CALLEE_CLEANUP
766
+ if callee.calling_convention is not None
767
+ and callee.calling_convention.CALLEE_CLEANUP
768
+ and callee.prototype is not None
742
769
  ]
743
770
  if callee_cleanups:
744
771
  # found callee clean-up cases...
772
+ callee = callee_cleanups[0]
773
+ assert callee.calling_convention is not None # just to make pyright happy
745
774
  try:
746
775
  v = state.get(self.project.arch.sp_offset)
747
776
  incremented = None
748
777
  if v is BOTTOM:
749
778
  incremented = BOTTOM
750
- elif callee_cleanups[0].prototype is not None:
751
- num_args = len(callee_cleanups[0].prototype.args)
752
- incremented = v + Constant(self.project.arch.bytes * num_args)
779
+ elif callee.prototype is not None:
780
+ num_stack_args = len(
781
+ [
782
+ arg_loc
783
+ for arg_loc in callee.calling_convention.arg_locs(callee.prototype)
784
+ if isinstance(arg_loc, SimStackArg)
785
+ ]
786
+ )
787
+ if num_stack_args > 0:
788
+ incremented = v + Constant(self.project.arch.bytes * num_stack_args)
753
789
  if incremented is not None:
754
790
  state.put(self.project.arch.sp_offset, incremented)
755
791
  except CouldNotResolveException:
@@ -11,8 +11,10 @@ from angr.sim_type import (
11
11
  SimTypePointer,
12
12
  SimStruct,
13
13
  SimTypeArray,
14
+ SimTypeFloat,
15
+ SimTypeDouble,
14
16
  )
15
- from .typeconsts import BottomType, Int8, Int16, Int32, Int64, Pointer32, Pointer64, Struct, Array
17
+ from .typeconsts import BottomType, Int8, Int16, Int32, Int64, Pointer32, Pointer64, Struct, Array, Float32, Float64
16
18
 
17
19
  if TYPE_CHECKING:
18
20
  from .typeconsts import TypeConstant
@@ -79,6 +81,12 @@ class TypeLifter:
79
81
  elem_type = self.lift(ty.elem_type)
80
82
  return Array(elem_type, count=ty.length)
81
83
 
84
+ def _lift_SimTypeFloat(self, ty: SimTypeFloat) -> Float32: # pylint:disable=unused-argument,no-self-use
85
+ return Float32()
86
+
87
+ def _lift_SimTypeDouble(self, ty: SimTypeDouble) -> Float64: # pylint:disable=unused-argument,no-self-use
88
+ return Float64()
89
+
82
90
 
83
91
  _mapping = {
84
92
  SimTypeChar: TypeLifter._lift_SimTypeChar,
@@ -89,4 +97,6 @@ _mapping = {
89
97
  SimTypePointer: TypeLifter._lift_SimTypePointer,
90
98
  SimStruct: TypeLifter._lift_SimStruct,
91
99
  SimTypeArray: TypeLifter._lift_SimTypeArray,
100
+ SimTypeFloat: TypeLifter._lift_SimTypeFloat,
101
+ SimTypeDouble: TypeLifter._lift_SimTypeDouble,
92
102
  }
@@ -41,6 +41,9 @@ from .typeconsts import (
41
41
  Array,
42
42
  Function,
43
43
  int_type,
44
+ Float,
45
+ Float32,
46
+ Float64,
44
47
  )
45
48
  from .variance import Variance
46
49
  from .dfa import DFAConstraintSolver, EmptyEpsilonNFAError
@@ -60,6 +63,9 @@ PRIMITIVE_TYPES = {
60
63
  BottomType(),
61
64
  Struct(),
62
65
  Array(),
66
+ Float(),
67
+ Float32(),
68
+ Float64(),
63
69
  }
64
70
 
65
71
  Top_ = TopType()
@@ -73,6 +79,9 @@ Pointer64_ = Pointer64()
73
79
  Pointer32_ = Pointer32()
74
80
  Struct_ = Struct()
75
81
  Array_ = Array()
82
+ Float_ = Float()
83
+ Float32_ = Float32()
84
+ Float64_ = Float64()
76
85
 
77
86
  # lattice for 64-bit binaries
78
87
  BASE_LATTICE_64 = networkx.DiGraph()
@@ -161,6 +161,12 @@ class TypeTranslator:
161
161
  self._has_nonexistent_ref = True
162
162
  return SimTypeTempRef(tc.typevar)
163
163
 
164
+ def _translate_Float32(self, tc: typeconsts.Float32) -> sim_type.SimTypeFloat: # pylint:disable=unused-argument
165
+ return sim_type.SimTypeFloat().with_arch(self.arch)
166
+
167
+ def _translate_Float64(self, tc: typeconsts.Float64) -> sim_type.SimTypeDouble: # pylint:disable=unused-argument
168
+ return sim_type.SimTypeDouble().with_arch(self.arch)
169
+
164
170
  #
165
171
  # Backpatching
166
172
  #
@@ -229,6 +235,12 @@ class TypeTranslator:
229
235
  return typeconsts.Pointer64(base)
230
236
  raise TypeError(f"Unsupported pointer size {self.arch.bits}")
231
237
 
238
+ def _translate_SimTypeFloat(self, st: sim_type.SimTypeFloat) -> typeconsts.Float32:
239
+ return typeconsts.Float32()
240
+
241
+ def _translate_SimTypeDouble(self, st: sim_type.SimTypeDouble) -> typeconsts.Float64:
242
+ return typeconsts.Float64()
243
+
232
244
 
233
245
  TypeConstHandlers = {
234
246
  typeconsts.Pointer64: TypeTranslator._translate_Pointer64,
@@ -243,6 +255,8 @@ TypeConstHandlers = {
243
255
  typeconsts.Int256: TypeTranslator._translate_Int256,
244
256
  typeconsts.Int512: TypeTranslator._translate_Int512,
245
257
  typeconsts.TypeVariableReference: TypeTranslator._translate_TypeVariableReference,
258
+ typeconsts.Float32: TypeTranslator._translate_Float32,
259
+ typeconsts.Float64: TypeTranslator._translate_Float64,
246
260
  }
247
261
 
248
262
 
@@ -257,4 +271,6 @@ SimTypeHandlers = {
257
271
  sim_type.SimTypeInt512: TypeTranslator._translate_SimTypeInt512,
258
272
  sim_type.SimStruct: TypeTranslator._translate_SimStruct,
259
273
  sim_type.SimTypeArray: TypeTranslator._translate_SimTypeArray,
274
+ sim_type.SimTypeFloat: TypeTranslator._translate_SimTypeFloat,
275
+ sim_type.SimTypeDouble: TypeTranslator._translate_SimTypeDouble,
260
276
  }
@@ -114,23 +114,23 @@ class Int512(Int):
114
114
  return "int512"
115
115
 
116
116
 
117
- class FloatBase(TypeConstant):
117
+ class Float(TypeConstant):
118
118
  def __repr__(self, memo=None) -> str:
119
119
  return "floatbase"
120
120
 
121
121
 
122
- class Float(FloatBase):
122
+ class Float32(Float):
123
123
  SIZE = 4
124
124
 
125
125
  def __repr__(self, memo=None):
126
- return "float"
126
+ return "float32"
127
127
 
128
128
 
129
- class Double(FloatBase):
129
+ class Float64(Float):
130
130
  SIZE = 8
131
131
 
132
132
  def __repr__(self, memo=None):
133
- return "double"
133
+ return "float64"
134
134
 
135
135
 
136
136
  class Pointer(TypeConstant):
@@ -317,9 +317,9 @@ def int_type(bits: int) -> Int:
317
317
  raise TypeError(f"Not a known size of int: {bits}")
318
318
 
319
319
 
320
- def float_type(bits: int) -> FloatBase | None:
320
+ def float_type(bits: int) -> Float | None:
321
321
  if bits == 32:
322
- return Float()
322
+ return Float32()
323
323
  if bits == 64:
324
- return Double()
324
+ return Float64()
325
325
  return None
angr/analyses/vfg.py CHANGED
@@ -1547,7 +1547,7 @@ class VFG(ForwardAnalysis[SimState, VFGNode, VFGJob, BlockID], Analysis): # pyl
1547
1547
  reg_sp_si = self._create_stack_region(successor_state, successor_addr)
1548
1548
 
1549
1549
  # Save the new sp register
1550
- new_reg_sp_expr = reg_sp_si.annotate(claripy.annotation.RegionAnnotation("global", 0, reg_sp_si))
1550
+ new_reg_sp_expr = reg_sp_si.annotate(claripy.annotation.RegionAnnotation("global", 0))
1551
1551
  successor_state.regs.sp = new_reg_sp_expr
1552
1552
 
1553
1553
  new_job = VFGJob(
@@ -638,12 +638,12 @@ class Function(Serializable):
638
638
  return self.binary.loader.find_symbol(self.addr)
639
639
 
640
640
  @property
641
- def pseudocode(self) -> str:
641
+ def pseudocode(self) -> str | None:
642
642
  """
643
643
  :return: the function's pseudocode
644
644
  """
645
645
  dec = self.project.analyses.Decompiler(self, cfg=self._function_manager._kb.cfgs.get_most_accurate())
646
- return dec.codegen.text
646
+ return dec.codegen.text if dec.codegen else None
647
647
 
648
648
  def add_jumpout_site(self, node: CodeNode):
649
649
  """
Binary file
angr/utils/funcid.py CHANGED
@@ -17,7 +17,8 @@ def is_function_security_check_cookie(func, project, security_cookie_addr: int)
17
17
  return False
18
18
  ins0 = block.capstone.insns[0]
19
19
  if (
20
- ins0.mnemonic == "cmp"
20
+ project.arch.name == "AMD64"
21
+ and ins0.mnemonic == "cmp"
21
22
  and len(ins0.operands) == 2
22
23
  and ins0.operands[0].type == capstone.x86.X86_OP_REG
23
24
  and ins0.operands[0].reg == capstone.x86.X86_REG_RCX
@@ -29,6 +30,20 @@ def is_function_security_check_cookie(func, project, security_cookie_addr: int)
29
30
  ins1 = block.capstone.insns[1]
30
31
  if ins1.mnemonic == "jne":
31
32
  return True
33
+ if (
34
+ project.arch.name == "X86"
35
+ and ins0.mnemonic == "cmp"
36
+ and len(ins0.operands) == 2
37
+ and ins0.operands[0].type == capstone.x86.X86_OP_REG
38
+ and ins0.operands[0].reg == capstone.x86.X86_REG_ECX
39
+ and ins0.operands[1].type == capstone.x86.X86_OP_MEM
40
+ and ins0.operands[1].mem.base == 0
41
+ and ins0.operands[1].mem.disp == security_cookie_addr
42
+ and ins0.operands[1].mem.index == 0
43
+ ):
44
+ ins1 = block.capstone.insns[1]
45
+ if ins1.mnemonic == "jne":
46
+ return True
32
47
  return False
33
48
 
34
49
 
@@ -63,13 +78,23 @@ def is_function_security_init_cookie(func: Function, project, security_cookie_ad
63
78
  continue
64
79
  last_insn = block.capstone.insns[-1]
65
80
  if (
66
- last_insn.mnemonic == "mov"
81
+ project.arch.name == "AMD64"
82
+ and last_insn.mnemonic == "mov"
67
83
  and len(last_insn.operands) == 2
68
84
  and last_insn.operands[0].type == capstone.x86.X86_OP_MEM
69
85
  and last_insn.operands[0].mem.base == capstone.x86.X86_REG_RIP
70
86
  and last_insn.operands[0].mem.index == 0
71
87
  and last_insn.operands[0].mem.disp + last_insn.address + last_insn.size == security_cookie_addr
72
88
  and last_insn.operands[1].type == capstone.x86.X86_OP_REG
89
+ ) or (
90
+ project.arch.name == "X86"
91
+ and last_insn.mnemonic == "mov"
92
+ and len(last_insn.operands) == 2
93
+ and last_insn.operands[0].type == capstone.x86.X86_OP_MEM
94
+ and last_insn.operands[0].mem.base == 0
95
+ and last_insn.operands[0].mem.index == 0
96
+ and last_insn.operands[0].mem.disp == security_cookie_addr
97
+ and last_insn.operands[1].type == capstone.x86.X86_OP_REG
73
98
  ):
74
99
  return True
75
100
  return False
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: angr
3
- Version: 9.2.144
3
+ Version: 9.2.146
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
  License: BSD-2-Clause
6
6
  Project-URL: Homepage, https://angr.io/
@@ -17,13 +17,13 @@ Description-Content-Type: text/markdown
17
17
  License-File: LICENSE
18
18
  Requires-Dist: CppHeaderParser
19
19
  Requires-Dist: GitPython
20
- Requires-Dist: ailment==9.2.144
21
- Requires-Dist: archinfo==9.2.144
20
+ Requires-Dist: ailment==9.2.146
21
+ Requires-Dist: archinfo==9.2.146
22
22
  Requires-Dist: cachetools
23
23
  Requires-Dist: capstone==5.0.3
24
24
  Requires-Dist: cffi>=1.14.0
25
- Requires-Dist: claripy==9.2.144
26
- Requires-Dist: cle==9.2.144
25
+ Requires-Dist: claripy==9.2.146
26
+ Requires-Dist: cle==9.2.146
27
27
  Requires-Dist: mulpyplexer
28
28
  Requires-Dist: nampa
29
29
  Requires-Dist: networkx!=2.8.1,>=2.0
@@ -32,7 +32,7 @@ Requires-Dist: psutil
32
32
  Requires-Dist: pycparser>=2.18
33
33
  Requires-Dist: pydemumble
34
34
  Requires-Dist: pyformlang
35
- Requires-Dist: pyvex==9.2.144
35
+ Requires-Dist: pyvex==9.2.146
36
36
  Requires-Dist: rich>=13.1.0
37
37
  Requires-Dist: sortedcontainers
38
38
  Requires-Dist: sympy
@@ -1,4 +1,4 @@
1
- angr/__init__.py,sha256=sKhb29BGGRRtqv47AVHqOhnkPM_rXaUlpATdVGgPip4,9153
1
+ angr/__init__.py,sha256=uGu8UdlEHVmKVs4G8LMiSDyo78554z4kM1ePpWpHIsg,9153
2
2
  angr/__main__.py,sha256=XeawhF6Cco9eWcfMTDWzYYggLB3qjnQ87IIeFOplaHM,2873
3
3
  angr/annocfg.py,sha256=0NIvcuCskwz45hbBzigUTAuCrYutjDMwEXtMJf0y0S0,10742
4
4
  angr/blade.py,sha256=NhesOPloKJC1DQJRv_HBT18X7oNxK16JwAfNz2Lc1o0,15384
@@ -57,10 +57,10 @@ angr/analyses/s_liveness.py,sha256=K4soSrcQE9pIn7Yf2Lb3LZEu1ymuQVpWzOqLKunFDGQ,7
57
57
  angr/analyses/s_propagator.py,sha256=ChFdiT4wCN0p5mY0UsFGopH3ZH0zM5V_2Ur5cN15Kcc,23667
58
58
  angr/analyses/smc.py,sha256=0fvLPUpjlg6GCjYnfSqanXkGYlthmPwqMYR-ZYBHsbo,5075
59
59
  angr/analyses/soot_class_hierarchy.py,sha256=R4xeacn-a_Q7PxSyj_stu5mnglZkPB5US5srKChX3mk,8740
60
- angr/analyses/stack_pointer_tracker.py,sha256=54wijIt-uJZ2KIOjbEpgKucNoDK3qIvtGh2WuEvRAD0,33370
60
+ angr/analyses/stack_pointer_tracker.py,sha256=xY6ed-TM_WCodDt2aMJgt_TNAP8TN630cLNDcoccjrs,35614
61
61
  angr/analyses/static_hooker.py,sha256=8aine4A1KnkWNfn7IarlWUyX7NjygbFDYbE3_ptCPlA,1764
62
62
  angr/analyses/veritesting.py,sha256=M6WNsbgiv4ScFPQIaFzujNFya66rQ9GSieaRLuC6RSo,25062
63
- angr/analyses/vfg.py,sha256=rlA3LXDAtGGiiqoWsQFOLPxU3pvhvTWpC_WPfC1d5tM,72879
63
+ angr/analyses/vfg.py,sha256=04X_mup9P82bkQIXMju3_DBPPJB1TytA_7RR9uAu3tU,72868
64
64
  angr/analyses/vsa_ddg.py,sha256=PNJ1vQNdHKYCcuXrsXZohtjrxznaWn6GZY2TfhBoY2Q,16136
65
65
  angr/analyses/vtable.py,sha256=1Ed7jzr99rk9VgOGzcxBw_6GFqby5mIdSTGPqQPhcZM,3872
66
66
  angr/analyses/xrefs.py,sha256=vs6cpVmwXHOmxrI9lJUwCRMYbPSqvIQXS5_fINMaOGI,10290
@@ -74,7 +74,7 @@ angr/analyses/cfg/cfg.py,sha256=dc9M91CaLeEKduYfMwpsT_01x6XyYuoNvgvcDKtbN-I,3177
74
74
  angr/analyses/cfg/cfg_arch_options.py,sha256=QpC_sonf0eODcIxWtjVrW6E-gFRGvvdataqGEp9DFFI,3142
75
75
  angr/analyses/cfg/cfg_base.py,sha256=gDbi5bKkM90Bvdp37QbW_iAIGVKuJ5pZmcS_dcB42Rc,124229
76
76
  angr/analyses/cfg/cfg_emulated.py,sha256=JgAen52lAK0v2f_EwiB_gS9BBhg8oqTALN7IVFd80Hk,148051
77
- angr/analyses/cfg/cfg_fast.py,sha256=grDRUS624AyGvKIau8eYeDacK6eAhG8um9cy8snj-GA,226219
77
+ angr/analyses/cfg/cfg_fast.py,sha256=ybkp6Hthz1UPJH2Am1OAIkKgXomFAfq4C96lw5yMvkk,226977
78
78
  angr/analyses/cfg/cfg_fast_soot.py,sha256=X2uroCSbtfgugO33pbIU_hx62bHzZTBweO35iLwEaLo,25906
79
79
  angr/analyses/cfg/cfg_job_base.py,sha256=Zshze972MakTsd-licQz77lac17igQaaTsAteHeHhYQ,5974
80
80
  angr/analyses/cfg/indirect_jump_resolvers/__init__.py,sha256=qWiTSIAQgXWmaYa9YYaiKsSTwUVClymaXv9sCX-bY-k,835
@@ -108,7 +108,7 @@ angr/analyses/decompiler/block_io_finder.py,sha256=xMwG8Bi69OGNYVs0U0F4yxM8kEsny
108
108
  angr/analyses/decompiler/block_similarity.py,sha256=SseCdWgh-kS9q_C_BRxlQ4OwCRQfg-9IyncxKXm_OG8,6849
109
109
  angr/analyses/decompiler/block_simplifier.py,sha256=Pl7qh9ODO41iXkBsKuB8-1gtjnqr6Qc1b8So2MbrTLM,13537
110
110
  angr/analyses/decompiler/callsite_maker.py,sha256=eWO19uHZVUs3i4Bu8iGSjuJkHZ4CleB0RNA_zTUJByw,22168
111
- angr/analyses/decompiler/clinic.py,sha256=6PqJ2E7J5MDqs_SCwLbJ9vXL8M7AMQy9JYj3MvRKxc4,138101
111
+ angr/analyses/decompiler/clinic.py,sha256=Zj6PRpipY-CWccLMXpsknOcNyOuSgybKwK6VHV9Ho7I,138154
112
112
  angr/analyses/decompiler/condition_processor.py,sha256=BCBcgj-QDGNj3ajOKzEktqckTozcSgonaMk1a42QAGc,53853
113
113
  angr/analyses/decompiler/decompilation_cache.py,sha256=oNkeyrEXhyinrN7-fKeDEuGP6I_oAclGjRS4Aa36FoE,1488
114
114
  angr/analyses/decompiler/decompilation_options.py,sha256=NDB67DI1L-stvJ4b1eQkfV26HgDJ_rG9-6PEv08G9-8,8195
@@ -154,7 +154,7 @@ angr/analyses/decompiler/optimization_passes/const_prop_reverter.py,sha256=-Y8JX
154
154
  angr/analyses/decompiler/optimization_passes/cross_jump_reverter.py,sha256=DzvgsAhU4GqvS0yN0Q2JezkJAuo2KInCgZ7fsB-ibz4,4021
155
155
  angr/analyses/decompiler/optimization_passes/deadblock_remover.py,sha256=yqW4Ba4Kw7Bf_HqyACLhdsuj2XQhiSXjd02f7Wubf2A,2707
156
156
  angr/analyses/decompiler/optimization_passes/div_simplifier.py,sha256=fdMyGtykG9QepIUFL2_KN9lqsJFqHsVwNoJ1p8GlQ7A,18739
157
- angr/analyses/decompiler/optimization_passes/engine_base.py,sha256=PiCFksceRfu0nPPSKfzTsMmrAJ1YaHMEjcuCHcaYbgM,16662
157
+ angr/analyses/decompiler/optimization_passes/engine_base.py,sha256=pc81VuwPCnJlcUv2cBR2xNt9Egrv-Txua1n_3DXhd9I,16934
158
158
  angr/analyses/decompiler/optimization_passes/expr_op_swapper.py,sha256=PJMJ0INWiINSkv1eD5QsMJS81XtfuyKqoqe6NTkU120,4715
159
159
  angr/analyses/decompiler/optimization_passes/flip_boolean_cmp.py,sha256=q2ZOxKQUXUwQNEDjEnj-ji32f6n_XR8M82lr_0ImJdM,5079
160
160
  angr/analyses/decompiler/optimization_passes/inlined_string_transformation_simplifier.py,sha256=_rqXGIs03Idkw7IOtxHhapQ-qCMO_mKlJ_FfHAM6TAo,24842
@@ -173,7 +173,7 @@ angr/analyses/decompiler/optimization_passes/stack_canary_simplifier.py,sha256=_
173
173
  angr/analyses/decompiler/optimization_passes/switch_default_case_duplicator.py,sha256=gvGpjP3t-an8iIBkmPGXob0-aRHL2idGZpd7hErlgFo,6461
174
174
  angr/analyses/decompiler/optimization_passes/switch_reused_entry_rewriter.py,sha256=m7ZMkqE2qbl4rl4M_Fi8xS6I1vUaTzUBIzsE6qpbwkM,4020
175
175
  angr/analyses/decompiler/optimization_passes/tag_slicer.py,sha256=8_gmoeYgDD1Hb8Rpqcb-01_B4897peDF-J6KA5PjQT8,1176
176
- angr/analyses/decompiler/optimization_passes/win_stack_canary_simplifier.py,sha256=OkC5vPGlH6GRA-VrfOZrZ6TzWxLPyIq2IX5MYMzjwlM,13073
176
+ angr/analyses/decompiler/optimization_passes/win_stack_canary_simplifier.py,sha256=MHrVduNXHBmaa4-6PyqBLj7Urc8DnK-zd8zrqawiVxM,15674
177
177
  angr/analyses/decompiler/optimization_passes/x86_gcc_getpc_simplifier.py,sha256=6NxaX2oT6BMkevb8xt9vlS3Jl-CmSK59F0FVab68B48,3088
178
178
  angr/analyses/decompiler/optimization_passes/duplication_reverter/__init__.py,sha256=hTeOdooVDZnBnjiAguD7_BS9YJru8rOiSHN3H0sdzcA,126
179
179
  angr/analyses/decompiler/optimization_passes/duplication_reverter/ail_merge_graph.py,sha256=Trp6qkwO_L4oMfdX78ZOoplcIpLV4CV1k_ZimY2IvxA,21658
@@ -204,7 +204,7 @@ angr/analyses/decompiler/peephole_optimizations/const_mull_a_shift.py,sha256=3KT
204
204
  angr/analyses/decompiler/peephole_optimizations/constant_derefs.py,sha256=5ThmIgu38Un_N5AltnQtcTnoEnOT45HRu6NehB3rG5M,1713
205
205
  angr/analyses/decompiler/peephole_optimizations/conv_a_sub0_shr_and.py,sha256=6WooyVqwdlMLixGFR8QE0n6GDEC2AluVo4dIr7vwmqY,2379
206
206
  angr/analyses/decompiler/peephole_optimizations/conv_shl_shr.py,sha256=5LtXTzPwO_Dtru3UYbr6l8YYylxKrAVZ9q6Gjk1C8sI,2105
207
- angr/analyses/decompiler/peephole_optimizations/eager_eval.py,sha256=aIja9B01FP4RLlceu-4-TujUgqSWU1GYaQgNGAeoinM,17146
207
+ angr/analyses/decompiler/peephole_optimizations/eager_eval.py,sha256=igDQmyEQtOT6KgBH_yfgm_JUBaycHBfytdLV1uxGFVE,17550
208
208
  angr/analyses/decompiler/peephole_optimizations/extended_byte_and_mask.py,sha256=r39kiAST4tC-iInTuFgnek0KOljBS3AxS2wPvEpEB58,2044
209
209
  angr/analyses/decompiler/peephole_optimizations/inlined_strcpy.py,sha256=40RcqWIMALxfA-LG-DN2N_yK5uW2HWF_x4AquCTMbNU,6245
210
210
  angr/analyses/decompiler/peephole_optimizations/inlined_strcpy_consolidation.py,sha256=wKj38t6sTd6wpbVpbPG7Nxiz9vU5K_TvL4sws04TsDk,4681
@@ -253,7 +253,7 @@ angr/analyses/decompiler/ssailification/__init__.py,sha256=zcHoI7e2El2RSU_bHTpQR
253
253
  angr/analyses/decompiler/ssailification/rewriting.py,sha256=JW_StoLWuDs2LGyG8XjRUbzvQl7-7s2B8j1GKVaYoDo,15045
254
254
  angr/analyses/decompiler/ssailification/rewriting_engine.py,sha256=Jtjg_o0EyZFgadKhAulNMmDEK3wsvbRn_XbnaRjqlMM,37631
255
255
  angr/analyses/decompiler/ssailification/rewriting_state.py,sha256=L7apDXQLPiItuLdQFoQdut5RMUE8MRV1zRc3CsnuH6E,1883
256
- angr/analyses/decompiler/ssailification/ssailification.py,sha256=aD5Rq2OpCqRdk5jmiqKFPHifEDWdJi1zonxDQ01r1DY,9898
256
+ angr/analyses/decompiler/ssailification/ssailification.py,sha256=kEEph4IyCNY55XJvZU8RK3_y8TVZhBM2Yll2VGzGCzw,9897
257
257
  angr/analyses/decompiler/ssailification/traversal.py,sha256=kZcua4SlDZ8u4EIkjc1Qh85EEYGX63PZ2NYPNq78Kzs,4011
258
258
  angr/analyses/decompiler/ssailification/traversal_engine.py,sha256=BiXCqC3M3-reyq1Pxspo31Rnr9mTOojiFXa3tGlxipY,10512
259
259
  angr/analyses/decompiler/ssailification/traversal_state.py,sha256=RDs2mTc6GYnbMom2gBfNfNMcazKMSkhemEmse8uELTY,1558
@@ -348,10 +348,10 @@ angr/analyses/s_reaching_definitions/s_rda_view.py,sha256=g3ESg9G7eLllEawCPN892u
348
348
  angr/analyses/s_reaching_definitions/s_reaching_definitions.py,sha256=_SooCn9qpwwCLsZ8end3Gos6XZbzjiBjWVjxG-VaNso,7596
349
349
  angr/analyses/typehoon/__init__.py,sha256=KjKBUZadAd3grXUy48_qO0L4Me-riSqPGteVDcTL59M,92
350
350
  angr/analyses/typehoon/dfa.py,sha256=41lzhE-QmkC342SjfaaPI41lr4Au5XROTu_7oenvg7g,3823
351
- angr/analyses/typehoon/lifter.py,sha256=iLl9F7RZtyth3qEeTvJGyvrKxrmaLn8LxS9DUbkoz4k,2823
352
- angr/analyses/typehoon/simple_solver.py,sha256=jscsnEV2yxq6ntxgD3ApqOpmGvIgrfwdzZqZy58xY-g,53168
353
- angr/analyses/typehoon/translator.py,sha256=9PV9M8LgmVYMBSmLutYU5irzHoGHMYeLGVYRUpiJFKE,9590
354
- angr/analyses/typehoon/typeconsts.py,sha256=cM4IbG8be3X_WidJ94tDSKOjEObw82V6zOb8ADvqKzw,7684
351
+ angr/analyses/typehoon/lifter.py,sha256=3GX0QzjzIyFAiF3R_e2BlvbGwqcDFWy51BF7rQpwSl4,3250
352
+ angr/analyses/typehoon/simple_solver.py,sha256=tIzhZ1H_DwbwGCpgspBBBjXvLiHyPGZD9le7r93s6rU,53307
353
+ angr/analyses/typehoon/translator.py,sha256=-SSTU_9vGlRun7msRll22OLYoVFHvlFJxEyctMVKjeU,10454
354
+ angr/analyses/typehoon/typeconsts.py,sha256=lh5nygChVPwI4IOLy8QnkBvqxfO22dDK_tKfAE0cYlg,7677
355
355
  angr/analyses/typehoon/typehoon.py,sha256=ek7g_5v1bLNi8fv5FgYmMQrsOWj19qM8WvZvjzXd2NU,11420
356
356
  angr/analyses/typehoon/typevars.py,sha256=cvbeeEDapb0LgGgtgUVpbhAcfuaylk7vEiwCqPxvtQo,16332
357
357
  angr/analyses/typehoon/variance.py,sha256=3wYw3of8uoar-MQ7gD6arALiwlJRW990t0BUqMarXIY,193
@@ -528,7 +528,7 @@ angr/knowledge_plugins/cfg/cfg_node.py,sha256=mAvQ8XAEURM7y0suc_S9lfxCmfXSTJHmWB
528
528
  angr/knowledge_plugins/cfg/indirect_jump.py,sha256=W3KWpH7Sx-6Z7h_BwQjCK_XfP3ce_MaeAu_Aaq3D3qg,2072
529
529
  angr/knowledge_plugins/cfg/memory_data.py,sha256=QLxFZfrtwz8u6UJn1L-Sxa-C8S0Gy9IOlfNfHCLPIow,5056
530
530
  angr/knowledge_plugins/functions/__init__.py,sha256=asiLNiT6sHbjP6eU-kDpawIoVxv4J35cwz5yQHtQ2E0,167
531
- angr/knowledge_plugins/functions/function.py,sha256=8Pa7ugPWtSV6xM69wawj4-fKMArzHVaIwpb0qbshtjw,67502
531
+ angr/knowledge_plugins/functions/function.py,sha256=UjuGbWlXNVcXiN3xkUrf7H-Ip8eivEAFg20AVAa1Wkg,67534
532
532
  angr/knowledge_plugins/functions/function_manager.py,sha256=gdXZY5__a8c_ItQoDkJq4ZBVk-ZLHnmBPYsHA6uEjeA,20001
533
533
  angr/knowledge_plugins/functions/function_parser.py,sha256=Ma_51hPet3iVJgMtBhKaT48CcNnxCNv2ys5oMrqJ3bw,11821
534
534
  angr/knowledge_plugins/functions/soot_function.py,sha256=lYMe4qbkhAkXqGHTVb0-RM_kB8xWYUocuioK7UmKZgQ,4847
@@ -558,7 +558,7 @@ angr/knowledge_plugins/xrefs/__init__.py,sha256=5PhqVOtTZ27lCjJ9wp7akUeJydqILbyC
558
558
  angr/knowledge_plugins/xrefs/xref.py,sha256=U2H1rfffp5EXoh0awlGxMBxA4K5MIwl3CXjV3Uih3tA,4856
559
559
  angr/knowledge_plugins/xrefs/xref_manager.py,sha256=1n373rtV91xicAfSUresRigsZ6qCBhPOaJKrN_SW3QY,4157
560
560
  angr/knowledge_plugins/xrefs/xref_types.py,sha256=LcQ9pD4E4XlC51Us49xiqAoGAFGpnCrpYO4mOzILiKI,308
561
- angr/lib/angr_native.dylib,sha256=TY7IKU34Nyaw8_pRhe-KFOwTfBevfcheb4yVNKPVz80,264696
561
+ angr/lib/angr_native.dylib,sha256=CPHlR-m6TKIJTSmGFnc7xMCpk1tKzNsSul7vZdTBmgk,264696
562
562
  angr/misc/__init__.py,sha256=FoUwjk1DhqlIsr2sBN0MlR8MnSOGQv9QJhxmq32RYuA,355
563
563
  angr/misc/ansi.py,sha256=nPJHC0SKfqasMQZ0LxdmmIYojjmk4nr5jI6FrzoTwS0,811
564
564
  angr/misc/autoimport.py,sha256=iZagpuPwZWczUTYIqs-JkDMQjftMqc_cchcm7OBFiEg,3450
@@ -1355,7 +1355,7 @@ angr/utils/endness.py,sha256=wBcek3rwRQCYdMVFOV5h5q16Ahgjn2x_zZdPeZQEui0,501
1355
1355
  angr/utils/enums_conv.py,sha256=fA6qeoRZ6Cj6gCIS_PZbP4PX7E8IybnYQ90OZGnBVrc,2746
1356
1356
  angr/utils/env.py,sha256=aO4N2h7DUsUQtTgnC5J_oPHvMxJRur20m5UFSkmy4XU,398
1357
1357
  angr/utils/formatting.py,sha256=OWzSfAlKcL09cEtcqxszYWHsRO9tih7hvXD2K9kUZc8,4343
1358
- angr/utils/funcid.py,sha256=dSGbKUWpTzy48374lJqHyRefJ6K7B7jRVhYHmpGmD3I,5256
1358
+ angr/utils/funcid.py,sha256=Rd4r8juv2IpeMtCpPp4wxJoEZTnZZ1NsxdT42tvrKVA,6353
1359
1359
  angr/utils/graph.py,sha256=0A4NqNvWXxXMrzBENbeyDE8t78MZ01mzmGesZplA8OQ,30882
1360
1360
  angr/utils/lazy_import.py,sha256=7Mx-y-aZFsXX9jNxvEcXT-rO8tL8rknb6D6RbSFOI1M,343
1361
1361
  angr/utils/library.py,sha256=z3rFYm7ePZTXNZJuKiQrR0SnlbVb-OzkX0t0U44nXDk,7181
@@ -1369,9 +1369,9 @@ angr/utils/types.py,sha256=5EDtrusFLf1fIcMz8fgJiPPsUhpEm0bf_oqZ_PSRje0,1836
1369
1369
  angr/utils/ssa/__init__.py,sha256=ohP9IJh9ZvdVH8nH-ZrYA8hwIi8L98XQ6NMNL6q_pJ0,13649
1370
1370
  angr/utils/ssa/tmp_uses_collector.py,sha256=rSpvMxBHzg-tmvhsfjn3iLyPEKzaZN-xpQrdslMq3J4,793
1371
1371
  angr/utils/ssa/vvar_uses_collector.py,sha256=O2aNZeM5DL8qatyhYuMhgbYGFp6Onm2yr9pKq1wRjA0,1347
1372
- angr-9.2.144.dist-info/LICENSE,sha256=cgL_ho5B1NH8UxwtBuqThRWdjear8b7hktycaS1sz6g,1327
1373
- angr-9.2.144.dist-info/METADATA,sha256=n6znfc4OJcs2jpsgUugSnCofX2ycjw0SO06dp2jjmF8,4909
1374
- angr-9.2.144.dist-info/WHEEL,sha256=iId1cGaFIHvrdUDQ8nUVM8cxJ9m1QOVfFPekQlGkl_0,106
1375
- angr-9.2.144.dist-info/entry_points.txt,sha256=Vjh1C8PMyr5dZFMnik5WkEP01Uwr2T73I3a6N32sgQU,44
1376
- angr-9.2.144.dist-info/top_level.txt,sha256=dKw0KWTbwLXytFvv15oAAG4sUs3ey47tt6DorJG9-hw,5
1377
- angr-9.2.144.dist-info/RECORD,,
1372
+ angr-9.2.146.dist-info/LICENSE,sha256=cgL_ho5B1NH8UxwtBuqThRWdjear8b7hktycaS1sz6g,1327
1373
+ angr-9.2.146.dist-info/METADATA,sha256=bRHwQxiFzD0OqTpgVLJXt1m8nMl1oLaE7k1jfw-_Lag,4909
1374
+ angr-9.2.146.dist-info/WHEEL,sha256=MgZooQjwSU6-UuRDg7WxrVphIwLjHH_Zcmw9KVDXId4,106
1375
+ angr-9.2.146.dist-info/entry_points.txt,sha256=Vjh1C8PMyr5dZFMnik5WkEP01Uwr2T73I3a6N32sgQU,44
1376
+ angr-9.2.146.dist-info/top_level.txt,sha256=dKw0KWTbwLXytFvv15oAAG4sUs3ey47tt6DorJG9-hw,5
1377
+ angr-9.2.146.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (75.8.1)
2
+ Generator: setuptools (76.0.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-macosx_10_9_x86_64
5
5