angr 9.2.192__cp311-cp311-macosx_10_12_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.
- angr/__init__.py +366 -0
- angr/__main__.py +182 -0
- angr/ail_callable.py +79 -0
- angr/ailment/__init__.py +83 -0
- angr/ailment/block.py +88 -0
- angr/ailment/block_walker.py +856 -0
- angr/ailment/constant.py +3 -0
- angr/ailment/converter_common.py +11 -0
- angr/ailment/converter_pcode.py +648 -0
- angr/ailment/converter_vex.py +829 -0
- angr/ailment/expression.py +1655 -0
- angr/ailment/manager.py +34 -0
- angr/ailment/statement.py +973 -0
- angr/ailment/tagged_object.py +58 -0
- angr/ailment/utils.py +114 -0
- angr/analyses/__init__.py +117 -0
- angr/analyses/analysis.py +429 -0
- angr/analyses/backward_slice.py +686 -0
- angr/analyses/binary_optimizer.py +670 -0
- angr/analyses/bindiff.py +1512 -0
- angr/analyses/boyscout.py +76 -0
- angr/analyses/callee_cleanup_finder.py +74 -0
- angr/analyses/calling_convention/__init__.py +6 -0
- angr/analyses/calling_convention/calling_convention.py +1113 -0
- angr/analyses/calling_convention/fact_collector.py +647 -0
- angr/analyses/calling_convention/utils.py +60 -0
- angr/analyses/cdg.py +189 -0
- angr/analyses/cfg/__init__.py +23 -0
- angr/analyses/cfg/cfb.py +451 -0
- angr/analyses/cfg/cfg.py +74 -0
- angr/analyses/cfg/cfg_arch_options.py +95 -0
- angr/analyses/cfg/cfg_base.py +2954 -0
- angr/analyses/cfg/cfg_emulated.py +3451 -0
- angr/analyses/cfg/cfg_fast.py +5431 -0
- angr/analyses/cfg/cfg_fast_soot.py +662 -0
- angr/analyses/cfg/cfg_job_base.py +203 -0
- angr/analyses/cfg/indirect_jump_resolvers/__init__.py +30 -0
- angr/analyses/cfg/indirect_jump_resolvers/aarch64_macho_got.py +77 -0
- angr/analyses/cfg/indirect_jump_resolvers/amd64_elf_got.py +62 -0
- angr/analyses/cfg/indirect_jump_resolvers/amd64_pe_iat.py +51 -0
- angr/analyses/cfg/indirect_jump_resolvers/arm_elf_fast.py +159 -0
- angr/analyses/cfg/indirect_jump_resolvers/const_resolver.py +339 -0
- angr/analyses/cfg/indirect_jump_resolvers/constant_value_manager.py +107 -0
- angr/analyses/cfg/indirect_jump_resolvers/default_resolvers.py +82 -0
- angr/analyses/cfg/indirect_jump_resolvers/jumptable.py +2490 -0
- angr/analyses/cfg/indirect_jump_resolvers/memload_resolver.py +81 -0
- angr/analyses/cfg/indirect_jump_resolvers/mips_elf_fast.py +286 -0
- angr/analyses/cfg/indirect_jump_resolvers/mips_elf_got.py +148 -0
- angr/analyses/cfg/indirect_jump_resolvers/propagator_utils.py +46 -0
- angr/analyses/cfg/indirect_jump_resolvers/resolver.py +74 -0
- angr/analyses/cfg/indirect_jump_resolvers/syscall_resolver.py +92 -0
- angr/analyses/cfg/indirect_jump_resolvers/x86_elf_pic_plt.py +88 -0
- angr/analyses/cfg/indirect_jump_resolvers/x86_pe_iat.py +47 -0
- angr/analyses/cfg_slice_to_sink/__init__.py +11 -0
- angr/analyses/cfg_slice_to_sink/cfg_slice_to_sink.py +117 -0
- angr/analyses/cfg_slice_to_sink/graph.py +87 -0
- angr/analyses/cfg_slice_to_sink/transitions.py +27 -0
- angr/analyses/class_identifier.py +63 -0
- angr/analyses/code_tagging.py +123 -0
- angr/analyses/codecave.py +77 -0
- angr/analyses/complete_calling_conventions.py +475 -0
- angr/analyses/congruency_check.py +377 -0
- angr/analyses/data_dep/__init__.py +16 -0
- angr/analyses/data_dep/data_dependency_analysis.py +595 -0
- angr/analyses/data_dep/dep_nodes.py +171 -0
- angr/analyses/data_dep/sim_act_location.py +49 -0
- angr/analyses/datagraph_meta.py +105 -0
- angr/analyses/ddg.py +1670 -0
- angr/analyses/decompiler/__init__.py +41 -0
- angr/analyses/decompiler/ail_simplifier.py +2246 -0
- angr/analyses/decompiler/ailgraph_walker.py +49 -0
- angr/analyses/decompiler/block_io_finder.py +302 -0
- angr/analyses/decompiler/block_similarity.py +199 -0
- angr/analyses/decompiler/block_simplifier.py +397 -0
- angr/analyses/decompiler/callsite_maker.py +579 -0
- angr/analyses/decompiler/ccall_rewriters/__init__.py +9 -0
- angr/analyses/decompiler/ccall_rewriters/amd64_ccalls.py +618 -0
- angr/analyses/decompiler/ccall_rewriters/rewriter_base.py +24 -0
- angr/analyses/decompiler/ccall_rewriters/x86_ccalls.py +354 -0
- angr/analyses/decompiler/clinic.py +3662 -0
- angr/analyses/decompiler/condition_processor.py +1323 -0
- angr/analyses/decompiler/counters/__init__.py +16 -0
- angr/analyses/decompiler/counters/boolean_counter.py +27 -0
- angr/analyses/decompiler/counters/call_counter.py +77 -0
- angr/analyses/decompiler/counters/expression_counters.py +77 -0
- angr/analyses/decompiler/counters/seq_cf_structure_counter.py +63 -0
- angr/analyses/decompiler/decompilation_cache.py +54 -0
- angr/analyses/decompiler/decompilation_options.py +317 -0
- angr/analyses/decompiler/decompiler.py +796 -0
- angr/analyses/decompiler/dephication/__init__.py +6 -0
- angr/analyses/decompiler/dephication/dephication_base.py +100 -0
- angr/analyses/decompiler/dephication/graph_dephication.py +70 -0
- angr/analyses/decompiler/dephication/graph_rewriting.py +112 -0
- angr/analyses/decompiler/dephication/graph_vvar_mapping.py +357 -0
- angr/analyses/decompiler/dephication/rewriting_engine.py +528 -0
- angr/analyses/decompiler/dephication/seqnode_dephication.py +156 -0
- angr/analyses/decompiler/dirty_rewriters/__init__.py +7 -0
- angr/analyses/decompiler/dirty_rewriters/amd64_dirty.py +74 -0
- angr/analyses/decompiler/dirty_rewriters/rewriter_base.py +27 -0
- angr/analyses/decompiler/empty_node_remover.py +212 -0
- angr/analyses/decompiler/expression_narrower.py +290 -0
- angr/analyses/decompiler/goto_manager.py +112 -0
- angr/analyses/decompiler/graph_region.py +441 -0
- angr/analyses/decompiler/jump_target_collector.py +37 -0
- angr/analyses/decompiler/jumptable_entry_condition_rewriter.py +67 -0
- angr/analyses/decompiler/label_collector.py +32 -0
- angr/analyses/decompiler/node_replacer.py +42 -0
- angr/analyses/decompiler/notes/__init__.py +9 -0
- angr/analyses/decompiler/notes/decompilation_note.py +48 -0
- angr/analyses/decompiler/notes/deobfuscated_strings.py +56 -0
- angr/analyses/decompiler/optimization_passes/__init__.py +164 -0
- angr/analyses/decompiler/optimization_passes/base_ptr_save_simplifier.py +157 -0
- angr/analyses/decompiler/optimization_passes/call_stmt_rewriter.py +46 -0
- angr/analyses/decompiler/optimization_passes/code_motion.py +362 -0
- angr/analyses/decompiler/optimization_passes/condition_constprop.py +211 -0
- angr/analyses/decompiler/optimization_passes/const_derefs.py +127 -0
- angr/analyses/decompiler/optimization_passes/const_prop_reverter.py +365 -0
- angr/analyses/decompiler/optimization_passes/cross_jump_reverter.py +106 -0
- angr/analyses/decompiler/optimization_passes/deadblock_remover.py +82 -0
- angr/analyses/decompiler/optimization_passes/determine_load_sizes.py +64 -0
- angr/analyses/decompiler/optimization_passes/div_simplifier.py +425 -0
- angr/analyses/decompiler/optimization_passes/duplication_reverter/__init__.py +5 -0
- angr/analyses/decompiler/optimization_passes/duplication_reverter/ail_merge_graph.py +503 -0
- angr/analyses/decompiler/optimization_passes/duplication_reverter/duplication_reverter.py +1221 -0
- angr/analyses/decompiler/optimization_passes/duplication_reverter/errors.py +16 -0
- angr/analyses/decompiler/optimization_passes/duplication_reverter/similarity.py +126 -0
- angr/analyses/decompiler/optimization_passes/duplication_reverter/utils.py +167 -0
- angr/analyses/decompiler/optimization_passes/eager_std_string_concatenation.py +236 -0
- angr/analyses/decompiler/optimization_passes/eager_std_string_eval.py +186 -0
- angr/analyses/decompiler/optimization_passes/engine_base.py +502 -0
- angr/analyses/decompiler/optimization_passes/expr_op_swapper.py +138 -0
- angr/analyses/decompiler/optimization_passes/flip_boolean_cmp.py +113 -0
- angr/analyses/decompiler/optimization_passes/inlined_string_transformation_simplifier.py +618 -0
- angr/analyses/decompiler/optimization_passes/inlined_strlen_simplifier.py +274 -0
- angr/analyses/decompiler/optimization_passes/ite_expr_converter.py +224 -0
- angr/analyses/decompiler/optimization_passes/ite_region_converter.py +337 -0
- angr/analyses/decompiler/optimization_passes/lowered_switch_simplifier.py +939 -0
- angr/analyses/decompiler/optimization_passes/mod_simplifier.py +99 -0
- angr/analyses/decompiler/optimization_passes/optimization_pass.py +710 -0
- angr/analyses/decompiler/optimization_passes/peephole_simplifier.py +75 -0
- angr/analyses/decompiler/optimization_passes/register_save_area_simplifier.py +263 -0
- angr/analyses/decompiler/optimization_passes/register_save_area_simplifier_adv.py +198 -0
- angr/analyses/decompiler/optimization_passes/ret_addr_save_simplifier.py +171 -0
- angr/analyses/decompiler/optimization_passes/ret_deduplicator.py +222 -0
- angr/analyses/decompiler/optimization_passes/return_duplicator_base.py +632 -0
- angr/analyses/decompiler/optimization_passes/return_duplicator_high.py +61 -0
- angr/analyses/decompiler/optimization_passes/return_duplicator_low.py +166 -0
- angr/analyses/decompiler/optimization_passes/stack_canary_simplifier.py +333 -0
- angr/analyses/decompiler/optimization_passes/static_vvar_rewriter.py +336 -0
- angr/analyses/decompiler/optimization_passes/switch_default_case_duplicator.py +166 -0
- angr/analyses/decompiler/optimization_passes/switch_reused_entry_rewriter.py +102 -0
- angr/analyses/decompiler/optimization_passes/tag_slicer.py +41 -0
- angr/analyses/decompiler/optimization_passes/win_stack_canary_simplifier.py +477 -0
- angr/analyses/decompiler/optimization_passes/x86_gcc_getpc_simplifier.py +88 -0
- angr/analyses/decompiler/peephole_optimizations/__init__.py +136 -0
- angr/analyses/decompiler/peephole_optimizations/a_div_const_add_a_mul_n_div_const.py +42 -0
- angr/analyses/decompiler/peephole_optimizations/a_mul_const_div_shr_const.py +38 -0
- angr/analyses/decompiler/peephole_optimizations/a_mul_const_sub_a.py +34 -0
- angr/analyses/decompiler/peephole_optimizations/a_shl_const_sub_a.py +34 -0
- angr/analyses/decompiler/peephole_optimizations/a_sub_a_div.py +25 -0
- angr/analyses/decompiler/peephole_optimizations/a_sub_a_shr_const_shr_const.py +37 -0
- angr/analyses/decompiler/peephole_optimizations/a_sub_a_sub_n.py +23 -0
- angr/analyses/decompiler/peephole_optimizations/arm_cmpf.py +236 -0
- angr/analyses/decompiler/peephole_optimizations/base.py +157 -0
- angr/analyses/decompiler/peephole_optimizations/basepointeroffset_add_n.py +34 -0
- angr/analyses/decompiler/peephole_optimizations/basepointeroffset_and_mask.py +36 -0
- angr/analyses/decompiler/peephole_optimizations/bitwise_or_to_logical_or.py +34 -0
- angr/analyses/decompiler/peephole_optimizations/bool_expr_xor_1.py +27 -0
- angr/analyses/decompiler/peephole_optimizations/bswap.py +142 -0
- angr/analyses/decompiler/peephole_optimizations/cas_intrinsics.py +182 -0
- angr/analyses/decompiler/peephole_optimizations/cmpord_rewriter.py +71 -0
- angr/analyses/decompiler/peephole_optimizations/coalesce_adjacent_shrs.py +39 -0
- angr/analyses/decompiler/peephole_optimizations/coalesce_same_cascading_ifs.py +28 -0
- angr/analyses/decompiler/peephole_optimizations/constant_derefs.py +44 -0
- angr/analyses/decompiler/peephole_optimizations/conv_a_sub0_shr_and.py +69 -0
- angr/analyses/decompiler/peephole_optimizations/conv_shl_shr.py +52 -0
- angr/analyses/decompiler/peephole_optimizations/eager_eval.py +436 -0
- angr/analyses/decompiler/peephole_optimizations/extended_byte_and_mask.py +56 -0
- angr/analyses/decompiler/peephole_optimizations/inlined_memcpy.py +78 -0
- angr/analyses/decompiler/peephole_optimizations/inlined_memset.py +262 -0
- angr/analyses/decompiler/peephole_optimizations/inlined_strcpy.py +217 -0
- angr/analyses/decompiler/peephole_optimizations/inlined_strcpy_consolidation.py +106 -0
- angr/analyses/decompiler/peephole_optimizations/inlined_wcscpy.py +256 -0
- angr/analyses/decompiler/peephole_optimizations/inlined_wcscpy_consolidation.py +296 -0
- angr/analyses/decompiler/peephole_optimizations/invert_negated_logical_conjuction_disjunction.py +50 -0
- angr/analyses/decompiler/peephole_optimizations/modulo_simplifier.py +89 -0
- angr/analyses/decompiler/peephole_optimizations/one_sub_bool.py +33 -0
- angr/analyses/decompiler/peephole_optimizations/optimized_div_simplifier.py +356 -0
- angr/analyses/decompiler/peephole_optimizations/remove_cascading_conversions.py +45 -0
- angr/analyses/decompiler/peephole_optimizations/remove_cxx_destructor_calls.py +32 -0
- angr/analyses/decompiler/peephole_optimizations/remove_empty_if_body.py +46 -0
- angr/analyses/decompiler/peephole_optimizations/remove_noop_conversions.py +47 -0
- angr/analyses/decompiler/peephole_optimizations/remove_redundant_bitmasks.py +125 -0
- angr/analyses/decompiler/peephole_optimizations/remove_redundant_conversions.py +273 -0
- angr/analyses/decompiler/peephole_optimizations/remove_redundant_derefs.py +21 -0
- angr/analyses/decompiler/peephole_optimizations/remove_redundant_ite_branch.py +30 -0
- angr/analyses/decompiler/peephole_optimizations/remove_redundant_ite_comparisons.py +54 -0
- angr/analyses/decompiler/peephole_optimizations/remove_redundant_nots.py +36 -0
- angr/analyses/decompiler/peephole_optimizations/remove_redundant_reinterprets.py +44 -0
- angr/analyses/decompiler/peephole_optimizations/remove_redundant_shifts.py +95 -0
- angr/analyses/decompiler/peephole_optimizations/remove_redundant_shifts_around_comparators.py +115 -0
- angr/analyses/decompiler/peephole_optimizations/rewrite_bit_extractions.py +85 -0
- angr/analyses/decompiler/peephole_optimizations/rewrite_conv_mul.py +40 -0
- angr/analyses/decompiler/peephole_optimizations/rewrite_cxx_operator_calls.py +90 -0
- angr/analyses/decompiler/peephole_optimizations/rewrite_mips_gp_loads.py +49 -0
- angr/analyses/decompiler/peephole_optimizations/rol_ror.py +130 -0
- angr/analyses/decompiler/peephole_optimizations/sar_to_signed_div.py +143 -0
- angr/analyses/decompiler/peephole_optimizations/shl_to_mul.py +25 -0
- angr/analyses/decompiler/peephole_optimizations/simplify_pc_relative_loads.py +51 -0
- angr/analyses/decompiler/peephole_optimizations/single_bit_cond_to_boolexpr.py +28 -0
- angr/analyses/decompiler/peephole_optimizations/single_bit_xor.py +29 -0
- angr/analyses/decompiler/peephole_optimizations/tidy_stack_addr.py +131 -0
- angr/analyses/decompiler/peephole_optimizations/utils.py +18 -0
- angr/analyses/decompiler/presets/__init__.py +22 -0
- angr/analyses/decompiler/presets/basic.py +36 -0
- angr/analyses/decompiler/presets/fast.py +66 -0
- angr/analyses/decompiler/presets/full.py +76 -0
- angr/analyses/decompiler/presets/malware.py +70 -0
- angr/analyses/decompiler/presets/preset.py +37 -0
- angr/analyses/decompiler/redundant_label_remover.py +141 -0
- angr/analyses/decompiler/region_identifier.py +1319 -0
- angr/analyses/decompiler/region_simplifiers/__init__.py +5 -0
- angr/analyses/decompiler/region_simplifiers/cascading_cond_transformer.py +95 -0
- angr/analyses/decompiler/region_simplifiers/cascading_ifs.py +82 -0
- angr/analyses/decompiler/region_simplifiers/expr_folding.py +838 -0
- angr/analyses/decompiler/region_simplifiers/goto.py +178 -0
- angr/analyses/decompiler/region_simplifiers/if_.py +135 -0
- angr/analyses/decompiler/region_simplifiers/ifelse.py +91 -0
- angr/analyses/decompiler/region_simplifiers/loop.py +143 -0
- angr/analyses/decompiler/region_simplifiers/node_address_finder.py +24 -0
- angr/analyses/decompiler/region_simplifiers/region_simplifier.py +270 -0
- angr/analyses/decompiler/region_simplifiers/switch_cluster_simplifier.py +654 -0
- angr/analyses/decompiler/region_simplifiers/switch_expr_simplifier.py +87 -0
- angr/analyses/decompiler/region_walker.py +24 -0
- angr/analyses/decompiler/return_maker.py +72 -0
- angr/analyses/decompiler/semantic_naming/__init__.py +37 -0
- angr/analyses/decompiler/semantic_naming/array_index_naming.py +196 -0
- angr/analyses/decompiler/semantic_naming/boolean_naming.py +264 -0
- angr/analyses/decompiler/semantic_naming/call_result_naming.py +220 -0
- angr/analyses/decompiler/semantic_naming/naming_base.py +166 -0
- angr/analyses/decompiler/semantic_naming/orchestrator.py +107 -0
- angr/analyses/decompiler/semantic_naming/pointer_naming.py +334 -0
- angr/analyses/decompiler/semantic_naming/region_loop_counter_naming.py +246 -0
- angr/analyses/decompiler/semantic_naming/size_naming.py +137 -0
- angr/analyses/decompiler/seq_to_blocks.py +20 -0
- angr/analyses/decompiler/sequence_walker.py +261 -0
- angr/analyses/decompiler/ssailification/__init__.py +4 -0
- angr/analyses/decompiler/ssailification/rewriting.py +451 -0
- angr/analyses/decompiler/ssailification/rewriting_engine.py +1091 -0
- angr/analyses/decompiler/ssailification/rewriting_state.py +61 -0
- angr/analyses/decompiler/ssailification/ssailification.py +283 -0
- angr/analyses/decompiler/ssailification/traversal.py +127 -0
- angr/analyses/decompiler/ssailification/traversal_engine.py +323 -0
- angr/analyses/decompiler/ssailification/traversal_state.py +48 -0
- angr/analyses/decompiler/stack_item.py +36 -0
- angr/analyses/decompiler/structured_codegen/__init__.py +25 -0
- angr/analyses/decompiler/structured_codegen/base.py +193 -0
- angr/analyses/decompiler/structured_codegen/c.py +4257 -0
- angr/analyses/decompiler/structured_codegen/dummy.py +15 -0
- angr/analyses/decompiler/structured_codegen/dwarf_import.py +190 -0
- angr/analyses/decompiler/structuring/__init__.py +30 -0
- angr/analyses/decompiler/structuring/dream.py +1217 -0
- angr/analyses/decompiler/structuring/phoenix.py +3636 -0
- angr/analyses/decompiler/structuring/recursive_structurer.py +187 -0
- angr/analyses/decompiler/structuring/sailr.py +120 -0
- angr/analyses/decompiler/structuring/structurer_base.py +1140 -0
- angr/analyses/decompiler/structuring/structurer_nodes.py +442 -0
- angr/analyses/decompiler/utils.py +1224 -0
- angr/analyses/deobfuscator/__init__.py +23 -0
- angr/analyses/deobfuscator/api_obf_finder.py +333 -0
- angr/analyses/deobfuscator/api_obf_peephole_optimizer.py +80 -0
- angr/analyses/deobfuscator/api_obf_type2_finder.py +166 -0
- angr/analyses/deobfuscator/data_transformation_embedder.py +633 -0
- angr/analyses/deobfuscator/hash_lookup_api_deobfuscator.py +156 -0
- angr/analyses/deobfuscator/irsb_reg_collector.py +54 -0
- angr/analyses/deobfuscator/scope_ops_analyzer.py +68 -0
- angr/analyses/deobfuscator/string_obf_finder.py +983 -0
- angr/analyses/deobfuscator/string_obf_opt_passes.py +136 -0
- angr/analyses/deobfuscator/string_obf_peephole_optimizer.py +47 -0
- angr/analyses/disassembly.py +1351 -0
- angr/analyses/disassembly_utils.py +101 -0
- angr/analyses/dominance_frontier.py +57 -0
- angr/analyses/fcp/__init__.py +4 -0
- angr/analyses/fcp/fcp.py +427 -0
- angr/analyses/find_objects_static.py +205 -0
- angr/analyses/flirt/__init__.py +47 -0
- angr/analyses/flirt/consts.py +160 -0
- angr/analyses/flirt/flirt.py +249 -0
- angr/analyses/flirt/flirt_function.py +20 -0
- angr/analyses/flirt/flirt_matcher.py +352 -0
- angr/analyses/flirt/flirt_module.py +32 -0
- angr/analyses/flirt/flirt_node.py +23 -0
- angr/analyses/flirt/flirt_sig.py +359 -0
- angr/analyses/flirt/flirt_utils.py +31 -0
- angr/analyses/forward_analysis/__init__.py +12 -0
- angr/analyses/forward_analysis/forward_analysis.py +619 -0
- angr/analyses/forward_analysis/job_info.py +64 -0
- angr/analyses/forward_analysis/visitors/__init__.py +14 -0
- angr/analyses/forward_analysis/visitors/call_graph.py +29 -0
- angr/analyses/forward_analysis/visitors/function_graph.py +86 -0
- angr/analyses/forward_analysis/visitors/graph.py +242 -0
- angr/analyses/forward_analysis/visitors/loop.py +29 -0
- angr/analyses/forward_analysis/visitors/single_node_graph.py +38 -0
- angr/analyses/identifier/__init__.py +5 -0
- angr/analyses/identifier/custom_callable.py +137 -0
- angr/analyses/identifier/errors.py +10 -0
- angr/analyses/identifier/func.py +60 -0
- angr/analyses/identifier/functions/__init__.py +37 -0
- angr/analyses/identifier/functions/atoi.py +73 -0
- angr/analyses/identifier/functions/based_atoi.py +125 -0
- angr/analyses/identifier/functions/fdprintf.py +123 -0
- angr/analyses/identifier/functions/free.py +64 -0
- angr/analyses/identifier/functions/int2str.py +287 -0
- angr/analyses/identifier/functions/malloc.py +111 -0
- angr/analyses/identifier/functions/memcmp.py +67 -0
- angr/analyses/identifier/functions/memcpy.py +89 -0
- angr/analyses/identifier/functions/memset.py +43 -0
- angr/analyses/identifier/functions/printf.py +123 -0
- angr/analyses/identifier/functions/recv_until.py +312 -0
- angr/analyses/identifier/functions/skip_calloc.py +73 -0
- angr/analyses/identifier/functions/skip_realloc.py +97 -0
- angr/analyses/identifier/functions/skip_recv_n.py +105 -0
- angr/analyses/identifier/functions/snprintf.py +112 -0
- angr/analyses/identifier/functions/sprintf.py +116 -0
- angr/analyses/identifier/functions/strcasecmp.py +33 -0
- angr/analyses/identifier/functions/strcmp.py +113 -0
- angr/analyses/identifier/functions/strcpy.py +43 -0
- angr/analyses/identifier/functions/strlen.py +27 -0
- angr/analyses/identifier/functions/strncmp.py +104 -0
- angr/analyses/identifier/functions/strncpy.py +65 -0
- angr/analyses/identifier/functions/strtol.py +89 -0
- angr/analyses/identifier/identify.py +825 -0
- angr/analyses/identifier/runner.py +360 -0
- angr/analyses/init_finder.py +289 -0
- angr/analyses/loop_analysis/__init__.py +4 -0
- angr/analyses/loop_analysis/loop_analysis.py +464 -0
- angr/analyses/loop_analysis.py +349 -0
- angr/analyses/loop_unroller/__init__.py +4 -0
- angr/analyses/loop_unroller/loop_unroller.py +222 -0
- angr/analyses/loopfinder.py +171 -0
- angr/analyses/outliner/__init__.py +7 -0
- angr/analyses/outliner/outliner.py +402 -0
- angr/analyses/patchfinder.py +137 -0
- angr/analyses/pathfinder.py +282 -0
- angr/analyses/propagator/__init__.py +5 -0
- angr/analyses/propagator/engine_base.py +62 -0
- angr/analyses/propagator/engine_vex.py +297 -0
- angr/analyses/propagator/propagator.py +361 -0
- angr/analyses/propagator/top_checker_mixin.py +218 -0
- angr/analyses/propagator/values.py +117 -0
- angr/analyses/propagator/vex_vars.py +68 -0
- angr/analyses/proximity_graph.py +444 -0
- angr/analyses/purity/__init__.py +15 -0
- angr/analyses/purity/analysis.py +78 -0
- angr/analyses/purity/engine.py +593 -0
- angr/analyses/reaching_definitions/__init__.py +67 -0
- angr/analyses/reaching_definitions/call_trace.py +73 -0
- angr/analyses/reaching_definitions/dep_graph.py +433 -0
- angr/analyses/reaching_definitions/engine_ail.py +1128 -0
- angr/analyses/reaching_definitions/engine_vex.py +1128 -0
- angr/analyses/reaching_definitions/external_codeloc.py +0 -0
- angr/analyses/reaching_definitions/function_handler.py +639 -0
- angr/analyses/reaching_definitions/function_handler_library/__init__.py +12 -0
- angr/analyses/reaching_definitions/function_handler_library/stdio.py +269 -0
- angr/analyses/reaching_definitions/function_handler_library/stdlib.py +195 -0
- angr/analyses/reaching_definitions/function_handler_library/string.py +158 -0
- angr/analyses/reaching_definitions/function_handler_library/unistd.py +51 -0
- angr/analyses/reaching_definitions/heap_allocator.py +70 -0
- angr/analyses/reaching_definitions/rd_initializer.py +237 -0
- angr/analyses/reaching_definitions/rd_state.py +579 -0
- angr/analyses/reaching_definitions/reaching_definitions.py +581 -0
- angr/analyses/reaching_definitions/subject.py +65 -0
- angr/analyses/reassembler.py +2900 -0
- angr/analyses/s_liveness.py +254 -0
- angr/analyses/s_propagator.py +575 -0
- angr/analyses/s_reaching_definitions/__init__.py +12 -0
- angr/analyses/s_reaching_definitions/s_rda_model.py +145 -0
- angr/analyses/s_reaching_definitions/s_rda_view.py +344 -0
- angr/analyses/s_reaching_definitions/s_reaching_definitions.py +230 -0
- angr/analyses/smc.py +160 -0
- angr/analyses/soot_class_hierarchy.py +273 -0
- angr/analyses/stack_pointer_tracker.py +954 -0
- angr/analyses/static_hooker.py +53 -0
- angr/analyses/typehoon/__init__.py +5 -0
- angr/analyses/typehoon/dfa.py +118 -0
- angr/analyses/typehoon/lifter.py +133 -0
- angr/analyses/typehoon/simple_solver.py +2009 -0
- angr/analyses/typehoon/translator.py +283 -0
- angr/analyses/typehoon/typeconsts.py +439 -0
- angr/analyses/typehoon/typehoon.py +338 -0
- angr/analyses/typehoon/typevars.py +633 -0
- angr/analyses/typehoon/variance.py +11 -0
- angr/analyses/unpacker/__init__.py +6 -0
- angr/analyses/unpacker/obfuscation_detector.py +103 -0
- angr/analyses/unpacker/packing_detector.py +138 -0
- angr/analyses/variable_recovery/__init__.py +9 -0
- angr/analyses/variable_recovery/annotations.py +58 -0
- angr/analyses/variable_recovery/engine_ail.py +978 -0
- angr/analyses/variable_recovery/engine_base.py +1256 -0
- angr/analyses/variable_recovery/engine_vex.py +594 -0
- angr/analyses/variable_recovery/irsb_scanner.py +143 -0
- angr/analyses/variable_recovery/variable_recovery.py +574 -0
- angr/analyses/variable_recovery/variable_recovery_base.py +489 -0
- angr/analyses/variable_recovery/variable_recovery_fast.py +669 -0
- angr/analyses/veritesting.py +626 -0
- angr/analyses/vfg.py +1898 -0
- angr/analyses/vsa_ddg.py +420 -0
- angr/analyses/vtable.py +92 -0
- angr/analyses/xrefs.py +286 -0
- angr/angrdb/__init__.py +14 -0
- angr/angrdb/db.py +215 -0
- angr/angrdb/models.py +184 -0
- angr/angrdb/serializers/__init__.py +10 -0
- angr/angrdb/serializers/cfg_model.py +41 -0
- angr/angrdb/serializers/comments.py +60 -0
- angr/angrdb/serializers/funcs.py +61 -0
- angr/angrdb/serializers/kb.py +111 -0
- angr/angrdb/serializers/labels.py +59 -0
- angr/angrdb/serializers/loader.py +165 -0
- angr/angrdb/serializers/structured_code.py +167 -0
- angr/angrdb/serializers/variables.py +58 -0
- angr/angrdb/serializers/xrefs.py +48 -0
- angr/annocfg.py +317 -0
- angr/blade.py +431 -0
- angr/block.py +509 -0
- angr/callable.py +176 -0
- angr/calling_conventions.py +2613 -0
- angr/code_location.py +249 -0
- angr/codenode.py +145 -0
- angr/concretization_strategies/__init__.py +32 -0
- angr/concretization_strategies/any.py +17 -0
- angr/concretization_strategies/any_named.py +35 -0
- angr/concretization_strategies/base.py +81 -0
- angr/concretization_strategies/controlled_data.py +58 -0
- angr/concretization_strategies/eval.py +19 -0
- angr/concretization_strategies/logging.py +35 -0
- angr/concretization_strategies/max.py +25 -0
- angr/concretization_strategies/nonzero.py +16 -0
- angr/concretization_strategies/nonzero_range.py +22 -0
- angr/concretization_strategies/norepeats.py +37 -0
- angr/concretization_strategies/norepeats_range.py +37 -0
- angr/concretization_strategies/range.py +19 -0
- angr/concretization_strategies/signed_add.py +31 -0
- angr/concretization_strategies/single.py +15 -0
- angr/concretization_strategies/solutions.py +20 -0
- angr/concretization_strategies/unlimited_range.py +17 -0
- angr/distributed/__init__.py +9 -0
- angr/distributed/server.py +197 -0
- angr/distributed/worker.py +185 -0
- angr/emulator.py +144 -0
- angr/engines/__init__.py +69 -0
- angr/engines/ail/__init__.py +16 -0
- angr/engines/ail/callstack.py +58 -0
- angr/engines/ail/engine_light.py +903 -0
- angr/engines/ail/engine_successors.py +24 -0
- angr/engines/ail/setup.py +57 -0
- angr/engines/concrete.py +66 -0
- angr/engines/engine.py +29 -0
- angr/engines/failure.py +27 -0
- angr/engines/hook.py +93 -0
- angr/engines/icicle.py +294 -0
- angr/engines/light/__init__.py +23 -0
- angr/engines/light/data.py +681 -0
- angr/engines/light/engine.py +1297 -0
- angr/engines/pcode/__init__.py +9 -0
- angr/engines/pcode/behavior.py +998 -0
- angr/engines/pcode/cc.py +148 -0
- angr/engines/pcode/emulate.py +440 -0
- angr/engines/pcode/engine.py +242 -0
- angr/engines/pcode/lifter.py +1428 -0
- angr/engines/procedure.py +70 -0
- angr/engines/soot/__init__.py +5 -0
- angr/engines/soot/engine.py +410 -0
- angr/engines/soot/exceptions.py +17 -0
- angr/engines/soot/expressions/__init__.py +87 -0
- angr/engines/soot/expressions/arrayref.py +22 -0
- angr/engines/soot/expressions/base.py +21 -0
- angr/engines/soot/expressions/binop.py +28 -0
- angr/engines/soot/expressions/cast.py +22 -0
- angr/engines/soot/expressions/condition.py +35 -0
- angr/engines/soot/expressions/constants.py +47 -0
- angr/engines/soot/expressions/instanceOf.py +15 -0
- angr/engines/soot/expressions/instancefieldref.py +8 -0
- angr/engines/soot/expressions/invoke.py +114 -0
- angr/engines/soot/expressions/length.py +8 -0
- angr/engines/soot/expressions/local.py +8 -0
- angr/engines/soot/expressions/new.py +16 -0
- angr/engines/soot/expressions/newArray.py +54 -0
- angr/engines/soot/expressions/newMultiArray.py +86 -0
- angr/engines/soot/expressions/paramref.py +8 -0
- angr/engines/soot/expressions/phi.py +30 -0
- angr/engines/soot/expressions/staticfieldref.py +8 -0
- angr/engines/soot/expressions/thisref.py +7 -0
- angr/engines/soot/expressions/unsupported.py +7 -0
- angr/engines/soot/field_dispatcher.py +46 -0
- angr/engines/soot/method_dispatcher.py +46 -0
- angr/engines/soot/statements/__init__.py +44 -0
- angr/engines/soot/statements/assign.py +30 -0
- angr/engines/soot/statements/base.py +79 -0
- angr/engines/soot/statements/goto.py +14 -0
- angr/engines/soot/statements/identity.py +15 -0
- angr/engines/soot/statements/if_.py +19 -0
- angr/engines/soot/statements/invoke.py +12 -0
- angr/engines/soot/statements/return_.py +20 -0
- angr/engines/soot/statements/switch.py +41 -0
- angr/engines/soot/statements/throw.py +15 -0
- angr/engines/soot/values/__init__.py +38 -0
- angr/engines/soot/values/arrayref.py +122 -0
- angr/engines/soot/values/base.py +7 -0
- angr/engines/soot/values/constants.py +18 -0
- angr/engines/soot/values/instancefieldref.py +44 -0
- angr/engines/soot/values/local.py +18 -0
- angr/engines/soot/values/paramref.py +18 -0
- angr/engines/soot/values/staticfieldref.py +38 -0
- angr/engines/soot/values/strref.py +38 -0
- angr/engines/soot/values/thisref.py +149 -0
- angr/engines/successors.py +608 -0
- angr/engines/syscall.py +51 -0
- angr/engines/unicorn.py +490 -0
- angr/engines/vex/__init__.py +20 -0
- angr/engines/vex/claripy/__init__.py +5 -0
- angr/engines/vex/claripy/ccall.py +2097 -0
- angr/engines/vex/claripy/datalayer.py +141 -0
- angr/engines/vex/claripy/irop.py +1276 -0
- angr/engines/vex/heavy/__init__.py +16 -0
- angr/engines/vex/heavy/actions.py +231 -0
- angr/engines/vex/heavy/concretizers.py +403 -0
- angr/engines/vex/heavy/dirty.py +466 -0
- angr/engines/vex/heavy/heavy.py +370 -0
- angr/engines/vex/heavy/inspect.py +52 -0
- angr/engines/vex/heavy/resilience.py +85 -0
- angr/engines/vex/heavy/super_fastpath.py +34 -0
- angr/engines/vex/lifter.py +420 -0
- angr/engines/vex/light/__init__.py +11 -0
- angr/engines/vex/light/light.py +551 -0
- angr/engines/vex/light/resilience.py +74 -0
- angr/engines/vex/light/slicing.py +52 -0
- angr/errors.py +611 -0
- angr/exploration_techniques/__init__.py +53 -0
- angr/exploration_techniques/base.py +126 -0
- angr/exploration_techniques/bucketizer.py +94 -0
- angr/exploration_techniques/common.py +56 -0
- angr/exploration_techniques/dfs.py +37 -0
- angr/exploration_techniques/director.py +520 -0
- angr/exploration_techniques/driller_core.py +100 -0
- angr/exploration_techniques/explorer.py +152 -0
- angr/exploration_techniques/lengthlimiter.py +22 -0
- angr/exploration_techniques/local_loop_seer.py +65 -0
- angr/exploration_techniques/loop_seer.py +236 -0
- angr/exploration_techniques/manual_mergepoint.py +82 -0
- angr/exploration_techniques/memory_watcher.py +43 -0
- angr/exploration_techniques/oppologist.py +92 -0
- angr/exploration_techniques/slicecutor.py +118 -0
- angr/exploration_techniques/spiller.py +280 -0
- angr/exploration_techniques/spiller_db.py +27 -0
- angr/exploration_techniques/stochastic.py +56 -0
- angr/exploration_techniques/stub_stasher.py +19 -0
- angr/exploration_techniques/suggestions.py +159 -0
- angr/exploration_techniques/tech_builder.py +49 -0
- angr/exploration_techniques/threading.py +69 -0
- angr/exploration_techniques/timeout.py +34 -0
- angr/exploration_techniques/tracer.py +1098 -0
- angr/exploration_techniques/unique.py +106 -0
- angr/exploration_techniques/veritesting.py +37 -0
- angr/factory.py +413 -0
- angr/flirt/__init__.py +124 -0
- angr/flirt/build_sig.py +305 -0
- angr/graph_utils.py +0 -0
- angr/keyed_region.py +525 -0
- angr/knowledge_base.py +146 -0
- angr/knowledge_plugins/__init__.py +43 -0
- angr/knowledge_plugins/callsite_prototypes.py +95 -0
- angr/knowledge_plugins/cfg/__init__.py +18 -0
- angr/knowledge_plugins/cfg/cfg_manager.py +95 -0
- angr/knowledge_plugins/cfg/cfg_model.py +1043 -0
- angr/knowledge_plugins/cfg/cfg_node.py +536 -0
- angr/knowledge_plugins/cfg/indirect_jump.py +131 -0
- angr/knowledge_plugins/cfg/memory_data.py +156 -0
- angr/knowledge_plugins/comments.py +16 -0
- angr/knowledge_plugins/custom_strings.py +38 -0
- angr/knowledge_plugins/data.py +22 -0
- angr/knowledge_plugins/debug_variables.py +216 -0
- angr/knowledge_plugins/functions/__init__.py +9 -0
- angr/knowledge_plugins/functions/function.py +1830 -0
- angr/knowledge_plugins/functions/function_manager.py +621 -0
- angr/knowledge_plugins/functions/function_parser.py +360 -0
- angr/knowledge_plugins/functions/soot_function.py +128 -0
- angr/knowledge_plugins/indirect_jumps.py +35 -0
- angr/knowledge_plugins/key_definitions/__init__.py +17 -0
- angr/knowledge_plugins/key_definitions/atoms.py +374 -0
- angr/knowledge_plugins/key_definitions/constants.py +29 -0
- angr/knowledge_plugins/key_definitions/definition.py +216 -0
- angr/knowledge_plugins/key_definitions/environment.py +96 -0
- angr/knowledge_plugins/key_definitions/heap_address.py +33 -0
- angr/knowledge_plugins/key_definitions/key_definition_manager.py +82 -0
- angr/knowledge_plugins/key_definitions/live_definitions.py +1020 -0
- angr/knowledge_plugins/key_definitions/liveness.py +165 -0
- angr/knowledge_plugins/key_definitions/rd_model.py +171 -0
- angr/knowledge_plugins/key_definitions/tag.py +78 -0
- angr/knowledge_plugins/key_definitions/undefined.py +70 -0
- angr/knowledge_plugins/key_definitions/unknown_size.py +86 -0
- angr/knowledge_plugins/key_definitions/uses.py +178 -0
- angr/knowledge_plugins/labels.py +110 -0
- angr/knowledge_plugins/obfuscations.py +40 -0
- angr/knowledge_plugins/patches.py +126 -0
- angr/knowledge_plugins/plugin.py +24 -0
- angr/knowledge_plugins/propagations/__init__.py +10 -0
- angr/knowledge_plugins/propagations/prop_value.py +191 -0
- angr/knowledge_plugins/propagations/propagation_manager.py +60 -0
- angr/knowledge_plugins/propagations/propagation_model.py +80 -0
- angr/knowledge_plugins/propagations/states.py +552 -0
- angr/knowledge_plugins/structured_code.py +63 -0
- angr/knowledge_plugins/types.py +95 -0
- angr/knowledge_plugins/variables/__init__.py +8 -0
- angr/knowledge_plugins/variables/variable_access.py +113 -0
- angr/knowledge_plugins/variables/variable_manager.py +1375 -0
- angr/knowledge_plugins/xrefs/__init__.py +12 -0
- angr/knowledge_plugins/xrefs/xref.py +150 -0
- angr/knowledge_plugins/xrefs/xref_manager.py +127 -0
- angr/knowledge_plugins/xrefs/xref_types.py +16 -0
- angr/misc/__init__.py +19 -0
- angr/misc/ansi.py +47 -0
- angr/misc/autoimport.py +90 -0
- angr/misc/bug_report.py +126 -0
- angr/misc/hookset.py +106 -0
- angr/misc/loggers.py +130 -0
- angr/misc/picklable_lock.py +46 -0
- angr/misc/plugins.py +289 -0
- angr/misc/telemetry.py +54 -0
- angr/misc/testing.py +24 -0
- angr/misc/ux.py +31 -0
- angr/procedures/__init__.py +12 -0
- angr/procedures/advapi32/__init__.py +0 -0
- angr/procedures/cgc/__init__.py +3 -0
- angr/procedures/cgc/_terminate.py +11 -0
- angr/procedures/cgc/allocate.py +75 -0
- angr/procedures/cgc/deallocate.py +67 -0
- angr/procedures/cgc/fdwait.py +65 -0
- angr/procedures/cgc/random.py +67 -0
- angr/procedures/cgc/receive.py +93 -0
- angr/procedures/cgc/transmit.py +65 -0
- angr/procedures/definitions/__init__.py +1043 -0
- angr/procedures/definitions/cgc.py +23 -0
- angr/procedures/definitions/common/glibc.json +3516 -0
- angr/procedures/definitions/gnulib.py +41 -0
- angr/procedures/definitions/libstdcpp.py +25 -0
- angr/procedures/definitions/linux_kernel.py +8382 -0
- angr/procedures/definitions/linux_loader.py +7 -0
- angr/procedures/definitions/macho_libsystem.py +18 -0
- angr/procedures/definitions/msvcr.py +25 -0
- angr/procedures/definitions/parse_glibc.py +77 -0
- angr/procedures/definitions/parse_syscalls_from_local_system.py +54 -0
- angr/procedures/definitions/parse_win32json.py +2540 -0
- angr/procedures/definitions/types_stl.py +22 -0
- angr/procedures/definitions/wdk/api-ms-win-dx-d3dkmt-l1-1-4.json +24 -0
- angr/procedures/definitions/wdk/api-ms-win-dx-d3dkmt-l1-1-6.json +18 -0
- angr/procedures/definitions/wdk/clfs.json +189 -0
- angr/procedures/definitions/wdk/fltmgr.json +813 -0
- angr/procedures/definitions/wdk/fwpkclnt.json +24 -0
- angr/procedures/definitions/wdk/fwpuclnt.json +453 -0
- angr/procedures/definitions/wdk/gdi32.json +528 -0
- angr/procedures/definitions/wdk/hal.json +96 -0
- angr/procedures/definitions/wdk/ksecdd.json +72 -0
- angr/procedures/definitions/wdk/ndis.json +336 -0
- angr/procedures/definitions/wdk/ntoskrnl.json +5158 -0
- angr/procedures/definitions/wdk/offreg.json +87 -0
- angr/procedures/definitions/wdk/pshed.json +33 -0
- angr/procedures/definitions/wdk/secur32.json +39 -0
- angr/procedures/definitions/wdk/vhfum.json +30 -0
- angr/procedures/definitions/win32/_types_win32.json +34480 -0
- angr/procedures/definitions/win32/aclui.json +24 -0
- angr/procedures/definitions/win32/activeds.json +81 -0
- angr/procedures/definitions/win32/advapi32.json +2505 -0
- angr/procedures/definitions/win32/advpack.json +165 -0
- angr/procedures/definitions/win32/amsi.json +36 -0
- angr/procedures/definitions/win32/api-ms-win-appmodel-runtime-l1-1-1.json +45 -0
- angr/procedures/definitions/win32/api-ms-win-appmodel-runtime-l1-1-3.json +30 -0
- angr/procedures/definitions/win32/api-ms-win-appmodel-runtime-l1-1-6.json +18 -0
- angr/procedures/definitions/win32/api-ms-win-core-apiquery-l2-1-0.json +18 -0
- angr/procedures/definitions/win32/api-ms-win-core-backgroundtask-l1-1-0.json +18 -0
- angr/procedures/definitions/win32/api-ms-win-core-comm-l1-1-1.json +18 -0
- angr/procedures/definitions/win32/api-ms-win-core-comm-l1-1-2.json +18 -0
- angr/procedures/definitions/win32/api-ms-win-core-enclave-l1-1-1.json +24 -0
- angr/procedures/definitions/win32/api-ms-win-core-errorhandling-l1-1-3.json +18 -0
- angr/procedures/definitions/win32/api-ms-win-core-featurestaging-l1-1-0.json +30 -0
- angr/procedures/definitions/win32/api-ms-win-core-featurestaging-l1-1-1.json +18 -0
- angr/procedures/definitions/win32/api-ms-win-core-file-fromapp-l1-1-0.json +48 -0
- angr/procedures/definitions/win32/api-ms-win-core-handle-l1-1-0.json +18 -0
- angr/procedures/definitions/win32/api-ms-win-core-ioring-l1-1-0.json +51 -0
- angr/procedures/definitions/win32/api-ms-win-core-marshal-l1-1-0.json +27 -0
- angr/procedures/definitions/win32/api-ms-win-core-memory-l1-1-3.json +27 -0
- angr/procedures/definitions/win32/api-ms-win-core-memory-l1-1-4.json +18 -0
- angr/procedures/definitions/win32/api-ms-win-core-memory-l1-1-5.json +24 -0
- angr/procedures/definitions/win32/api-ms-win-core-memory-l1-1-6.json +27 -0
- angr/procedures/definitions/win32/api-ms-win-core-memory-l1-1-7.json +21 -0
- angr/procedures/definitions/win32/api-ms-win-core-memory-l1-1-8.json +24 -0
- angr/procedures/definitions/win32/api-ms-win-core-path-l1-1-0.json +81 -0
- angr/procedures/definitions/win32/api-ms-win-core-psm-appnotify-l1-1-0.json +21 -0
- angr/procedures/definitions/win32/api-ms-win-core-psm-appnotify-l1-1-1.json +21 -0
- angr/procedures/definitions/win32/api-ms-win-core-realtime-l1-1-1.json +24 -0
- angr/procedures/definitions/win32/api-ms-win-core-realtime-l1-1-2.json +24 -0
- angr/procedures/definitions/win32/api-ms-win-core-slapi-l1-1-0.json +18 -0
- angr/procedures/definitions/win32/api-ms-win-core-state-helpers-l1-1-0.json +18 -0
- angr/procedures/definitions/win32/api-ms-win-core-synch-l1-2-0.json +24 -0
- angr/procedures/definitions/win32/api-ms-win-core-sysinfo-l1-2-0.json +18 -0
- angr/procedures/definitions/win32/api-ms-win-core-sysinfo-l1-2-3.json +21 -0
- angr/procedures/definitions/win32/api-ms-win-core-sysinfo-l1-2-4.json +21 -0
- angr/procedures/definitions/win32/api-ms-win-core-sysinfo-l1-2-6.json +18 -0
- angr/procedures/definitions/win32/api-ms-win-core-util-l1-1-1.json +21 -0
- angr/procedures/definitions/win32/api-ms-win-core-wow64-l1-1-1.json +24 -0
- angr/procedures/definitions/win32/api-ms-win-devices-query-l1-1-0.json +42 -0
- angr/procedures/definitions/win32/api-ms-win-devices-query-l1-1-1.json +30 -0
- angr/procedures/definitions/win32/api-ms-win-dx-d3dkmt-l1-1-0.json +18 -0
- angr/procedures/definitions/win32/api-ms-win-gaming-deviceinformation-l1-1-0.json +18 -0
- angr/procedures/definitions/win32/api-ms-win-gaming-expandedresources-l1-1-0.json +24 -0
- angr/procedures/definitions/win32/api-ms-win-gaming-tcui-l1-1-0.json +36 -0
- angr/procedures/definitions/win32/api-ms-win-gaming-tcui-l1-1-1.json +21 -0
- angr/procedures/definitions/win32/api-ms-win-gaming-tcui-l1-1-2.json +36 -0
- angr/procedures/definitions/win32/api-ms-win-gaming-tcui-l1-1-3.json +21 -0
- angr/procedures/definitions/win32/api-ms-win-gaming-tcui-l1-1-4.json +39 -0
- angr/procedures/definitions/win32/api-ms-win-mm-misc-l1-1-1.json +18 -0
- angr/procedures/definitions/win32/api-ms-win-net-isolation-l1-1-0.json +39 -0
- angr/procedures/definitions/win32/api-ms-win-security-base-l1-2-2.json +18 -0
- angr/procedures/definitions/win32/api-ms-win-security-isolatedcontainer-l1-1-0.json +18 -0
- angr/procedures/definitions/win32/api-ms-win-security-isolatedcontainer-l1-1-1.json +18 -0
- angr/procedures/definitions/win32/api-ms-win-service-core-l1-1-3.json +18 -0
- angr/procedures/definitions/win32/api-ms-win-service-core-l1-1-4.json +18 -0
- angr/procedures/definitions/win32/api-ms-win-service-core-l1-1-5.json +21 -0
- angr/procedures/definitions/win32/api-ms-win-shcore-scaling-l1-1-0.json +24 -0
- angr/procedures/definitions/win32/api-ms-win-shcore-scaling-l1-1-1.json +33 -0
- angr/procedures/definitions/win32/api-ms-win-shcore-scaling-l1-1-2.json +18 -0
- angr/procedures/definitions/win32/api-ms-win-wsl-api-l1-1-0.json +36 -0
- angr/procedures/definitions/win32/apphelp.json +18 -0
- angr/procedures/definitions/win32/authz.json +114 -0
- angr/procedures/definitions/win32/avicap32.json +27 -0
- angr/procedures/definitions/win32/avifil32.json +195 -0
- angr/procedures/definitions/win32/avrt.json +57 -0
- angr/procedures/definitions/win32/bcp47mrm.json +21 -0
- angr/procedures/definitions/win32/bcrypt.json +174 -0
- angr/procedures/definitions/win32/bcryptprimitives.json +21 -0
- angr/procedures/definitions/win32/bluetoothapis.json +138 -0
- angr/procedures/definitions/win32/bthprops_cpl.json +33 -0
- angr/procedures/definitions/win32/cabinet.json +81 -0
- angr/procedures/definitions/win32/certadm.json +69 -0
- angr/procedures/definitions/win32/certpoleng.json +39 -0
- angr/procedures/definitions/win32/cfgmgr32.json +732 -0
- angr/procedures/definitions/win32/chakra.json +270 -0
- angr/procedures/definitions/win32/cldapi.json +123 -0
- angr/procedures/definitions/win32/clfsw32.json +192 -0
- angr/procedures/definitions/win32/clusapi.json +855 -0
- angr/procedures/definitions/win32/comctl32.json +360 -0
- angr/procedures/definitions/win32/comdlg32.json +78 -0
- angr/procedures/definitions/win32/compstui.json +27 -0
- angr/procedures/definitions/win32/computecore.json +177 -0
- angr/procedures/definitions/win32/computenetwork.json +144 -0
- angr/procedures/definitions/win32/computestorage.json +51 -0
- angr/procedures/definitions/win32/comsvcs.json +36 -0
- angr/procedures/definitions/win32/credui.json +72 -0
- angr/procedures/definitions/win32/crypt32.json +702 -0
- angr/procedures/definitions/win32/cryptnet.json +30 -0
- angr/procedures/definitions/win32/cryptui.json +45 -0
- angr/procedures/definitions/win32/cryptxml.json +72 -0
- angr/procedures/definitions/win32/cscapi.json +27 -0
- angr/procedures/definitions/win32/d2d1.json +54 -0
- angr/procedures/definitions/win32/d3d10.json +96 -0
- angr/procedures/definitions/win32/d3d10_1.json +21 -0
- angr/procedures/definitions/win32/d3d11.json +24 -0
- angr/procedures/definitions/win32/d3d12.json +39 -0
- angr/procedures/definitions/win32/d3d9.json +48 -0
- angr/procedures/definitions/win32/d3dcompiler_47.json +93 -0
- angr/procedures/definitions/win32/d3dcsx.json +42 -0
- angr/procedures/definitions/win32/davclnt.json +69 -0
- angr/procedures/definitions/win32/dbgeng.json +27 -0
- angr/procedures/definitions/win32/dbghelp.json +663 -0
- angr/procedures/definitions/win32/dbgmodel.json +18 -0
- angr/procedures/definitions/win32/dciman32.json +75 -0
- angr/procedures/definitions/win32/dcomp.json +51 -0
- angr/procedures/definitions/win32/ddraw.json +36 -0
- angr/procedures/definitions/win32/deviceaccess.json +18 -0
- angr/procedures/definitions/win32/dflayout.json +18 -0
- angr/procedures/definitions/win32/dhcpcsvc.json +60 -0
- angr/procedures/definitions/win32/dhcpcsvc6.json +33 -0
- angr/procedures/definitions/win32/dhcpsapi.json +603 -0
- angr/procedures/definitions/win32/diagnosticdataquery.json +120 -0
- angr/procedures/definitions/win32/dinput8.json +18 -0
- angr/procedures/definitions/win32/directml.json +21 -0
- angr/procedures/definitions/win32/dmprocessxmlfiltered.json +18 -0
- angr/procedures/definitions/win32/dnsapi.json +207 -0
- angr/procedures/definitions/win32/drt.json +63 -0
- angr/procedures/definitions/win32/drtprov.json +42 -0
- angr/procedures/definitions/win32/drttransport.json +21 -0
- angr/procedures/definitions/win32/dsound.json +45 -0
- angr/procedures/definitions/win32/dsparse.json +72 -0
- angr/procedures/definitions/win32/dsprop.json +36 -0
- angr/procedures/definitions/win32/dssec.json +27 -0
- angr/procedures/definitions/win32/dsuiext.json +27 -0
- angr/procedures/definitions/win32/dwmapi.json +108 -0
- angr/procedures/definitions/win32/dwrite.json +18 -0
- angr/procedures/definitions/win32/dxcompiler.json +21 -0
- angr/procedures/definitions/win32/dxcore.json +18 -0
- angr/procedures/definitions/win32/dxgi.json +33 -0
- angr/procedures/definitions/win32/dxva2.json +129 -0
- angr/procedures/definitions/win32/eappcfg.json +57 -0
- angr/procedures/definitions/win32/eappprxy.json +69 -0
- angr/procedures/definitions/win32/efswrt.json +21 -0
- angr/procedures/definitions/win32/elscore.json +30 -0
- angr/procedures/definitions/win32/esent.json +702 -0
- angr/procedures/definitions/win32/evr.json +36 -0
- angr/procedures/definitions/win32/faultrep.json +27 -0
- angr/procedures/definitions/win32/fhsvcctl.json +36 -0
- angr/procedures/definitions/win32/firewallapi.json +24 -0
- angr/procedures/definitions/win32/fltlib.json +99 -0
- angr/procedures/definitions/win32/fontsub.json +21 -0
- angr/procedures/definitions/win32/forceinline.json +24 -0
- angr/procedures/definitions/win32/fwpuclnt.json +591 -0
- angr/procedures/definitions/win32/fxsutility.json +21 -0
- angr/procedures/definitions/win32/gdi32.json +1308 -0
- angr/procedures/definitions/win32/gdiplus.json +1902 -0
- angr/procedures/definitions/win32/glu32.json +171 -0
- angr/procedures/definitions/win32/gpedit.json +33 -0
- angr/procedures/definitions/win32/hhctrl_ocx.json +21 -0
- angr/procedures/definitions/win32/hid.json +150 -0
- angr/procedures/definitions/win32/hlink.json +99 -0
- angr/procedures/definitions/win32/hrtfapo.json +18 -0
- angr/procedures/definitions/win32/httpapi.json +144 -0
- angr/procedures/definitions/win32/icm32.json +78 -0
- angr/procedures/definitions/win32/icmui.json +21 -0
- angr/procedures/definitions/win32/icu.json +3090 -0
- angr/procedures/definitions/win32/ieframe.json +102 -0
- angr/procedures/definitions/win32/imagehlp.json +84 -0
- angr/procedures/definitions/win32/imgutil.json +42 -0
- angr/procedures/definitions/win32/imm32.json +261 -0
- angr/procedures/definitions/win32/infocardapi.json +66 -0
- angr/procedures/definitions/win32/inkobjcore.json +96 -0
- angr/procedures/definitions/win32/iphlpapi.json +618 -0
- angr/procedures/definitions/win32/iscsidsc.json +252 -0
- angr/procedures/definitions/win32/isolatedwindowsenvironmentutils.json +21 -0
- angr/procedures/definitions/win32/kernel32.json +4566 -0
- angr/procedures/definitions/win32/kernelbase.json +33 -0
- angr/procedures/definitions/win32/keycredmgr.json +27 -0
- angr/procedures/definitions/win32/ksproxy_ax.json +33 -0
- angr/procedures/definitions/win32/ksuser.json +39 -0
- angr/procedures/definitions/win32/ktmw32.json +132 -0
- angr/procedures/definitions/win32/licenseprotection.json +21 -0
- angr/procedures/definitions/win32/loadperf.json +51 -0
- angr/procedures/definitions/win32/magnification.json +72 -0
- angr/procedures/definitions/win32/mapi32.json +213 -0
- angr/procedures/definitions/win32/mdmlocalmanagement.json +24 -0
- angr/procedures/definitions/win32/mdmregistration.json +60 -0
- angr/procedures/definitions/win32/mf.json +201 -0
- angr/procedures/definitions/win32/mfcore.json +21 -0
- angr/procedures/definitions/win32/mfplat.json +450 -0
- angr/procedures/definitions/win32/mfplay.json +18 -0
- angr/procedures/definitions/win32/mfreadwrite.json +30 -0
- angr/procedures/definitions/win32/mfsensorgroup.json +45 -0
- angr/procedures/definitions/win32/mfsrcsnk.json +21 -0
- angr/procedures/definitions/win32/mgmtapi.json +42 -0
- angr/procedures/definitions/win32/mi.json +18 -0
- angr/procedures/definitions/win32/mmdevapi.json +18 -0
- angr/procedures/definitions/win32/mpr.json +156 -0
- angr/procedures/definitions/win32/mprapi.json +351 -0
- angr/procedures/definitions/win32/mqrt.json +117 -0
- angr/procedures/definitions/win32/mrmsupport.json +96 -0
- angr/procedures/definitions/win32/msacm32.json +141 -0
- angr/procedures/definitions/win32/msajapi.json +1656 -0
- angr/procedures/definitions/win32/mscms.json +252 -0
- angr/procedures/definitions/win32/mscoree.json +96 -0
- angr/procedures/definitions/win32/msctfmonitor.json +24 -0
- angr/procedures/definitions/win32/msdelta.json +63 -0
- angr/procedures/definitions/win32/msdmo.json +48 -0
- angr/procedures/definitions/win32/msdrm.json +267 -0
- angr/procedures/definitions/win32/msi.json +807 -0
- angr/procedures/definitions/win32/msimg32.json +24 -0
- angr/procedures/definitions/win32/mspatcha.json +63 -0
- angr/procedures/definitions/win32/mspatchc.json +42 -0
- angr/procedures/definitions/win32/msports.json +36 -0
- angr/procedures/definitions/win32/msrating.json +72 -0
- angr/procedures/definitions/win32/mssign32.json +45 -0
- angr/procedures/definitions/win32/mstask.json +21 -0
- angr/procedures/definitions/win32/msvfw32.json +144 -0
- angr/procedures/definitions/win32/mswsock.json +63 -0
- angr/procedures/definitions/win32/mtxdm.json +18 -0
- angr/procedures/definitions/win32/ncrypt.json +132 -0
- angr/procedures/definitions/win32/ndfapi.json +63 -0
- angr/procedures/definitions/win32/netapi32.json +633 -0
- angr/procedures/definitions/win32/netsh.json +39 -0
- angr/procedures/definitions/win32/netshell.json +21 -0
- angr/procedures/definitions/win32/newdev.json +48 -0
- angr/procedures/definitions/win32/ninput.json +105 -0
- angr/procedures/definitions/win32/normaliz.json +21 -0
- angr/procedures/definitions/win32/ntdll.json +234 -0
- angr/procedures/definitions/win32/ntdllk.json +18 -0
- angr/procedures/definitions/win32/ntdsapi.json +258 -0
- angr/procedures/definitions/win32/ntlanman.json +45 -0
- angr/procedures/definitions/win32/odbc32.json +477 -0
- angr/procedures/definitions/win32/odbcbcp.json +96 -0
- angr/procedures/definitions/win32/ole32.json +966 -0
- angr/procedures/definitions/win32/oleacc.json +66 -0
- angr/procedures/definitions/win32/oleaut32.json +1230 -0
- angr/procedures/definitions/win32/oledlg.json +84 -0
- angr/procedures/definitions/win32/ondemandconnroutehelper.json +30 -0
- angr/procedures/definitions/win32/opengl32.json +1080 -0
- angr/procedures/definitions/win32/opmxbox.json +24 -0
- angr/procedures/definitions/win32/p2p.json +339 -0
- angr/procedures/definitions/win32/p2pgraph.json +126 -0
- angr/procedures/definitions/win32/pdh.json +309 -0
- angr/procedures/definitions/win32/peerdist.json +99 -0
- angr/procedures/definitions/win32/powrprof.json +267 -0
- angr/procedures/definitions/win32/prntvpt.json +48 -0
- angr/procedures/definitions/win32/projectedfslib.json +72 -0
- angr/procedures/definitions/win32/propsys.json +669 -0
- angr/procedures/definitions/win32/psapi.json +96 -0
- angr/procedures/definitions/win32/quartz.json +21 -0
- angr/procedures/definitions/win32/query.json +27 -0
- angr/procedures/definitions/win32/qwave.json +48 -0
- angr/procedures/definitions/win32/rasapi32.json +267 -0
- angr/procedures/definitions/win32/rasdlg.json +33 -0
- angr/procedures/definitions/win32/resutils.json +375 -0
- angr/procedures/definitions/win32/rpcns4.json +198 -0
- angr/procedures/definitions/win32/rpcproxy.json +27 -0
- angr/procedures/definitions/win32/rpcrt4.json +1356 -0
- angr/procedures/definitions/win32/rstrtmgr.json +48 -0
- angr/procedures/definitions/win32/rtm.json +243 -0
- angr/procedures/definitions/win32/rtutils.json +138 -0
- angr/procedures/definitions/win32/rtworkq.json +114 -0
- angr/procedures/definitions/win32/sas.json +18 -0
- angr/procedures/definitions/win32/scarddlg.json +30 -0
- angr/procedures/definitions/win32/schannel.json +42 -0
- angr/procedures/definitions/win32/sechost.json +21 -0
- angr/procedures/definitions/win32/secur32.json +282 -0
- angr/procedures/definitions/win32/sensapi.json +24 -0
- angr/procedures/definitions/win32/sensorsutilsv2.json +135 -0
- angr/procedures/definitions/win32/setupapi.json +1017 -0
- angr/procedures/definitions/win32/sfc.json +33 -0
- angr/procedures/definitions/win32/shdocvw.json +24 -0
- angr/procedures/definitions/win32/shell32.json +747 -0
- angr/procedures/definitions/win32/shlwapi.json +1095 -0
- angr/procedures/definitions/win32/slc.json +111 -0
- angr/procedures/definitions/win32/slcext.json +27 -0
- angr/procedures/definitions/win32/slwga.json +18 -0
- angr/procedures/definitions/win32/snmpapi.json +93 -0
- angr/procedures/definitions/win32/spoolss.json +93 -0
- angr/procedures/definitions/win32/srclient.json +18 -0
- angr/procedures/definitions/win32/srpapi.json +48 -0
- angr/procedures/definitions/win32/sspicli.json +36 -0
- angr/procedures/definitions/win32/sti.json +18 -0
- angr/procedures/definitions/win32/t2embed.json +57 -0
- angr/procedures/definitions/win32/tapi32.json +762 -0
- angr/procedures/definitions/win32/tbs.json +57 -0
- angr/procedures/definitions/win32/tdh.json +96 -0
- angr/procedures/definitions/win32/tokenbinding.json +45 -0
- angr/procedures/definitions/win32/traffic.json +75 -0
- angr/procedures/definitions/win32/txfw32.json +42 -0
- angr/procedures/definitions/win32/ualapi.json +27 -0
- angr/procedures/definitions/win32/uiautomationcore.json +309 -0
- angr/procedures/definitions/win32/urlmon.json +246 -0
- angr/procedures/definitions/win32/user32.json +2298 -0
- angr/procedures/definitions/win32/userenv.json +147 -0
- angr/procedures/definitions/win32/usp10.json +135 -0
- angr/procedures/definitions/win32/uxtheme.json +246 -0
- angr/procedures/definitions/win32/verifier.json +18 -0
- angr/procedures/definitions/win32/version.json +57 -0
- angr/procedures/definitions/win32/vertdll.json +36 -0
- angr/procedures/definitions/win32/virtdisk.json +102 -0
- angr/procedures/definitions/win32/vmdevicehost.json +54 -0
- angr/procedures/definitions/win32/vmsavedstatedumpprovider.json +144 -0
- angr/procedures/definitions/win32/vssapi.json +18 -0
- angr/procedures/definitions/win32/wcmapi.json +30 -0
- angr/procedures/definitions/win32/wdsbp.json +36 -0
- angr/procedures/definitions/win32/wdsclientapi.json +126 -0
- angr/procedures/definitions/win32/wdsmc.json +33 -0
- angr/procedures/definitions/win32/wdspxe.json +108 -0
- angr/procedures/definitions/win32/wdstptc.json +54 -0
- angr/procedures/definitions/win32/webauthn.json +54 -0
- angr/procedures/definitions/win32/webservices.json +594 -0
- angr/procedures/definitions/win32/websocket.json +54 -0
- angr/procedures/definitions/win32/wecapi.json +60 -0
- angr/procedures/definitions/win32/wer.json +78 -0
- angr/procedures/definitions/win32/wevtapi.json +120 -0
- angr/procedures/definitions/win32/winbio.json +177 -0
- angr/procedures/definitions/win32/windows_ai_machinelearning.json +18 -0
- angr/procedures/definitions/win32/windows_media_mediacontrol.json +39 -0
- angr/procedures/definitions/win32/windows_networking.json +18 -0
- angr/procedures/definitions/win32/windows_ui_xaml.json +21 -0
- angr/procedures/definitions/win32/windowscodecs.json +42 -0
- angr/procedures/definitions/win32/winfax.json +183 -0
- angr/procedures/definitions/win32/winhttp.json +183 -0
- angr/procedures/definitions/win32/winhvemulation.json +27 -0
- angr/procedures/definitions/win32/winhvplatform.json +213 -0
- angr/procedures/definitions/win32/wininet.json +903 -0
- angr/procedures/definitions/win32/winml.json +18 -0
- angr/procedures/definitions/win32/winmm.json +543 -0
- angr/procedures/definitions/win32/winscard.json +225 -0
- angr/procedures/definitions/win32/winspool_drv.json +531 -0
- angr/procedures/definitions/win32/wintrust.json +195 -0
- angr/procedures/definitions/win32/winusb.json +117 -0
- angr/procedures/definitions/win32/wlanapi.json +195 -0
- angr/procedures/definitions/win32/wlanui.json +18 -0
- angr/procedures/definitions/win32/wldap32.json +744 -0
- angr/procedures/definitions/win32/wldp.json +42 -0
- angr/procedures/definitions/win32/wmvcore.json +48 -0
- angr/procedures/definitions/win32/wnvapi.json +21 -0
- angr/procedures/definitions/win32/wofutil.json +48 -0
- angr/procedures/definitions/win32/ws2_32.json +495 -0
- angr/procedures/definitions/win32/wscapi.json +33 -0
- angr/procedures/definitions/win32/wsclient.json +24 -0
- angr/procedures/definitions/win32/wsdapi.json +111 -0
- angr/procedures/definitions/win32/wsmsvc.json +114 -0
- angr/procedures/definitions/win32/wsnmp32.json +162 -0
- angr/procedures/definitions/win32/wtsapi32.json +204 -0
- angr/procedures/definitions/win32/xaudio2_8.json +27 -0
- angr/procedures/definitions/win32/xinput1_4.json +36 -0
- angr/procedures/definitions/win32/xmllite.json +33 -0
- angr/procedures/definitions/win32/xolehlp.json +27 -0
- angr/procedures/definitions/win32/xpsprint.json +21 -0
- angr/procedures/glibc/__ctype_b_loc.py +21 -0
- angr/procedures/glibc/__ctype_tolower_loc.py +21 -0
- angr/procedures/glibc/__ctype_toupper_loc.py +21 -0
- angr/procedures/glibc/__errno_location.py +7 -0
- angr/procedures/glibc/__init__.py +3 -0
- angr/procedures/glibc/__libc_init.py +37 -0
- angr/procedures/glibc/__libc_start_main.py +301 -0
- angr/procedures/glibc/dynamic_loading.py +20 -0
- angr/procedures/glibc/scanf.py +19 -0
- angr/procedures/glibc/sscanf.py +10 -0
- angr/procedures/gnulib/__init__.py +3 -0
- angr/procedures/gnulib/xalloc_die.py +14 -0
- angr/procedures/gnulib/xstrtol_fatal.py +14 -0
- angr/procedures/java/__init__.py +42 -0
- angr/procedures/java/unconstrained.py +65 -0
- angr/procedures/java_io/__init__.py +0 -0
- angr/procedures/java_io/read.py +12 -0
- angr/procedures/java_io/write.py +17 -0
- angr/procedures/java_jni/__init__.py +482 -0
- angr/procedures/java_jni/array_operations.py +312 -0
- angr/procedures/java_jni/class_and_interface_operations.py +31 -0
- angr/procedures/java_jni/field_access.py +173 -0
- angr/procedures/java_jni/global_and_local_refs.py +57 -0
- angr/procedures/java_jni/method_calls.py +365 -0
- angr/procedures/java_jni/not_implemented.py +26 -0
- angr/procedures/java_jni/object_operations.py +94 -0
- angr/procedures/java_jni/string_operations.py +87 -0
- angr/procedures/java_jni/version_information.py +12 -0
- angr/procedures/java_lang/__init__.py +0 -0
- angr/procedures/java_lang/character.py +30 -0
- angr/procedures/java_lang/double.py +24 -0
- angr/procedures/java_lang/exit.py +13 -0
- angr/procedures/java_lang/getsimplename.py +18 -0
- angr/procedures/java_lang/integer.py +43 -0
- angr/procedures/java_lang/load_library.py +9 -0
- angr/procedures/java_lang/math.py +15 -0
- angr/procedures/java_lang/string.py +78 -0
- angr/procedures/java_lang/stringbuilder.py +44 -0
- angr/procedures/java_lang/system.py +18 -0
- angr/procedures/java_util/__init__.py +0 -0
- angr/procedures/java_util/collection.py +35 -0
- angr/procedures/java_util/iterator.py +46 -0
- angr/procedures/java_util/list.py +99 -0
- angr/procedures/java_util/map.py +131 -0
- angr/procedures/java_util/random.py +14 -0
- angr/procedures/java_util/scanner_nextline.py +23 -0
- angr/procedures/libc/__init__.py +3 -0
- angr/procedures/libc/abort.py +9 -0
- angr/procedures/libc/access.py +13 -0
- angr/procedures/libc/atoi.py +14 -0
- angr/procedures/libc/atol.py +13 -0
- angr/procedures/libc/calloc.py +8 -0
- angr/procedures/libc/closelog.py +10 -0
- angr/procedures/libc/err.py +14 -0
- angr/procedures/libc/error.py +54 -0
- angr/procedures/libc/exit.py +11 -0
- angr/procedures/libc/fclose.py +19 -0
- angr/procedures/libc/feof.py +21 -0
- angr/procedures/libc/fflush.py +16 -0
- angr/procedures/libc/fgetc.py +27 -0
- angr/procedures/libc/fgets.py +69 -0
- angr/procedures/libc/fopen.py +63 -0
- angr/procedures/libc/fprintf.py +25 -0
- angr/procedures/libc/fputc.py +23 -0
- angr/procedures/libc/fputs.py +24 -0
- angr/procedures/libc/fread.py +24 -0
- angr/procedures/libc/free.py +9 -0
- angr/procedures/libc/fscanf.py +20 -0
- angr/procedures/libc/fseek.py +34 -0
- angr/procedures/libc/ftell.py +22 -0
- angr/procedures/libc/fwrite.py +19 -0
- angr/procedures/libc/getchar.py +13 -0
- angr/procedures/libc/getdelim.py +99 -0
- angr/procedures/libc/getegid.py +8 -0
- angr/procedures/libc/geteuid.py +8 -0
- angr/procedures/libc/getgid.py +8 -0
- angr/procedures/libc/gets.py +68 -0
- angr/procedures/libc/getuid.py +8 -0
- angr/procedures/libc/malloc.py +12 -0
- angr/procedures/libc/memcmp.py +69 -0
- angr/procedures/libc/memcpy.py +45 -0
- angr/procedures/libc/memset.py +72 -0
- angr/procedures/libc/openlog.py +10 -0
- angr/procedures/libc/perror.py +13 -0
- angr/procedures/libc/printf.py +34 -0
- angr/procedures/libc/putchar.py +13 -0
- angr/procedures/libc/puts.py +19 -0
- angr/procedures/libc/rand.py +8 -0
- angr/procedures/libc/realloc.py +8 -0
- angr/procedures/libc/rewind.py +12 -0
- angr/procedures/libc/scanf.py +20 -0
- angr/procedures/libc/setbuf.py +9 -0
- angr/procedures/libc/setvbuf.py +7 -0
- angr/procedures/libc/snprintf.py +36 -0
- angr/procedures/libc/sprintf.py +25 -0
- angr/procedures/libc/srand.py +7 -0
- angr/procedures/libc/sscanf.py +13 -0
- angr/procedures/libc/stpcpy.py +18 -0
- angr/procedures/libc/strcat.py +14 -0
- angr/procedures/libc/strchr.py +48 -0
- angr/procedures/libc/strcmp.py +31 -0
- angr/procedures/libc/strcpy.py +13 -0
- angr/procedures/libc/strlen.py +114 -0
- angr/procedures/libc/strncat.py +19 -0
- angr/procedures/libc/strncmp.py +183 -0
- angr/procedures/libc/strncpy.py +22 -0
- angr/procedures/libc/strnlen.py +13 -0
- angr/procedures/libc/strstr.py +101 -0
- angr/procedures/libc/strtol.py +261 -0
- angr/procedures/libc/strtoul.py +9 -0
- angr/procedures/libc/system.py +13 -0
- angr/procedures/libc/time.py +9 -0
- angr/procedures/libc/tmpnam.py +20 -0
- angr/procedures/libc/tolower.py +10 -0
- angr/procedures/libc/toupper.py +10 -0
- angr/procedures/libc/ungetc.py +20 -0
- angr/procedures/libc/vsnprintf.py +17 -0
- angr/procedures/libc/wchar.py +16 -0
- angr/procedures/libstdcpp/__init__.py +0 -0
- angr/procedures/libstdcpp/_unwind_resume.py +11 -0
- angr/procedures/libstdcpp/std____throw_bad_alloc.py +13 -0
- angr/procedures/libstdcpp/std____throw_bad_cast.py +13 -0
- angr/procedures/libstdcpp/std____throw_length_error.py +13 -0
- angr/procedures/libstdcpp/std____throw_logic_error.py +13 -0
- angr/procedures/libstdcpp/std__terminate.py +13 -0
- angr/procedures/linux_kernel/__init__.py +3 -0
- angr/procedures/linux_kernel/access.py +18 -0
- angr/procedures/linux_kernel/arch_prctl.py +34 -0
- angr/procedures/linux_kernel/arm_user_helpers.py +59 -0
- angr/procedures/linux_kernel/brk.py +18 -0
- angr/procedures/linux_kernel/cwd.py +28 -0
- angr/procedures/linux_kernel/fstat.py +138 -0
- angr/procedures/linux_kernel/fstat64.py +170 -0
- angr/procedures/linux_kernel/futex.py +17 -0
- angr/procedures/linux_kernel/getegid.py +17 -0
- angr/procedures/linux_kernel/geteuid.py +17 -0
- angr/procedures/linux_kernel/getgid.py +17 -0
- angr/procedures/linux_kernel/getpid.py +14 -0
- angr/procedures/linux_kernel/getrlimit.py +24 -0
- angr/procedures/linux_kernel/gettid.py +9 -0
- angr/procedures/linux_kernel/getuid.py +17 -0
- angr/procedures/linux_kernel/iovec.py +47 -0
- angr/procedures/linux_kernel/lseek.py +42 -0
- angr/procedures/linux_kernel/mmap.py +16 -0
- angr/procedures/linux_kernel/mprotect.py +42 -0
- angr/procedures/linux_kernel/munmap.py +8 -0
- angr/procedures/linux_kernel/openat.py +26 -0
- angr/procedures/linux_kernel/set_tid_address.py +8 -0
- angr/procedures/linux_kernel/sigaction.py +19 -0
- angr/procedures/linux_kernel/sigprocmask.py +23 -0
- angr/procedures/linux_kernel/stat.py +23 -0
- angr/procedures/linux_kernel/sysinfo.py +59 -0
- angr/procedures/linux_kernel/tgkill.py +10 -0
- angr/procedures/linux_kernel/time.py +34 -0
- angr/procedures/linux_kernel/uid.py +30 -0
- angr/procedures/linux_kernel/uname.py +29 -0
- angr/procedures/linux_kernel/unlink.py +22 -0
- angr/procedures/linux_kernel/vsyscall.py +16 -0
- angr/procedures/linux_loader/__init__.py +3 -0
- angr/procedures/linux_loader/_dl_initial_error_catch_tsd.py +7 -0
- angr/procedures/linux_loader/_dl_rtld_lock.py +15 -0
- angr/procedures/linux_loader/sim_loader.py +54 -0
- angr/procedures/linux_loader/tls.py +40 -0
- angr/procedures/msvcr/__getmainargs.py +16 -0
- angr/procedures/msvcr/__init__.py +4 -0
- angr/procedures/msvcr/_initterm.py +38 -0
- angr/procedures/msvcr/fmode.py +31 -0
- angr/procedures/ntdll/__init__.py +0 -0
- angr/procedures/ntdll/exceptions.py +60 -0
- angr/procedures/posix/__init__.py +3 -0
- angr/procedures/posix/accept.py +29 -0
- angr/procedures/posix/bind.py +13 -0
- angr/procedures/posix/bzero.py +9 -0
- angr/procedures/posix/chroot.py +27 -0
- angr/procedures/posix/close.py +9 -0
- angr/procedures/posix/closedir.py +7 -0
- angr/procedures/posix/dup.py +56 -0
- angr/procedures/posix/fcntl.py +10 -0
- angr/procedures/posix/fdopen.py +76 -0
- angr/procedures/posix/fileno.py +18 -0
- angr/procedures/posix/fork.py +13 -0
- angr/procedures/posix/getenv.py +35 -0
- angr/procedures/posix/gethostbyname.py +43 -0
- angr/procedures/posix/getpass.py +19 -0
- angr/procedures/posix/getsockopt.py +11 -0
- angr/procedures/posix/htonl.py +11 -0
- angr/procedures/posix/htons.py +11 -0
- angr/procedures/posix/inet_ntoa.py +59 -0
- angr/procedures/posix/listen.py +13 -0
- angr/procedures/posix/mmap.py +144 -0
- angr/procedures/posix/open.py +18 -0
- angr/procedures/posix/opendir.py +10 -0
- angr/procedures/posix/poll.py +55 -0
- angr/procedures/posix/pread64.py +46 -0
- angr/procedures/posix/pthread.py +87 -0
- angr/procedures/posix/pwrite64.py +46 -0
- angr/procedures/posix/read.py +13 -0
- angr/procedures/posix/readdir.py +62 -0
- angr/procedures/posix/recv.py +13 -0
- angr/procedures/posix/recvfrom.py +13 -0
- angr/procedures/posix/select.py +48 -0
- angr/procedures/posix/send.py +23 -0
- angr/procedures/posix/setsockopt.py +9 -0
- angr/procedures/posix/sigaction.py +23 -0
- angr/procedures/posix/sim_time.py +48 -0
- angr/procedures/posix/sleep.py +8 -0
- angr/procedures/posix/socket.py +18 -0
- angr/procedures/posix/strcasecmp.py +26 -0
- angr/procedures/posix/strdup.py +18 -0
- angr/procedures/posix/strtok_r.py +64 -0
- angr/procedures/posix/syslog.py +15 -0
- angr/procedures/posix/tz.py +9 -0
- angr/procedures/posix/unlink.py +11 -0
- angr/procedures/posix/usleep.py +8 -0
- angr/procedures/posix/write.py +13 -0
- angr/procedures/procedure_dict.py +50 -0
- angr/procedures/stubs/CallReturn.py +13 -0
- angr/procedures/stubs/NoReturnUnconstrained.py +13 -0
- angr/procedures/stubs/Nop.py +7 -0
- angr/procedures/stubs/PathTerminator.py +9 -0
- angr/procedures/stubs/Redirect.py +18 -0
- angr/procedures/stubs/ReturnChar.py +11 -0
- angr/procedures/stubs/ReturnUnconstrained.py +24 -0
- angr/procedures/stubs/UnresolvableCallTarget.py +9 -0
- angr/procedures/stubs/UnresolvableJumpTarget.py +9 -0
- angr/procedures/stubs/UserHook.py +18 -0
- angr/procedures/stubs/__init__.py +3 -0
- angr/procedures/stubs/b64_decode.py +15 -0
- angr/procedures/stubs/caller.py +14 -0
- angr/procedures/stubs/crazy_scanf.py +20 -0
- angr/procedures/stubs/format_parser.py +669 -0
- angr/procedures/stubs/syscall_stub.py +24 -0
- angr/procedures/testing/__init__.py +3 -0
- angr/procedures/testing/manyargs.py +9 -0
- angr/procedures/testing/retreg.py +8 -0
- angr/procedures/tracer/__init__.py +4 -0
- angr/procedures/tracer/random.py +9 -0
- angr/procedures/tracer/receive.py +23 -0
- angr/procedures/tracer/transmit.py +26 -0
- angr/procedures/uclibc/__init__.py +3 -0
- angr/procedures/uclibc/__uClibc_main.py +10 -0
- angr/procedures/win32/EncodePointer.py +7 -0
- angr/procedures/win32/ExitProcess.py +9 -0
- angr/procedures/win32/GetCommandLine.py +12 -0
- angr/procedures/win32/GetCurrentProcessId.py +7 -0
- angr/procedures/win32/GetCurrentThreadId.py +7 -0
- angr/procedures/win32/GetLastInputInfo.py +40 -0
- angr/procedures/win32/GetModuleHandle.py +29 -0
- angr/procedures/win32/GetProcessAffinityMask.py +37 -0
- angr/procedures/win32/InterlockedExchange.py +15 -0
- angr/procedures/win32/IsProcessorFeaturePresent.py +7 -0
- angr/procedures/win32/VirtualAlloc.py +114 -0
- angr/procedures/win32/VirtualProtect.py +60 -0
- angr/procedures/win32/__init__.py +3 -0
- angr/procedures/win32/critical_section.py +12 -0
- angr/procedures/win32/dynamic_loading.py +104 -0
- angr/procedures/win32/file_handles.py +47 -0
- angr/procedures/win32/gethostbyname.py +12 -0
- angr/procedures/win32/heap.py +45 -0
- angr/procedures/win32/is_bad_ptr.py +26 -0
- angr/procedures/win32/local_storage.py +88 -0
- angr/procedures/win32/mutex.py +11 -0
- angr/procedures/win32/sim_time.py +135 -0
- angr/procedures/win32/system_paths.py +35 -0
- angr/procedures/win32_kernel/ExAllocatePool.py +13 -0
- angr/procedures/win32_kernel/ExFreePoolWithTag.py +8 -0
- angr/procedures/win32_kernel/__fastfail.py +15 -0
- angr/procedures/win32_kernel/__init__.py +3 -0
- angr/procedures/win_user32/__init__.py +0 -0
- angr/procedures/win_user32/chars.py +15 -0
- angr/procedures/win_user32/keyboard.py +14 -0
- angr/procedures/win_user32/messagebox.py +49 -0
- angr/project.py +860 -0
- angr/protos/__init__.py +19 -0
- angr/protos/cfg_pb2.py +42 -0
- angr/protos/function_pb2.py +38 -0
- angr/protos/primitives_pb2.py +59 -0
- angr/protos/variables_pb2.py +55 -0
- angr/protos/xrefs_pb2.py +36 -0
- angr/py.typed +1 -0
- angr/rustylib.cpython-311-darwin.so +0 -0
- angr/serializable.py +66 -0
- angr/sim_manager.py +971 -0
- angr/sim_options.py +436 -0
- angr/sim_procedure.py +626 -0
- angr/sim_state.py +926 -0
- angr/sim_state_options.py +403 -0
- angr/sim_type.py +4026 -0
- angr/sim_variable.py +470 -0
- angr/simos/__init__.py +47 -0
- angr/simos/cgc.py +153 -0
- angr/simos/javavm.py +458 -0
- angr/simos/linux.py +509 -0
- angr/simos/simos.py +444 -0
- angr/simos/snimmuc_nxp.py +149 -0
- angr/simos/userland.py +163 -0
- angr/simos/windows.py +615 -0
- angr/simos/xbox.py +32 -0
- angr/slicer.py +352 -0
- angr/state_hierarchy.py +262 -0
- angr/state_plugins/__init__.py +84 -0
- angr/state_plugins/callstack.py +478 -0
- angr/state_plugins/cgc.py +155 -0
- angr/state_plugins/debug_variables.py +192 -0
- angr/state_plugins/filesystem.py +463 -0
- angr/state_plugins/gdb.py +148 -0
- angr/state_plugins/globals.py +65 -0
- angr/state_plugins/heap/__init__.py +15 -0
- angr/state_plugins/heap/heap_base.py +128 -0
- angr/state_plugins/heap/heap_brk.py +136 -0
- angr/state_plugins/heap/heap_freelist.py +213 -0
- angr/state_plugins/heap/heap_libc.py +46 -0
- angr/state_plugins/heap/heap_ptmalloc.py +620 -0
- angr/state_plugins/heap/utils.py +22 -0
- angr/state_plugins/history.py +564 -0
- angr/state_plugins/inspect.py +375 -0
- angr/state_plugins/javavm_classloader.py +134 -0
- angr/state_plugins/jni_references.py +95 -0
- angr/state_plugins/libc.py +1263 -0
- angr/state_plugins/light_registers.py +168 -0
- angr/state_plugins/log.py +84 -0
- angr/state_plugins/loop_data.py +92 -0
- angr/state_plugins/plugin.py +176 -0
- angr/state_plugins/posix.py +703 -0
- angr/state_plugins/preconstrainer.py +196 -0
- angr/state_plugins/scratch.py +173 -0
- angr/state_plugins/sim_action.py +326 -0
- angr/state_plugins/sim_action_object.py +271 -0
- angr/state_plugins/sim_event.py +59 -0
- angr/state_plugins/solver.py +1128 -0
- angr/state_plugins/symbolizer.py +291 -0
- angr/state_plugins/trace_additions.py +738 -0
- angr/state_plugins/uc_manager.py +94 -0
- angr/state_plugins/unicorn_engine.py +1920 -0
- angr/state_plugins/view.py +340 -0
- angr/storage/__init__.py +15 -0
- angr/storage/file.py +1210 -0
- angr/storage/memory_mixins/__init__.py +317 -0
- angr/storage/memory_mixins/actions_mixin.py +72 -0
- angr/storage/memory_mixins/address_concretization_mixin.py +384 -0
- angr/storage/memory_mixins/bvv_conversion_mixin.py +73 -0
- angr/storage/memory_mixins/clouseau_mixin.py +137 -0
- angr/storage/memory_mixins/conditional_store_mixin.py +25 -0
- angr/storage/memory_mixins/convenient_mappings_mixin.py +256 -0
- angr/storage/memory_mixins/default_filler_mixin.py +144 -0
- angr/storage/memory_mixins/dirty_addrs_mixin.py +11 -0
- angr/storage/memory_mixins/hex_dumper_mixin.py +82 -0
- angr/storage/memory_mixins/javavm_memory_mixin.py +392 -0
- angr/storage/memory_mixins/keyvalue_memory_mixin.py +43 -0
- angr/storage/memory_mixins/label_merger_mixin.py +31 -0
- angr/storage/memory_mixins/memory_mixin.py +175 -0
- angr/storage/memory_mixins/multi_value_merger_mixin.py +79 -0
- angr/storage/memory_mixins/name_resolution_mixin.py +67 -0
- angr/storage/memory_mixins/paged_memory/__init__.py +0 -0
- angr/storage/memory_mixins/paged_memory/page_backer_mixins.py +266 -0
- angr/storage/memory_mixins/paged_memory/paged_memory_mixin.py +743 -0
- angr/storage/memory_mixins/paged_memory/paged_memory_multivalue_mixin.py +65 -0
- angr/storage/memory_mixins/paged_memory/pages/__init__.py +26 -0
- angr/storage/memory_mixins/paged_memory/pages/base.py +31 -0
- angr/storage/memory_mixins/paged_memory/pages/cooperation.py +341 -0
- angr/storage/memory_mixins/paged_memory/pages/history_tracking_mixin.py +92 -0
- angr/storage/memory_mixins/paged_memory/pages/ispo_mixin.py +55 -0
- angr/storage/memory_mixins/paged_memory/pages/list_page.py +338 -0
- angr/storage/memory_mixins/paged_memory/pages/multi_values.py +324 -0
- angr/storage/memory_mixins/paged_memory/pages/mv_list_page.py +419 -0
- angr/storage/memory_mixins/paged_memory/pages/permissions_mixin.py +36 -0
- angr/storage/memory_mixins/paged_memory/pages/refcount_mixin.py +52 -0
- angr/storage/memory_mixins/paged_memory/pages/ultra_page.py +529 -0
- angr/storage/memory_mixins/paged_memory/privileged_mixin.py +36 -0
- angr/storage/memory_mixins/paged_memory/stack_allocation_mixin.py +74 -0
- angr/storage/memory_mixins/regioned_memory/__init__.py +17 -0
- angr/storage/memory_mixins/regioned_memory/abstract_address_descriptor.py +36 -0
- angr/storage/memory_mixins/regioned_memory/abstract_merger_mixin.py +31 -0
- angr/storage/memory_mixins/regioned_memory/region_category_mixin.py +9 -0
- angr/storage/memory_mixins/regioned_memory/region_data.py +246 -0
- angr/storage/memory_mixins/regioned_memory/region_meta_mixin.py +241 -0
- angr/storage/memory_mixins/regioned_memory/regioned_address_concretization_mixin.py +119 -0
- angr/storage/memory_mixins/regioned_memory/regioned_memory_mixin.py +442 -0
- angr/storage/memory_mixins/regioned_memory/static_find_mixin.py +69 -0
- angr/storage/memory_mixins/simple_interface_mixin.py +71 -0
- angr/storage/memory_mixins/simplification_mixin.py +15 -0
- angr/storage/memory_mixins/size_resolution_mixin.py +143 -0
- angr/storage/memory_mixins/slotted_memory.py +140 -0
- angr/storage/memory_mixins/smart_find_mixin.py +161 -0
- angr/storage/memory_mixins/symbolic_merger_mixin.py +16 -0
- angr/storage/memory_mixins/top_merger_mixin.py +25 -0
- angr/storage/memory_mixins/underconstrained_mixin.py +67 -0
- angr/storage/memory_mixins/unwrapper_mixin.py +26 -0
- angr/storage/memory_object.py +195 -0
- angr/tablespecs.py +91 -0
- angr/unicornlib.dylib +0 -0
- angr/utils/__init__.py +46 -0
- angr/utils/ail.py +176 -0
- angr/utils/algo.py +34 -0
- angr/utils/balancer.py +776 -0
- angr/utils/bits.py +46 -0
- angr/utils/constants.py +9 -0
- angr/utils/cowdict.py +63 -0
- angr/utils/cpp.py +17 -0
- angr/utils/doms.py +150 -0
- angr/utils/dynamic_dictlist.py +89 -0
- angr/utils/endness.py +18 -0
- angr/utils/enums_conv.py +97 -0
- angr/utils/env.py +12 -0
- angr/utils/formatting.py +128 -0
- angr/utils/funcid.py +244 -0
- angr/utils/graph.py +981 -0
- angr/utils/lazy_import.py +13 -0
- angr/utils/library.py +236 -0
- angr/utils/loader.py +55 -0
- angr/utils/mp.py +66 -0
- angr/utils/orderedset.py +74 -0
- angr/utils/ssa/__init__.py +455 -0
- angr/utils/ssa/tmp_uses_collector.py +23 -0
- angr/utils/ssa/vvar_uses_collector.py +36 -0
- angr/utils/strings.py +20 -0
- angr/utils/tagged_interval_map.py +112 -0
- angr/utils/timing.py +74 -0
- angr/utils/types.py +193 -0
- angr/utils/vex.py +11 -0
- angr/vaults.py +367 -0
- angr-9.2.192.dist-info/METADATA +112 -0
- angr-9.2.192.dist-info/RECORD +1442 -0
- angr-9.2.192.dist-info/WHEEL +6 -0
- angr-9.2.192.dist-info/entry_points.txt +2 -0
- angr-9.2.192.dist-info/licenses/LICENSE +27 -0
- angr-9.2.192.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,1098 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import logging
|
|
4
|
+
from typing import TYPE_CHECKING
|
|
5
|
+
|
|
6
|
+
import claripy
|
|
7
|
+
import cle
|
|
8
|
+
from capstone import CS_GRP_CALL, CS_GRP_IRET, CS_GRP_JUMP, CS_GRP_RET
|
|
9
|
+
|
|
10
|
+
from angr import BP_BEFORE, BP_AFTER, sim_options
|
|
11
|
+
from angr.errors import AngrTracerError, SimIRSBNoDecodeError
|
|
12
|
+
from .base import ExplorationTechnique
|
|
13
|
+
|
|
14
|
+
if TYPE_CHECKING:
|
|
15
|
+
from angr.sim_state import SimState
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
l = logging.getLogger(name=__name__)
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class TracingMode:
|
|
22
|
+
"""
|
|
23
|
+
:ivar Strict: Strict mode, the default mode, where an exception is raised immediately if tracer's path
|
|
24
|
+
deviates from the provided trace.
|
|
25
|
+
:ivar Permissive: Permissive mode, where tracer attempts to force the path back to the provided trace when a
|
|
26
|
+
deviation happens. This does not always work, especially when the cause of deviation is related
|
|
27
|
+
to input that will later be used in exploit generation. But, it might work magically sometimes.
|
|
28
|
+
:ivar CatchDesync: CatchDesync mode, catch desync because of sim_procedures. It might be a sign of something
|
|
29
|
+
interesting.
|
|
30
|
+
"""
|
|
31
|
+
|
|
32
|
+
Strict = "strict"
|
|
33
|
+
Permissive = "permissive"
|
|
34
|
+
CatchDesync = "catch_desync"
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
class TracerDesyncError(AngrTracerError):
|
|
38
|
+
"""
|
|
39
|
+
An error class to report tracing Tracing desyncronization error
|
|
40
|
+
"""
|
|
41
|
+
|
|
42
|
+
def __init__(self, msg, deviating_addr=None, deviating_trace_idx=None):
|
|
43
|
+
super().__init__(msg)
|
|
44
|
+
self.deviating_addr = deviating_addr
|
|
45
|
+
self.deviating_trace_idx = deviating_trace_idx
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
class RepHook:
|
|
49
|
+
"""
|
|
50
|
+
Hook rep movs/stos to speed up constraint solving
|
|
51
|
+
TODO: This should be made an exploration technique later
|
|
52
|
+
"""
|
|
53
|
+
|
|
54
|
+
def __init__(self, mnemonic):
|
|
55
|
+
self.mnemonic = mnemonic
|
|
56
|
+
|
|
57
|
+
@staticmethod
|
|
58
|
+
def _inline_call(state, procedure, *arguments, **kwargs):
|
|
59
|
+
e_args = [claripy.BVV(a, state.arch.bits) if isinstance(a, int) else a for a in arguments]
|
|
60
|
+
p = procedure(project=state.project, **kwargs)
|
|
61
|
+
return p.execute(state, None, arguments=e_args)
|
|
62
|
+
|
|
63
|
+
def run(self, state):
|
|
64
|
+
from angr import SIM_PROCEDURES # pylint: disable=import-outside-toplevel
|
|
65
|
+
|
|
66
|
+
dst = state.regs.edi if state.arch.name == "X86" else state.regs.rdi
|
|
67
|
+
|
|
68
|
+
if self.mnemonic.startswith("stos"):
|
|
69
|
+
# store a string
|
|
70
|
+
if self.mnemonic == "stosb":
|
|
71
|
+
val = state.regs.al
|
|
72
|
+
multiplier = 1
|
|
73
|
+
elif self.mnemonic == "stosw":
|
|
74
|
+
val = state.regs.ax
|
|
75
|
+
multiplier = 2
|
|
76
|
+
elif self.mnemonic == "stosd":
|
|
77
|
+
val = state.regs.eax
|
|
78
|
+
multiplier = 4
|
|
79
|
+
elif self.mnemonic == "stosq":
|
|
80
|
+
val = state.regs.rax
|
|
81
|
+
multiplier = 8
|
|
82
|
+
else:
|
|
83
|
+
raise NotImplementedError(f"Unsupported mnemonic {self.mnemonic}")
|
|
84
|
+
|
|
85
|
+
size = (state.regs.ecx if state.arch.name == "X86" else state.regs.rcx) * multiplier
|
|
86
|
+
|
|
87
|
+
memset = SIM_PROCEDURES["libc"]["memset"]
|
|
88
|
+
memset().execute(state, arguments=[dst, val, size])
|
|
89
|
+
|
|
90
|
+
if state.arch.name == "X86":
|
|
91
|
+
state.regs.edi += size
|
|
92
|
+
state.regs.ecx = 0
|
|
93
|
+
else:
|
|
94
|
+
state.regs.rdi += size
|
|
95
|
+
state.regs.rcx = 0
|
|
96
|
+
|
|
97
|
+
elif self.mnemonic.startswith("movs"):
|
|
98
|
+
src = state.regs.esi if state.arch.name == "X86" else state.regs.rsi
|
|
99
|
+
|
|
100
|
+
# copy a string
|
|
101
|
+
if self.mnemonic == "movsb":
|
|
102
|
+
multiplier = 1
|
|
103
|
+
elif self.mnemonic == "movsw":
|
|
104
|
+
multiplier = 2
|
|
105
|
+
elif self.mnemonic == "movsd":
|
|
106
|
+
multiplier = 4
|
|
107
|
+
elif self.mnemonic == "movsq":
|
|
108
|
+
multiplier = 8
|
|
109
|
+
else:
|
|
110
|
+
raise NotImplementedError(f"Unsupported mnemonic {self.mnemonic}")
|
|
111
|
+
|
|
112
|
+
size = (state.regs.ecx if state.arch.name == "X86" else state.regs.rcx) * multiplier
|
|
113
|
+
|
|
114
|
+
memcpy = SIM_PROCEDURES["libc"]["memcpy"]
|
|
115
|
+
memcpy().execute(state, arguments=[dst, src, size])
|
|
116
|
+
|
|
117
|
+
if state.arch.name == "X86":
|
|
118
|
+
state.regs.edi += size
|
|
119
|
+
state.regs.esi -= size
|
|
120
|
+
state.regs.ecx = 0
|
|
121
|
+
else:
|
|
122
|
+
state.regs.rdi += size
|
|
123
|
+
state.regs.rsi -= size
|
|
124
|
+
state.regs.rcx = 0
|
|
125
|
+
|
|
126
|
+
else:
|
|
127
|
+
raise NotImplementedError(f"Unsupported mnemonic {self.mnemonic}")
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
class Tracer(ExplorationTechnique):
|
|
131
|
+
"""
|
|
132
|
+
An exploration technique that follows an angr path with a concrete input.
|
|
133
|
+
The tracing result is the state at the last address of the trace, which can be found in the
|
|
134
|
+
'traced' stash.
|
|
135
|
+
|
|
136
|
+
If the given concrete input makes the program crash, you should provide crash_addr, and the
|
|
137
|
+
crashing state will be found in the 'crashed' stash.
|
|
138
|
+
|
|
139
|
+
:param trace: The basic block trace.
|
|
140
|
+
:param resiliency: Should we continue to step forward even if qemu and angr disagree?
|
|
141
|
+
:param keep_predecessors: Number of states before the final state we should log.
|
|
142
|
+
:param crash_addr: If the trace resulted in a crash, provide the crashing instruction
|
|
143
|
+
pointer here, and the 'crashed' stash will be populated with the
|
|
144
|
+
crashing state.
|
|
145
|
+
:param syscall_data: Data related to various syscalls recorded by tracer for replaying
|
|
146
|
+
:param copy_states: Whether COPY_STATES should be enabled for the tracing state. It is
|
|
147
|
+
off by default because most tracing workloads benefit greatly from
|
|
148
|
+
not performing copying. You want to enable it if you want to see
|
|
149
|
+
the missed states. It will be re-added for the last 2% of the trace
|
|
150
|
+
in order to set the predecessors list correctly. If you turn this
|
|
151
|
+
on you may want to enable the LAZY_SOLVES option.
|
|
152
|
+
:param mode: Tracing mode.
|
|
153
|
+
:param aslr: Whether there are aslr slides. if not, tracer uses trace address
|
|
154
|
+
as state address.
|
|
155
|
+
:param follow_unsat: Whether unsatisfiable states should be treated as potential
|
|
156
|
+
successors or not.
|
|
157
|
+
|
|
158
|
+
:ivar predecessors: A list of states in the history before the final state.
|
|
159
|
+
"""
|
|
160
|
+
|
|
161
|
+
def __init__(
|
|
162
|
+
self,
|
|
163
|
+
trace=None,
|
|
164
|
+
resiliency=False,
|
|
165
|
+
keep_predecessors=1,
|
|
166
|
+
crash_addr=None,
|
|
167
|
+
syscall_data=None,
|
|
168
|
+
copy_states=False,
|
|
169
|
+
fast_forward_to_entry=True,
|
|
170
|
+
mode=TracingMode.Strict,
|
|
171
|
+
aslr=True,
|
|
172
|
+
follow_unsat=False,
|
|
173
|
+
):
|
|
174
|
+
super().__init__()
|
|
175
|
+
self._trace = trace
|
|
176
|
+
self._resiliency = resiliency
|
|
177
|
+
self._crash_addr = crash_addr
|
|
178
|
+
self._syscall_data = syscall_data
|
|
179
|
+
self._copy_states = copy_states
|
|
180
|
+
self._mode = mode
|
|
181
|
+
self._aslr = aslr
|
|
182
|
+
self._follow_unsat = follow_unsat
|
|
183
|
+
self._fast_forward_to_entry = fast_forward_to_entry
|
|
184
|
+
|
|
185
|
+
self._aslr_slides: dict[cle.Backend, int] = {}
|
|
186
|
+
self._current_slide = None
|
|
187
|
+
|
|
188
|
+
self._fd_bytes = None
|
|
189
|
+
|
|
190
|
+
# keep track of the last basic block we hit
|
|
191
|
+
self.predecessors: list[SimState] = [None] * keep_predecessors
|
|
192
|
+
self.last_state = None
|
|
193
|
+
|
|
194
|
+
# whether we should follow the trace
|
|
195
|
+
self._no_follow = self._trace is None
|
|
196
|
+
|
|
197
|
+
# Keep track of count of termination point
|
|
198
|
+
self._last_block_total_count = self._trace.count(self._trace[-1])
|
|
199
|
+
self._last_block_seen_count = 0
|
|
200
|
+
|
|
201
|
+
# sanity check: copy_states must be enabled in Permissive mode since we may need to backtrack from a previous
|
|
202
|
+
# state.
|
|
203
|
+
if self._mode == TracingMode.Permissive and not self._copy_states:
|
|
204
|
+
raise ValueError('"copy_states" must be True when tracing in permissive mode.')
|
|
205
|
+
|
|
206
|
+
def _locate_entry_point(self, angr_addr):
|
|
207
|
+
# ...via heuristics
|
|
208
|
+
indices = set()
|
|
209
|
+
threshold = 0x40000
|
|
210
|
+
while not indices and threshold > 0x2000:
|
|
211
|
+
for idx, addr in enumerate(self._trace):
|
|
212
|
+
if ((addr - angr_addr) & 0xFFF) == 0 and (idx == 0 or abs(self._trace[idx - 1] - addr) > threshold):
|
|
213
|
+
indices.add(idx)
|
|
214
|
+
|
|
215
|
+
indices = {i for i in indices if self._filter_idx(angr_addr, i)}
|
|
216
|
+
threshold //= 2
|
|
217
|
+
|
|
218
|
+
return indices
|
|
219
|
+
|
|
220
|
+
def _identify_aslr_slides(self):
|
|
221
|
+
"""
|
|
222
|
+
libraries can be mapped differently in the original run(in the trace) and in angr
|
|
223
|
+
this function identifies the difference(called aslr slides) of each library to help angr translate
|
|
224
|
+
original address and address in angr back and forth
|
|
225
|
+
"""
|
|
226
|
+
if self._aslr:
|
|
227
|
+
# if we don't know whether there is any slide, we need to identify the slides via heuristics
|
|
228
|
+
for obj in self.project.loader.all_objects:
|
|
229
|
+
# do not analyze pseudo-objects
|
|
230
|
+
if obj.binary_basename.startswith("cle##"):
|
|
231
|
+
continue
|
|
232
|
+
|
|
233
|
+
# heuristic 1: non-PIC objects are loaded without aslr slides
|
|
234
|
+
if not obj.pic:
|
|
235
|
+
self._aslr_slides[obj] = 0
|
|
236
|
+
continue
|
|
237
|
+
|
|
238
|
+
# heuristic 2: library objects with custom_base_addr are loaded at the correct locations
|
|
239
|
+
if obj._custom_base_addr:
|
|
240
|
+
l.info("%s is assumed to be loaded at the address matching the one in the trace", obj)
|
|
241
|
+
self._aslr_slides[obj] = 0
|
|
242
|
+
continue
|
|
243
|
+
|
|
244
|
+
# heuristic 3: entry point of an object should appear in the trace
|
|
245
|
+
possibilities = None
|
|
246
|
+
for entry in obj.initializers + ([obj.entry] if obj.is_main_bin else []):
|
|
247
|
+
indices = self._locate_entry_point(entry)
|
|
248
|
+
slides = {self._trace[idx] - entry for idx in indices}
|
|
249
|
+
if possibilities is None:
|
|
250
|
+
possibilities = slides
|
|
251
|
+
else:
|
|
252
|
+
possibilities.intersection_update(slides)
|
|
253
|
+
|
|
254
|
+
if possibilities is None:
|
|
255
|
+
continue
|
|
256
|
+
|
|
257
|
+
if len(possibilities) == 0:
|
|
258
|
+
raise AngrTracerError(
|
|
259
|
+
f"Trace does not seem to contain object initializers for {obj}. "
|
|
260
|
+
"Do you want to have a Tracer(aslr=False)?"
|
|
261
|
+
)
|
|
262
|
+
if len(possibilities) == 1:
|
|
263
|
+
self._aslr_slides[obj] = next(iter(possibilities))
|
|
264
|
+
else:
|
|
265
|
+
raise AngrTracerError(
|
|
266
|
+
f"Trace seems ambiguous with respect to what the ASLR slides are for {obj}. "
|
|
267
|
+
"This is surmountable, please open an issue."
|
|
268
|
+
)
|
|
269
|
+
else:
|
|
270
|
+
# if we know there is no slides, just trust the address in the loader
|
|
271
|
+
for obj in self.project.loader.all_objects:
|
|
272
|
+
# do not analyze pseudo-objects
|
|
273
|
+
if obj.binary_basename.startswith("cle##"):
|
|
274
|
+
continue
|
|
275
|
+
self._aslr_slides[obj] = 0
|
|
276
|
+
self._current_slide = 0
|
|
277
|
+
|
|
278
|
+
def _filter_idx(self, angr_addr, idx):
|
|
279
|
+
slide = self._trace[idx] - angr_addr
|
|
280
|
+
block = self.project.factory.block(angr_addr)
|
|
281
|
+
legal_next = block.vex.constant_jump_targets
|
|
282
|
+
if legal_next:
|
|
283
|
+
return any(a + slide == self._trace[idx + 1] for a in legal_next)
|
|
284
|
+
# the intuition is that if the first block of an initializer does an indirect jump,
|
|
285
|
+
# it's probably a call out to another binary (notably __libc_start_main)
|
|
286
|
+
# this is an awful fucking heuristic but it's as good as we've got
|
|
287
|
+
return abs(self._trace[idx] - self._trace[idx + 1]) > 0x1000
|
|
288
|
+
|
|
289
|
+
def set_fd_data(self, fd_data: dict[int, bytes]):
|
|
290
|
+
"""
|
|
291
|
+
Set concrete bytes of various fds read by the program
|
|
292
|
+
"""
|
|
293
|
+
|
|
294
|
+
self._fd_bytes = fd_data
|
|
295
|
+
|
|
296
|
+
def setup(self, simgr):
|
|
297
|
+
simgr.populate("missed", [])
|
|
298
|
+
simgr.populate("traced", [])
|
|
299
|
+
simgr.populate("crashed", [])
|
|
300
|
+
simgr.populate("desync", [])
|
|
301
|
+
|
|
302
|
+
if len(simgr.active) != 1:
|
|
303
|
+
raise AngrTracerError("Tracer is being invoked on a SimulationManager without exactly one active state")
|
|
304
|
+
|
|
305
|
+
self._identify_aslr_slides()
|
|
306
|
+
|
|
307
|
+
if self._fast_forward_to_entry:
|
|
308
|
+
idx = self._trace.index(self._translate_state_addr(self.project.entry))
|
|
309
|
+
# step to entry point
|
|
310
|
+
while simgr.one_active.addr != self.project.entry:
|
|
311
|
+
simgr.step(extra_stop_points={self.project.entry})
|
|
312
|
+
if len(simgr.active) == 0:
|
|
313
|
+
raise AngrTracerError("Could not step to the first address of the trace - simgr is empty")
|
|
314
|
+
if len(simgr.active) > 1:
|
|
315
|
+
raise AngrTracerError(
|
|
316
|
+
"Could not step to the first address of the trace - state split. "
|
|
317
|
+
"Do you want to have a Tracer(fast_forward_to_entry=False)?"
|
|
318
|
+
)
|
|
319
|
+
simgr.drop(stash="unsat")
|
|
320
|
+
else:
|
|
321
|
+
idx = 0
|
|
322
|
+
|
|
323
|
+
# initialize the state info
|
|
324
|
+
simgr.one_active.globals["trace_idx"] = idx
|
|
325
|
+
simgr.one_active.globals["sync_idx"] = None
|
|
326
|
+
simgr.one_active.globals["sync_timer"] = 0
|
|
327
|
+
simgr.one_active.globals["is_desync"] = False
|
|
328
|
+
|
|
329
|
+
# disable state copying!
|
|
330
|
+
if not self._copy_states:
|
|
331
|
+
# insulate our caller from this nonsense by making a single copy at the beginning
|
|
332
|
+
simgr.active[0] = simgr.active[0].copy()
|
|
333
|
+
simgr.active[0].options.remove(sim_options.COPY_STATES)
|
|
334
|
+
|
|
335
|
+
def complete(self, simgr):
|
|
336
|
+
return bool(simgr.traced)
|
|
337
|
+
|
|
338
|
+
def filter(self, simgr, state, **kwargs):
|
|
339
|
+
# check completion
|
|
340
|
+
if state.globals["trace_idx"] >= len(self._trace) - 1:
|
|
341
|
+
# if the the state is a desync state and the user wants to keep it,
|
|
342
|
+
# then do what the user wants
|
|
343
|
+
if self._mode == TracingMode.CatchDesync and self.project.is_hooked(state.addr):
|
|
344
|
+
return "desync"
|
|
345
|
+
# do crash windup if necessary
|
|
346
|
+
if self._crash_addr is not None:
|
|
347
|
+
self.last_state, crash_state = self.crash_windup(state, self._crash_addr)
|
|
348
|
+
simgr.populate("crashed", [crash_state])
|
|
349
|
+
self.predecessors.append(state)
|
|
350
|
+
self.predecessors.pop(0)
|
|
351
|
+
|
|
352
|
+
return "traced"
|
|
353
|
+
|
|
354
|
+
return simgr.filter(state, **kwargs)
|
|
355
|
+
|
|
356
|
+
def step(self, simgr, stash="active", **kwargs):
|
|
357
|
+
simgr.drop(stash="missed")
|
|
358
|
+
return simgr.step(stash=stash, syscall_data=self._syscall_data, fd_bytes=self._fd_bytes, **kwargs)
|
|
359
|
+
|
|
360
|
+
def step_state(self, simgr, state, **kwargs):
|
|
361
|
+
if state.history.jumpkind == "Ijk_Exit":
|
|
362
|
+
return {"traced": [state]}
|
|
363
|
+
|
|
364
|
+
# maintain the predecessors list
|
|
365
|
+
self.predecessors.append(state)
|
|
366
|
+
self.predecessors.pop(0)
|
|
367
|
+
|
|
368
|
+
if state.globals["trace_idx"] > len(self._trace) * 0.98:
|
|
369
|
+
state.options.add(sim_options.COPY_STATES)
|
|
370
|
+
state.options.add(sim_options.LAZY_SOLVES)
|
|
371
|
+
|
|
372
|
+
# optimization:
|
|
373
|
+
# look forward, is it a rep stos/movs instruction?
|
|
374
|
+
# if so, we add a temporary hook to speed up constraint solving
|
|
375
|
+
if not self.project.is_hooked(state.addr):
|
|
376
|
+
block = self.project.factory.block(state.addr)
|
|
377
|
+
|
|
378
|
+
if len(block.capstone.insns) == 1 and (
|
|
379
|
+
block.capstone.insns[0].mnemonic.startswith("rep m")
|
|
380
|
+
or block.capstone.insns[0].mnemonic.startswith("rep s")
|
|
381
|
+
):
|
|
382
|
+
insn = block.capstone.insns[0]
|
|
383
|
+
self.project.hook(state.addr, RepHook(insn.mnemonic.split(" ")[1]).run, length=insn.size)
|
|
384
|
+
|
|
385
|
+
# perform the step. ask qemu to stop at the termination point.
|
|
386
|
+
# if termination point occurs multiple times in trace, pass details to SimEngineUnicorn's native interface so
|
|
387
|
+
# that it can stop at last block
|
|
388
|
+
if self._last_block_total_count > 1:
|
|
389
|
+
stops = set(kwargs.pop("extra_stop_points", ()))
|
|
390
|
+
last_block_details = {
|
|
391
|
+
"addr": self._trace[-1],
|
|
392
|
+
"tot_count": self._last_block_total_count,
|
|
393
|
+
"curr_count": self._last_block_seen_count,
|
|
394
|
+
}
|
|
395
|
+
else:
|
|
396
|
+
stops = set(kwargs.pop("extra_stop_points", ())) | {self._trace[-1]}
|
|
397
|
+
last_block_details = None
|
|
398
|
+
|
|
399
|
+
succs_dict = simgr.step_state(state, extra_stop_points=stops, last_block_details=last_block_details, **kwargs)
|
|
400
|
+
if None not in succs_dict and simgr.errored:
|
|
401
|
+
raise simgr.errored[-1].error
|
|
402
|
+
sat_succs = succs_dict[None] # satisfiable states
|
|
403
|
+
succs = sat_succs + succs_dict["unsat"] # both satisfiable and unsatisfiable states
|
|
404
|
+
|
|
405
|
+
if not self._follow_unsat:
|
|
406
|
+
# Only satisfiable states need to be checked for correct successor
|
|
407
|
+
if len(sat_succs) == 1:
|
|
408
|
+
try:
|
|
409
|
+
self._update_state_tracking(sat_succs[0])
|
|
410
|
+
except TracerDesyncError as ex:
|
|
411
|
+
if self._mode == TracingMode.Permissive:
|
|
412
|
+
succs_dict = self._force_resync(simgr, state, ex.deviating_trace_idx, ex.deviating_addr, kwargs)
|
|
413
|
+
else:
|
|
414
|
+
raise
|
|
415
|
+
elif len(sat_succs) == 0:
|
|
416
|
+
raise Exception("No satisfiable state is available!")
|
|
417
|
+
else:
|
|
418
|
+
succ = self._pick_correct_successor(sat_succs)
|
|
419
|
+
succs_dict[None] = [succ]
|
|
420
|
+
succs_dict["missed"] = [s for s in sat_succs if s is not succ]
|
|
421
|
+
else:
|
|
422
|
+
# Check all states for correct successor
|
|
423
|
+
if len(succs) == 1:
|
|
424
|
+
self._update_state_tracking(succs[0])
|
|
425
|
+
elif len(succs) == 0:
|
|
426
|
+
raise Exception("All states disappeared!")
|
|
427
|
+
else:
|
|
428
|
+
succ = self._pick_correct_successor(succs)
|
|
429
|
+
succs_dict[None] = [succ]
|
|
430
|
+
succs_dict["missed"] = [s for s in succs if s is not succ]
|
|
431
|
+
assert len(succs_dict[None]) == 1
|
|
432
|
+
|
|
433
|
+
# if there is a catchable desync, we should return the last sync state
|
|
434
|
+
if succs_dict[None][0].globals["is_desync"]:
|
|
435
|
+
simgr.active[0].globals["trace_idx"] = len(self._trace)
|
|
436
|
+
succs_dict[None][0] = state
|
|
437
|
+
return succs_dict
|
|
438
|
+
|
|
439
|
+
def _force_resync(self, simgr, state, deviating_trace_idx, deviating_addr, kwargs):
|
|
440
|
+
"""
|
|
441
|
+
When a deviation happens, force the tracer to take the branch specified in the trace by manually setting the
|
|
442
|
+
PC to the one in the trace. This method is only used in Permissive tracing mode.
|
|
443
|
+
|
|
444
|
+
:param simgr: The simulation manager instance.
|
|
445
|
+
:param state: The program state before the current step.
|
|
446
|
+
:param deviating_trace_idx: The index of address in the trace where a desync happens.
|
|
447
|
+
:param deviating_addr: The address that tracer takes when the desync happens. Should be different from the
|
|
448
|
+
one in the trace.
|
|
449
|
+
:param kwargs: Other keyword arguments that will be passed to step_state().
|
|
450
|
+
:return: A new successor dict.
|
|
451
|
+
:rtype: dict
|
|
452
|
+
"""
|
|
453
|
+
|
|
454
|
+
# if unicorn engine is enabled, disable it. forced execution requires single-stepping in angr.
|
|
455
|
+
unicorn_option_removed = False
|
|
456
|
+
if sim_options.UNICORN in state.options:
|
|
457
|
+
state.options.remove(sim_options.UNICORN)
|
|
458
|
+
unicorn_option_removed = True
|
|
459
|
+
|
|
460
|
+
# single step until right before the deviating state
|
|
461
|
+
trace_idx = state.globals["trace_idx"]
|
|
462
|
+
while trace_idx != deviating_trace_idx - 1:
|
|
463
|
+
succs_dict = simgr.step_state(state, **kwargs)
|
|
464
|
+
succs = succs_dict[None]
|
|
465
|
+
assert len(succs) == 1
|
|
466
|
+
self._update_state_tracking(succs[0])
|
|
467
|
+
state = succs[0]
|
|
468
|
+
trace_idx += 1
|
|
469
|
+
|
|
470
|
+
# step the state further and then manually set the PC
|
|
471
|
+
succs_dict = simgr.step_state(state, **kwargs)
|
|
472
|
+
succs = succs_dict[None]
|
|
473
|
+
if len(succs) != 1 or succs[0].addr != deviating_addr:
|
|
474
|
+
raise TracerDesyncError("Address mismatch during single-stepping.")
|
|
475
|
+
succ = succs[0]
|
|
476
|
+
expected_addr = self._trace[deviating_trace_idx]
|
|
477
|
+
current_obj = self.project.loader.find_object_containing(state.addr)
|
|
478
|
+
assert current_obj is not None
|
|
479
|
+
translated_addr = self._translate_trace_addr(expected_addr, current_obj)
|
|
480
|
+
l.info(
|
|
481
|
+
"Attempt to fix a deviation: Forcing execution from %#x to %#x (instead of %#x).",
|
|
482
|
+
state.addr,
|
|
483
|
+
succ.addr,
|
|
484
|
+
translated_addr,
|
|
485
|
+
)
|
|
486
|
+
succ._ip = translated_addr
|
|
487
|
+
|
|
488
|
+
succ.globals["trace_idx"] = trace_idx + 1
|
|
489
|
+
succs_dict = {None: [succ]}
|
|
490
|
+
|
|
491
|
+
if unicorn_option_removed:
|
|
492
|
+
succ.options.add(sim_options.UNICORN)
|
|
493
|
+
|
|
494
|
+
return succs_dict
|
|
495
|
+
|
|
496
|
+
def _pick_correct_successor(self, succs):
|
|
497
|
+
# there's been a branch of some sort. Try to identify which state stayed on the trace.
|
|
498
|
+
assert len(succs) > 0
|
|
499
|
+
idx = succs[0].globals["trace_idx"]
|
|
500
|
+
|
|
501
|
+
res = []
|
|
502
|
+
last_description = succs[0].history.descriptions[-1]
|
|
503
|
+
if "Unicorn" in last_description:
|
|
504
|
+
# Multiple new states were created in SimEngineUnicorn. State which has non-zero recent block count is a
|
|
505
|
+
# valid successor since only correct successor is sync'd with native state
|
|
506
|
+
for succ in succs:
|
|
507
|
+
if succ.history.recent_block_count > 0:
|
|
508
|
+
res.append(succ)
|
|
509
|
+
else:
|
|
510
|
+
for succ in succs:
|
|
511
|
+
try:
|
|
512
|
+
if self._compare_addr(self._trace[idx + 1], succ.addr):
|
|
513
|
+
res.append(succ)
|
|
514
|
+
except AngrTracerError:
|
|
515
|
+
pass
|
|
516
|
+
|
|
517
|
+
if not res:
|
|
518
|
+
raise Exception("No states followed the trace?")
|
|
519
|
+
|
|
520
|
+
if len(res) > 1:
|
|
521
|
+
raise Exception("The state split but several successors have the same (correct) address?")
|
|
522
|
+
|
|
523
|
+
self._update_state_tracking(res[0])
|
|
524
|
+
return res[0]
|
|
525
|
+
|
|
526
|
+
def _update_state_tracking(self, state: SimState):
|
|
527
|
+
idx = state.globals["trace_idx"]
|
|
528
|
+
sync = state.globals["sync_idx"]
|
|
529
|
+
timer = state.globals["sync_timer"]
|
|
530
|
+
|
|
531
|
+
self._last_block_seen_count += state.history.recent_bbl_addrs.count(self._trace[-1])
|
|
532
|
+
|
|
533
|
+
if state.history.recent_block_count > 1:
|
|
534
|
+
# multiple blocks were executed this step. they should follow the trace *perfectly*
|
|
535
|
+
# or else something is up
|
|
536
|
+
# "something else" so far only includes concrete transmits, or...
|
|
537
|
+
# TODO: https://github.com/unicorn-engine/unicorn/issues/874
|
|
538
|
+
# ^ this means we will see desyncs of the form unicorn suddenly skips a bunch of qemu blocks
|
|
539
|
+
assert state.history.recent_block_count == len(state.history.recent_bbl_addrs)
|
|
540
|
+
|
|
541
|
+
for addr_idx, addr in enumerate(state.history.recent_bbl_addrs):
|
|
542
|
+
if addr in [
|
|
543
|
+
state.unicorn.cgc_transmit_addr,
|
|
544
|
+
state.unicorn.cgc_receive_addr,
|
|
545
|
+
state.unicorn.cgc_random_addr,
|
|
546
|
+
]:
|
|
547
|
+
continue
|
|
548
|
+
|
|
549
|
+
if sync is not None and sync != "entry":
|
|
550
|
+
if self._compare_addr(self._trace[sync], addr):
|
|
551
|
+
# Found the address in trace. Start normal trace checks from next address
|
|
552
|
+
idx = sync + 1
|
|
553
|
+
state.globals["sync_idx"] = None
|
|
554
|
+
sync = None
|
|
555
|
+
|
|
556
|
+
continue
|
|
557
|
+
|
|
558
|
+
if self._compare_addr(self._trace[idx], addr) or self._check_qemu_unicorn_large_block_split(
|
|
559
|
+
state, idx, addr_idx
|
|
560
|
+
):
|
|
561
|
+
idx += 1
|
|
562
|
+
else:
|
|
563
|
+
is_contained, increment = self._check_qemu_block_in_unicorn_block(state, idx, addr_idx)
|
|
564
|
+
if is_contained:
|
|
565
|
+
idx += increment
|
|
566
|
+
# Big block is now skipped in qemu trace. Perform compare at correct index again.
|
|
567
|
+
if self._compare_addr(self._trace[idx], addr):
|
|
568
|
+
idx += 1
|
|
569
|
+
continue
|
|
570
|
+
|
|
571
|
+
raise TracerDesyncError(
|
|
572
|
+
"Oops! angr did not follow the trace", deviating_addr=addr, deviating_trace_idx=idx
|
|
573
|
+
)
|
|
574
|
+
|
|
575
|
+
idx -= 1 # use normal code to do the last synchronization
|
|
576
|
+
|
|
577
|
+
if sync == "entry":
|
|
578
|
+
trace_addr = self._translate_state_addr(state.addr)
|
|
579
|
+
# this address should only ever appear once in the trace. we verified this during setup.
|
|
580
|
+
idx = self._trace.index(trace_addr)
|
|
581
|
+
state.globals["trace_idx"] = idx
|
|
582
|
+
state.globals["sync_idx"] = None
|
|
583
|
+
elif sync is not None:
|
|
584
|
+
timer -= 1
|
|
585
|
+
if self._compare_addr(self._trace[sync], state.addr):
|
|
586
|
+
state.globals["trace_idx"] = sync
|
|
587
|
+
state.globals["sync_idx"] = None
|
|
588
|
+
state.globals["sync_timer"] = 0
|
|
589
|
+
elif timer > 0:
|
|
590
|
+
state.globals["sync_timer"] = timer
|
|
591
|
+
else:
|
|
592
|
+
raise Exception(
|
|
593
|
+
f"Trace failed to synchronize! We expected it to hit {self._trace[sync]:#x} (trace addr), "
|
|
594
|
+
"but it failed to do this within a timeout"
|
|
595
|
+
)
|
|
596
|
+
|
|
597
|
+
elif state.history.jumpkind.startswith("Ijk_Exit"):
|
|
598
|
+
# termination! will be handled by filter
|
|
599
|
+
pass
|
|
600
|
+
elif self.project.is_hooked(state.addr) and not self.project.loader.extern_object.contains_addr(state.addr):
|
|
601
|
+
# handle simprocedures
|
|
602
|
+
self._sync_return(state, idx)
|
|
603
|
+
elif self._compare_addr(self._trace[idx + 1], state.addr):
|
|
604
|
+
# normal case
|
|
605
|
+
state.globals["trace_idx"] = idx + 1
|
|
606
|
+
elif self.project.loader._extern_object is not None and self.project.loader.extern_object.contains_addr(
|
|
607
|
+
state.addr
|
|
608
|
+
):
|
|
609
|
+
# externs
|
|
610
|
+
proc = self.project.hooked_by(state.addr)
|
|
611
|
+
if proc is None:
|
|
612
|
+
raise Exception("Extremely bad news: we're executing an unhooked address in the externs space")
|
|
613
|
+
if proc.display_name == "LinuxLoader":
|
|
614
|
+
state.globals["sync_idx"] = "entry"
|
|
615
|
+
elif proc.is_continuation:
|
|
616
|
+
orig_addr = self.project.loader.find_symbol(proc.display_name).rebased_addr
|
|
617
|
+
obj = self.project.loader.find_object_containing(orig_addr)
|
|
618
|
+
orig_trace_addr = self._translate_state_addr(orig_addr, obj)
|
|
619
|
+
if 0 <= self._trace[idx + 1] - orig_trace_addr <= 0x10000:
|
|
620
|
+
# this is fine. we do nothing and then next round
|
|
621
|
+
# it'll get handled by the is_hooked(state.history.addr) case
|
|
622
|
+
pass
|
|
623
|
+
else:
|
|
624
|
+
# this may also be triggered as a consequence of the unicorn issue linked above
|
|
625
|
+
raise Exception("BUG: State is returning to a continuation that isn't its own???")
|
|
626
|
+
elif state.addr == getattr(self.project.simos, "vsyscall_addr", None):
|
|
627
|
+
if not self._sync_callsite(state, idx, state.history.addr):
|
|
628
|
+
raise AngrTracerError("Could not synchronize following vsyscall")
|
|
629
|
+
elif self.project.hooked_by(state.addr).display_name.startswith("IFuncResolver"):
|
|
630
|
+
if not self._sync_return(state, idx):
|
|
631
|
+
raise AngrTracerError("Could not synchronize at ifunc return address")
|
|
632
|
+
else:
|
|
633
|
+
# see above
|
|
634
|
+
pass
|
|
635
|
+
elif state.history.jumpkind.startswith("Ijk_Sys"):
|
|
636
|
+
# syscalls
|
|
637
|
+
state.globals["sync_idx"] = idx + 1
|
|
638
|
+
state.globals["sync_timer"] = 1
|
|
639
|
+
elif self.project.is_hooked(state.history.addr):
|
|
640
|
+
# simprocedures - is this safe..?
|
|
641
|
+
self._fast_forward(state)
|
|
642
|
+
elif state.addr == self._trace[-1]:
|
|
643
|
+
# we may have prematurely stopped because of setting stop points. try to resync.
|
|
644
|
+
state.globals["sync_idx"] = idx + 1
|
|
645
|
+
state.globals["sync_timer"] = 1
|
|
646
|
+
elif (
|
|
647
|
+
self.project.is_hooked(state.addr)
|
|
648
|
+
and self.project.loader.find_symbol(self.project.hooked_by(state.addr).display_name) is not None
|
|
649
|
+
and self.project.loader.find_symbol(self.project.hooked_by(state.addr).display_name).subtype.value[0] == 10
|
|
650
|
+
): # STT_GNU_IFUNC #pylint:disable=line-too-long
|
|
651
|
+
if not self._sync_return(state, idx):
|
|
652
|
+
raise AngrTracerError("Could not synchronize at ifunc return address")
|
|
653
|
+
elif self._analyze_misfollow(state, idx):
|
|
654
|
+
# misfollow analysis will set a sync point somewhere if it succeeds
|
|
655
|
+
pass
|
|
656
|
+
else:
|
|
657
|
+
raise TracerDesyncError(
|
|
658
|
+
"Oops! angr did not follow the trace", deviating_addr=state.addr, deviating_trace_idx=idx + 1
|
|
659
|
+
)
|
|
660
|
+
|
|
661
|
+
if state.globals["sync_idx"] is not None:
|
|
662
|
+
l.debug(
|
|
663
|
+
"Trace: %s-%s/%s synchronizing %s",
|
|
664
|
+
state.globals["trace_idx"],
|
|
665
|
+
state.globals["sync_idx"],
|
|
666
|
+
len(self._trace),
|
|
667
|
+
state.globals["sync_timer"],
|
|
668
|
+
)
|
|
669
|
+
else:
|
|
670
|
+
l.debug("Trace: %s/%s", state.globals["trace_idx"], len(self._trace))
|
|
671
|
+
|
|
672
|
+
def _translate_state_addr(self, state_addr, obj=None):
|
|
673
|
+
if obj is None:
|
|
674
|
+
obj = self.project.loader.find_object_containing(state_addr)
|
|
675
|
+
if obj not in self._aslr_slides:
|
|
676
|
+
raise Exception("Internal error: cannot translate address")
|
|
677
|
+
return state_addr + self._aslr_slides[obj]
|
|
678
|
+
|
|
679
|
+
def _translate_trace_addr(self, trace_addr, obj=None):
|
|
680
|
+
if obj is None:
|
|
681
|
+
for obj, slide in self._aslr_slides.items(): # pylint: disable=redefined-argument-from-local
|
|
682
|
+
if obj.contains_addr(trace_addr - slide):
|
|
683
|
+
break
|
|
684
|
+
else:
|
|
685
|
+
raise Exception("Can't figure out which object this address belongs to")
|
|
686
|
+
if obj not in self._aslr_slides:
|
|
687
|
+
raise Exception("Internal error: object is untranslated")
|
|
688
|
+
return trace_addr - self._aslr_slides[obj]
|
|
689
|
+
|
|
690
|
+
def _compare_addr(self, trace_addr, state_addr):
|
|
691
|
+
if self._current_slide is not None and trace_addr == state_addr + self._current_slide:
|
|
692
|
+
return True
|
|
693
|
+
|
|
694
|
+
current_bin = self.project.loader.find_object_containing(state_addr)
|
|
695
|
+
if current_bin is self.project.loader._extern_object or current_bin is self.project.loader._kernel_object:
|
|
696
|
+
return False
|
|
697
|
+
if current_bin in self._aslr_slides:
|
|
698
|
+
self._current_slide = self._aslr_slides[current_bin]
|
|
699
|
+
return trace_addr == state_addr + self._current_slide
|
|
700
|
+
if ((trace_addr - state_addr) & 0xFFF) == 0:
|
|
701
|
+
self._aslr_slides[current_bin] = self._current_slide = trace_addr - state_addr
|
|
702
|
+
return True
|
|
703
|
+
# error handling
|
|
704
|
+
if current_bin:
|
|
705
|
+
raise AngrTracerError(
|
|
706
|
+
f"Trace desynced on jumping into {current_bin.provides}. "
|
|
707
|
+
"Did you load the right version of this library?"
|
|
708
|
+
)
|
|
709
|
+
raise AngrTracerError(f"Trace desynced on jumping into {state_addr:#x}, where no library is mapped!")
|
|
710
|
+
|
|
711
|
+
def _check_qemu_block_in_unicorn_block(self, state: SimState, trace_curr_idx, state_desync_block_idx):
|
|
712
|
+
"""
|
|
713
|
+
Check if desync occurred because unicorn block was split into multiple blocks in qemu tracer. If yes, find the
|
|
714
|
+
correct increment for trace index
|
|
715
|
+
"""
|
|
716
|
+
|
|
717
|
+
# We first find the block address where the trace and state's history match
|
|
718
|
+
for trace_match_idx in range(trace_curr_idx - 1, -1, -1):
|
|
719
|
+
if self._trace[trace_match_idx] == state.history.recent_bbl_addrs[state_desync_block_idx - 1]:
|
|
720
|
+
break
|
|
721
|
+
else:
|
|
722
|
+
# Failed to find matching block address. qemu block is probably not contained in a previous block.
|
|
723
|
+
return (False, -1)
|
|
724
|
+
|
|
725
|
+
control_flow_insn_types = [CS_GRP_CALL, CS_GRP_IRET, CS_GRP_JUMP, CS_GRP_RET]
|
|
726
|
+
big_block_start = self._trace[trace_match_idx]
|
|
727
|
+
big_block_end = None
|
|
728
|
+
curr_block_addr = big_block_start
|
|
729
|
+
while True:
|
|
730
|
+
curr_block = state.project.factory.block(self._translate_trace_addr(curr_block_addr))
|
|
731
|
+
curr_block_last_insn = curr_block.capstone.insns[-1]
|
|
732
|
+
if any(curr_block_last_insn.group(insn_type) for insn_type in control_flow_insn_types):
|
|
733
|
+
# Found last block
|
|
734
|
+
big_block_end = curr_block.addr + curr_block.size - 1
|
|
735
|
+
break
|
|
736
|
+
|
|
737
|
+
curr_block_addr = curr_block.addr + curr_block.size
|
|
738
|
+
|
|
739
|
+
for last_contain_index in range(trace_match_idx + 1, trace_curr_idx + 1):
|
|
740
|
+
if self._trace[last_contain_index] <= big_block_start or self._trace[last_contain_index] > big_block_end:
|
|
741
|
+
# This qemu block is not contained in the bigger block
|
|
742
|
+
return (False, -1)
|
|
743
|
+
|
|
744
|
+
# Check for future blocks in trace contained in big block
|
|
745
|
+
for next_contain_index in range(trace_curr_idx + 1, len(self._trace)):
|
|
746
|
+
if self._trace[next_contain_index] < big_block_start or self._trace[next_contain_index] > big_block_end:
|
|
747
|
+
# This qemu block is not contained in bigger block
|
|
748
|
+
break
|
|
749
|
+
|
|
750
|
+
return (True, next_contain_index - trace_curr_idx)
|
|
751
|
+
|
|
752
|
+
def _check_qemu_unicorn_large_block_split(self, state: SimState, trace_curr_idx, state_desync_block_idx):
|
|
753
|
+
"""
|
|
754
|
+
Check if desync occurred because large blocks are split up at different instructions by qemu and unicorn. This
|
|
755
|
+
is done by reconstructing part of block executed so far from the trace and state history and checking if they
|
|
756
|
+
the same
|
|
757
|
+
"""
|
|
758
|
+
|
|
759
|
+
control_flow_insn_types = [CS_GRP_CALL, CS_GRP_IRET, CS_GRP_JUMP, CS_GRP_RET]
|
|
760
|
+
|
|
761
|
+
prev_trace_block = state.project.factory.block(self._translate_trace_addr(self._trace[trace_curr_idx - 1]))
|
|
762
|
+
for insn_type in control_flow_insn_types:
|
|
763
|
+
if prev_trace_block.capstone.insns[-1].group(insn_type):
|
|
764
|
+
# Previous block ends in a control flow instruction. It is not large block different split.
|
|
765
|
+
return False
|
|
766
|
+
|
|
767
|
+
# The previous block did not end in a control flow instruction. Let's find the start of this big block from
|
|
768
|
+
# trace: it'll be the first block executed after a control flow instruction.
|
|
769
|
+
big_block_start_addr = None
|
|
770
|
+
for trace_block_idx in range(trace_curr_idx - 2, -1, -1):
|
|
771
|
+
trace_block = state.project.factory.block(self._translate_trace_addr(self._trace[trace_block_idx]))
|
|
772
|
+
trace_block_last_insn = trace_block.capstone.insns[-1]
|
|
773
|
+
for insn_type in control_flow_insn_types:
|
|
774
|
+
if trace_block_last_insn.group(insn_type):
|
|
775
|
+
big_block_start_addr = self._translate_trace_addr(self._trace[trace_block_idx + 1])
|
|
776
|
+
break
|
|
777
|
+
|
|
778
|
+
if big_block_start_addr is not None:
|
|
779
|
+
break
|
|
780
|
+
else:
|
|
781
|
+
# Failed to find end of the big basic block in trace. Treat as trace desync.
|
|
782
|
+
return False
|
|
783
|
+
|
|
784
|
+
# Now we check the part of the state history corresponding to this big basic block to ensure there are no
|
|
785
|
+
# control flow instructions at end of any blocks in the part. This check moves backwards starting from the
|
|
786
|
+
# desyncing block to the start of the big block we found earlier
|
|
787
|
+
for state_history_block_addr in reversed(state.history.recent_bbl_addrs[:state_desync_block_idx]):
|
|
788
|
+
state_history_block = state.project.factory.block(state_history_block_addr)
|
|
789
|
+
state_history_block_last_insn = state_history_block.capstone.insns[-1]
|
|
790
|
+
for insn_type in control_flow_insn_types:
|
|
791
|
+
if state_history_block_last_insn.group(insn_type):
|
|
792
|
+
# We haven't found the start of big block according to the trace but found a block ending with a
|
|
793
|
+
# control flow instruction. It is a trace desync then.
|
|
794
|
+
return False
|
|
795
|
+
|
|
796
|
+
if state_history_block_addr == big_block_start_addr:
|
|
797
|
+
# We found start of the big block and no control flow statements in between that and the block where
|
|
798
|
+
# desync happened.
|
|
799
|
+
break
|
|
800
|
+
|
|
801
|
+
# Let's find the address of the last byte of the big basic block using VEX lifter
|
|
802
|
+
angr_big_block_end_addr = None
|
|
803
|
+
curr_block_addr = big_block_start_addr
|
|
804
|
+
while True:
|
|
805
|
+
curr_block = state.project.factory.block(self._translate_trace_addr(curr_block_addr))
|
|
806
|
+
curr_block_last_insn = curr_block.capstone.insns[-1]
|
|
807
|
+
if any(curr_block_last_insn.group(insn_type) for insn_type in control_flow_insn_types):
|
|
808
|
+
# Found last block
|
|
809
|
+
angr_big_block_end_addr = curr_block.addr + curr_block.size - 1
|
|
810
|
+
break
|
|
811
|
+
|
|
812
|
+
curr_block_addr = curr_block.addr + curr_block.size
|
|
813
|
+
|
|
814
|
+
# Let's find the address of the last bytes of the big basic block from the trace
|
|
815
|
+
big_block_end_addr = None
|
|
816
|
+
for trace_block_idx in range(trace_curr_idx, len(self._trace)):
|
|
817
|
+
trace_block = state.project.factory.block(self._translate_trace_addr(self._trace[trace_block_idx]))
|
|
818
|
+
trace_block_last_insn = trace_block.capstone.insns[-1]
|
|
819
|
+
for insn_type in control_flow_insn_types:
|
|
820
|
+
if trace_block_last_insn.group(insn_type):
|
|
821
|
+
# Found first block in trace ending in a control flow instruction. Verify it matches the end of big
|
|
822
|
+
# block according to VEX lifter
|
|
823
|
+
big_block_end_addr = trace_block.addr + trace_block.size - 1
|
|
824
|
+
if angr_big_block_end_addr != big_block_end_addr:
|
|
825
|
+
# End does not match. Treat as trace desync.
|
|
826
|
+
return False
|
|
827
|
+
break
|
|
828
|
+
|
|
829
|
+
if big_block_end_addr is not None:
|
|
830
|
+
break
|
|
831
|
+
else:
|
|
832
|
+
# Failed to find end of the big basic block in trace. Treat as trace desync.
|
|
833
|
+
return False
|
|
834
|
+
|
|
835
|
+
# At this point, we know the following:
|
|
836
|
+
# - There is no control flow instruction between big_block_start_addr and big_block_end_addr
|
|
837
|
+
# - There is no control flow instruction between big_block_start_addr and state_desync_block_addr
|
|
838
|
+
# - state_desync_block_addr is definitely executed after big_block_start_addr
|
|
839
|
+
# So it's enough to check if desyncing block's address is less than big_block_end_addr to ensure that it
|
|
840
|
+
# is part of the big block
|
|
841
|
+
return state.history.recent_bbl_addrs[state_desync_block_idx] < big_block_end_addr
|
|
842
|
+
|
|
843
|
+
def _analyze_misfollow(self, state, idx):
|
|
844
|
+
angr_addr = state.addr
|
|
845
|
+
obj = self.project.loader.find_object_containing(angr_addr)
|
|
846
|
+
if obj not in self._aslr_slides: # this SHOULD be an invariant given the way _compare_addrs works
|
|
847
|
+
raise Exception("BUG: misfollow analysis initiated when jumping into a new object")
|
|
848
|
+
|
|
849
|
+
slide = self._aslr_slides[obj]
|
|
850
|
+
trace_addr = self._trace[idx + 1] - slide
|
|
851
|
+
l.info("Misfollow: angr says %#x, trace says %#x", angr_addr, trace_addr)
|
|
852
|
+
if not obj.contains_addr(trace_addr):
|
|
853
|
+
l.error("Translated trace address lives in a different object from the angr trace")
|
|
854
|
+
return False
|
|
855
|
+
|
|
856
|
+
# TODO: add rep handling
|
|
857
|
+
|
|
858
|
+
if "IRSB" in state.history.recent_description:
|
|
859
|
+
VEXMaxInsnsPerBlock = 99
|
|
860
|
+
last_block = state.block(state.history.bbl_addrs[-1])
|
|
861
|
+
|
|
862
|
+
# Case 1: angr block contains more instructions than trace block
|
|
863
|
+
if self._trace[idx + 1] - slide in last_block.instruction_addrs:
|
|
864
|
+
# we have disparate block sizes!
|
|
865
|
+
# specifically, the angr block size is larger than the trace's.
|
|
866
|
+
# allow the trace to catch up.
|
|
867
|
+
|
|
868
|
+
while self._trace[idx + 1] - slide in last_block.instruction_addrs:
|
|
869
|
+
idx += 1
|
|
870
|
+
|
|
871
|
+
l.info("...resolved: disparate block sizes")
|
|
872
|
+
|
|
873
|
+
if self._trace[idx + 1] - slide == state.addr:
|
|
874
|
+
state.globals["trace_idx"] = idx + 1
|
|
875
|
+
return True
|
|
876
|
+
state.globals["trace_idx"] = idx
|
|
877
|
+
# state.globals['trace_desync'] = True
|
|
878
|
+
return True
|
|
879
|
+
|
|
880
|
+
# Case 2: trace block contains more instructions than angr
|
|
881
|
+
# block. Caused by VEX's maximum instruction limit of 99
|
|
882
|
+
# instructions
|
|
883
|
+
if (
|
|
884
|
+
state.project.factory.block(state.history.addr).instructions == VEXMaxInsnsPerBlock
|
|
885
|
+
and state.history.jumpkind == "Ijk_Boring"
|
|
886
|
+
):
|
|
887
|
+
l.info("...resolved: vex block limit")
|
|
888
|
+
return True
|
|
889
|
+
|
|
890
|
+
prev_addr = state.history.bbl_addrs[-1]
|
|
891
|
+
prev_obj = self.project.loader.find_object_containing(prev_addr)
|
|
892
|
+
|
|
893
|
+
if state.block(prev_addr).vex.jumpkind == "Ijk_Call":
|
|
894
|
+
l.info("...syncing at callsite")
|
|
895
|
+
return self._sync_callsite(state, idx, prev_addr)
|
|
896
|
+
|
|
897
|
+
if prev_addr in getattr(prev_obj, "reverse_plt", ()):
|
|
898
|
+
prev_name = prev_obj.reverse_plt[prev_addr]
|
|
899
|
+
l.info("...syncing at PLT callsite for %s", prev_name)
|
|
900
|
+
# TODO: this method is newer than sync_callsite. should it be used always?
|
|
901
|
+
return self._sync_return(state, idx, assert_obj=prev_obj)
|
|
902
|
+
|
|
903
|
+
if prev_obj is not None:
|
|
904
|
+
prev_section = prev_obj.find_section_containing(prev_addr)
|
|
905
|
+
if prev_section is not None and prev_section.name in (".plt",):
|
|
906
|
+
l.info("...syncing at PLT callsite (type 2)")
|
|
907
|
+
return self._sync_return(state, idx, assert_obj=prev_obj)
|
|
908
|
+
|
|
909
|
+
l.info("...all analyses failed.")
|
|
910
|
+
return False
|
|
911
|
+
|
|
912
|
+
def _sync_callsite(self, state, idx, callsite_addr):
|
|
913
|
+
retsite_addr = state.block(callsite_addr).size + callsite_addr
|
|
914
|
+
return self._sync(state, idx, retsite_addr)
|
|
915
|
+
|
|
916
|
+
def _sync_return(self, state, idx, assert_obj=None):
|
|
917
|
+
ret_addr_bv = self.project.factory.cc().return_addr.get_value(state)
|
|
918
|
+
if state.solver.symbolic(ret_addr_bv):
|
|
919
|
+
l.info("...symbolic return address. I refuse to deal with this.")
|
|
920
|
+
return False
|
|
921
|
+
|
|
922
|
+
ret_addr = state.solver.eval(ret_addr_bv)
|
|
923
|
+
if assert_obj is not None and not assert_obj.contains_addr(ret_addr):
|
|
924
|
+
l.info("...address is not in the correct object, aborting analysis")
|
|
925
|
+
return False
|
|
926
|
+
return self._sync(state, idx, ret_addr)
|
|
927
|
+
|
|
928
|
+
def _sync(self, state, idx, addr):
|
|
929
|
+
addr_translated = self._translate_state_addr(addr)
|
|
930
|
+
try:
|
|
931
|
+
sync_idx = self._trace.index(addr_translated, idx)
|
|
932
|
+
except ValueError:
|
|
933
|
+
l.error("Trying to synchronize at %#x (%#x) but it does not appear in the trace?", addr_translated, addr)
|
|
934
|
+
return False
|
|
935
|
+
|
|
936
|
+
state.globals["sync_idx"] = sync_idx
|
|
937
|
+
state.globals["trace_idx"] = idx
|
|
938
|
+
state.globals["sync_timer"] = 10000 # TODO: ???
|
|
939
|
+
return True
|
|
940
|
+
|
|
941
|
+
def _fast_forward(self, state):
|
|
942
|
+
target_addr = state.addr
|
|
943
|
+
target_obj = self.project.loader.find_object_containing(target_addr)
|
|
944
|
+
if target_obj not in self._aslr_slides:
|
|
945
|
+
# if you see this message, consider implementing the find-entry-point hack for this, since if we're coming
|
|
946
|
+
# out of a hook and get a cache miss like this the jump between objects is probably happening in the final
|
|
947
|
+
# step of the skipped trace as well
|
|
948
|
+
raise AngrTracerError("Trace needs to synchronize at an address for which the ASLR slide is unavailable!")
|
|
949
|
+
self._current_slide = self._aslr_slides[target_obj]
|
|
950
|
+
target_addr += self._current_slide
|
|
951
|
+
try:
|
|
952
|
+
target_idx = self._trace.index(target_addr, state.globals["trace_idx"])
|
|
953
|
+
except ValueError as e:
|
|
954
|
+
# if the user wants to catch desync caused by sim_procedure,
|
|
955
|
+
# mark this state as a desync state and then end the tracing prematurely
|
|
956
|
+
if self._mode == TracingMode.CatchDesync:
|
|
957
|
+
state.globals["is_desync"] = True
|
|
958
|
+
return
|
|
959
|
+
raise AngrTracerError(
|
|
960
|
+
f"Trace failed to synchronize during fast forward? You might want to unhook {self.project.hooked_by(state.history.addr).display_name}."
|
|
961
|
+
) from e
|
|
962
|
+
else:
|
|
963
|
+
state.globals["trace_idx"] = target_idx
|
|
964
|
+
|
|
965
|
+
@classmethod
|
|
966
|
+
def crash_windup(cls, state, crash_addr):
|
|
967
|
+
# first check: are we just executing user-controlled code?
|
|
968
|
+
if not state.ip.symbolic and state.mem[state.ip].char.resolved.symbolic:
|
|
969
|
+
l.debug("executing input-related code")
|
|
970
|
+
return state, state
|
|
971
|
+
# second check: is this code mapped and executable?
|
|
972
|
+
section = state.project.loader.find_section_containing(state.addr)
|
|
973
|
+
if not section or not (section.flags & 0x4): # pylint:disable=superfluous-parens
|
|
974
|
+
return state, state
|
|
975
|
+
# in case we can't unwind, we return the state itself
|
|
976
|
+
if state.addr == crash_addr:
|
|
977
|
+
return state, state
|
|
978
|
+
|
|
979
|
+
state = state.copy()
|
|
980
|
+
state.options.add(sim_options.COPY_STATES)
|
|
981
|
+
state.options.discard(sim_options.STRICT_PAGE_ACCESS)
|
|
982
|
+
|
|
983
|
+
# before we step through and collect the actions we have to set
|
|
984
|
+
# up a special case for address concretization in the case of a
|
|
985
|
+
# controlled read or write vulnerability.
|
|
986
|
+
bp1 = state.inspect.b("address_concretization", BP_BEFORE, action=cls._check_add_constraints)
|
|
987
|
+
|
|
988
|
+
bp2 = state.inspect.b("address_concretization", BP_AFTER, action=cls._grab_concretization_results)
|
|
989
|
+
|
|
990
|
+
# step to the end of the crashing basic block,
|
|
991
|
+
# to capture its actions with those breakpoints
|
|
992
|
+
state.step()
|
|
993
|
+
|
|
994
|
+
# Add the constraints from concretized addrs back
|
|
995
|
+
for var, concrete_vals in state.preconstrainer.address_concretization:
|
|
996
|
+
if len(concrete_vals) > 0:
|
|
997
|
+
l.debug("constraining addr to be %#x", concrete_vals[0])
|
|
998
|
+
state.add_constraints(var == concrete_vals[0])
|
|
999
|
+
|
|
1000
|
+
# then we step again up to the crashing instruction
|
|
1001
|
+
inst_addrs = state.block().instruction_addrs
|
|
1002
|
+
inst_cnt = len(inst_addrs)
|
|
1003
|
+
|
|
1004
|
+
if inst_cnt == 0:
|
|
1005
|
+
insts = 0
|
|
1006
|
+
elif crash_addr in inst_addrs:
|
|
1007
|
+
insts = inst_addrs.index(crash_addr)
|
|
1008
|
+
else:
|
|
1009
|
+
insts = inst_cnt - 1
|
|
1010
|
+
|
|
1011
|
+
l.debug("windup step...")
|
|
1012
|
+
succs = state.step(num_inst=insts).flat_successors
|
|
1013
|
+
|
|
1014
|
+
last_state = None
|
|
1015
|
+
if len(succs) > 0:
|
|
1016
|
+
if len(succs) > 1:
|
|
1017
|
+
succs = [s for s in succs if s.solver.satisfiable()]
|
|
1018
|
+
state = succs[0]
|
|
1019
|
+
last_state = state
|
|
1020
|
+
|
|
1021
|
+
# remove the preconstraints
|
|
1022
|
+
l.debug("removing preconstraints")
|
|
1023
|
+
state.preconstrainer.remove_preconstraints()
|
|
1024
|
+
|
|
1025
|
+
l.debug("reconstraining... ")
|
|
1026
|
+
state.preconstrainer.reconstrain()
|
|
1027
|
+
|
|
1028
|
+
l.debug("final step...")
|
|
1029
|
+
try:
|
|
1030
|
+
succs = state.step(num_inst=1)
|
|
1031
|
+
except SimIRSBNoDecodeError:
|
|
1032
|
+
# See https://github.com/angr/angr/issues/71
|
|
1033
|
+
# Basically, we probably tried to single step over a delay slot.
|
|
1034
|
+
succs = state.step(num_inst=2)
|
|
1035
|
+
|
|
1036
|
+
successors = succs.flat_successors + succs.unconstrained_successors
|
|
1037
|
+
crash_state = successors[0]
|
|
1038
|
+
|
|
1039
|
+
# now remove our breakpoints since other people might not want them
|
|
1040
|
+
for s in [last_state, crash_state]:
|
|
1041
|
+
if s is None:
|
|
1042
|
+
continue
|
|
1043
|
+
s.inspect.remove_breakpoint("address_concretization", bp1)
|
|
1044
|
+
s.inspect.remove_breakpoint("address_concretization", bp2)
|
|
1045
|
+
|
|
1046
|
+
return last_state, crash_state
|
|
1047
|
+
|
|
1048
|
+
# the below are utility functions for crash windup
|
|
1049
|
+
|
|
1050
|
+
@classmethod
|
|
1051
|
+
def _grab_concretization_results(cls, state):
|
|
1052
|
+
"""
|
|
1053
|
+
Grabs the concretized result so we can add the constraint ourselves.
|
|
1054
|
+
"""
|
|
1055
|
+
# only grab ones that match the constrained addrs
|
|
1056
|
+
if cls._should_add_constraints(state):
|
|
1057
|
+
addr = state.inspect.address_concretization_expr
|
|
1058
|
+
result = state.inspect.address_concretization_result
|
|
1059
|
+
if result is None:
|
|
1060
|
+
l.warning("addr concretization result is None")
|
|
1061
|
+
return
|
|
1062
|
+
state.preconstrainer.address_concretization.append((addr, result))
|
|
1063
|
+
|
|
1064
|
+
@classmethod
|
|
1065
|
+
def _check_add_constraints(cls, state):
|
|
1066
|
+
"""
|
|
1067
|
+
Obnoxious way to handle this, should ONLY be called from crash monitor.
|
|
1068
|
+
"""
|
|
1069
|
+
# for each constrained addrs check to see if the variables match,
|
|
1070
|
+
# if so keep the constraints
|
|
1071
|
+
state.inspect.address_concretization_add_constraints = cls._should_add_constraints(state)
|
|
1072
|
+
|
|
1073
|
+
@classmethod
|
|
1074
|
+
def _should_add_constraints(cls, state):
|
|
1075
|
+
"""
|
|
1076
|
+
Check to see if the current address concretization variable is any of the registered
|
|
1077
|
+
constrained_addrs we want to allow concretization for
|
|
1078
|
+
"""
|
|
1079
|
+
expr = state.inspect.address_concretization_expr
|
|
1080
|
+
hit_indices = cls._to_indices(state, expr)
|
|
1081
|
+
|
|
1082
|
+
for action in state.preconstrainer._constrained_addrs:
|
|
1083
|
+
var_indices = cls._to_indices(state, action.addr)
|
|
1084
|
+
if var_indices == hit_indices:
|
|
1085
|
+
return True
|
|
1086
|
+
return False
|
|
1087
|
+
|
|
1088
|
+
@staticmethod
|
|
1089
|
+
def _to_indices(state, expr):
|
|
1090
|
+
indices = []
|
|
1091
|
+
for descr in state.solver.describe_variables(expr):
|
|
1092
|
+
if descr[0] == "file" and descr[1] == state.posix.stdin.ident:
|
|
1093
|
+
if descr[2] == "packet":
|
|
1094
|
+
indices.append(descr[3])
|
|
1095
|
+
elif type(descr[2]) is int:
|
|
1096
|
+
indices.append(descr[2])
|
|
1097
|
+
|
|
1098
|
+
return sorted(indices)
|