首页 > 其他分享 >学习Ange记录--06~10

学习Ange记录--06~10

时间:2024-06-22 18:54:41浏览次数:10  
标签:Ange 06 10 solution simulation state address input check

06.change symbolic in heap
再来复习一下流程

1.建立项目
p=angr.Project(path)

2.设置入口

state=p.factory.blank_state(0xffffffff)

3.设置符号对象
pw=claripy.BVS('pw',64)

4.这次是把符号放到堆上,于是可以自己创个新的堆就好了

(1).给新的堆一个地址

(2).给新的指向堆的指针一个地址

(3).大端序改成小端序

5.把符号对象保存到新的堆上

state.memory.store(fake_heap_address0,pw)

6.模拟器获得状态
simulation = project.factory.simgr(state)

7.开始执行
simulation.explore(find=is_successful, avoid=should_abort)

8.找到了的处理

solution_state = simulation.found[0]
solution0 = solution_state.se.eval(pw,cast_to=bytes)

即获得了正确输入solution

07.change symblic in file
1.找入口
start_address = 0x080488e7 #memset的后一条指令

2.设置符号
password = claripy.BVS('password', symbolic_file_size_bytes * 8)

3.设置模拟文件的名称,读取的大小,创建模拟文件

filename = "OJKSQYDP.txt" 
symbolic_file_size_bytes = 8
password_file = angr.storage.SimFile(filename, content=password)

4.将simfile插入到状态里面
initial_state.fs.insert(filename, password_file)

5.后面步骤相同:为项目设置模拟器,模拟器设置状态;模拟器explore;simulation.found取解

08.提前比较
这个例子是为了在输出Good Job之前就进行比较,可以减少for循环逐字比较带来的复杂度(angr进入库函数并不会带来额外的路径,它会仅仅将库函数作为一个返回约束条件的东西。因此只有自定义fori循环会添加路径,而strncmp函数不会)

1.设置入口
这里设在为buffer开辟空间之后

2.将缓冲区地址存入状态

password_address = 0x0804A050          #输入缓冲区地址
initial_state.memory.store(password_address, password)

3.设置模拟器,开始运行到指定地址,这个指定地址在for循环之前

simulation = project.factory.simgr(initial_state)
address_to_check_constraint =0x0804866E 
simulation.explore(find=address_to_check_constraint)

4.到达之后,进行比较:先取出缓冲区数据,再添加约束
(1)取出缓冲区数据

if simulation.found:
  solution_state = simulation.found[0]
  constrained_parameter_address = 0x0804A050
  constrained_parameter_size_bytes = 16
  constrained_parameter_bitvector = solution_state.memory.load(
    constrained_parameter_address,
    constrained_parameter_size_bytes
  )

(2)设置比较值
constrained_parameter_desired_value ="AUPDNNPROEZRJWKB"

(3)添加约束,添加解

     solution_state.add_constraints(constrained_parameter_bitvector == constrained_parameter_desired_value)
     solution = solution_state.solver.eval(password,cast_to=bytes).decode()

09.钩子
这个例子是为了添加一个钩子替代一个fori循环的call

1.设置入口,可以从头开始

2.设置断点,即断掉哪个函数
check_equals_called_address = 0x80486b3

3.这个函数要跳多少条指令
instruction_to_skip_length = 5

4.设置钩子,跳掉,添加自己的函数处理

@project.hook(check_equals_called_address, length=instruction_to_skip_length)
  def skip_check_equals_(state):          #hook函数
   user_input_buffer_address = 0x804a054  #加载用户输入
   user_input_buffer_length = 16
   user_input_string = state.memory.load(
      user_input_buffer_address, 
      user_input_buffer_length
    )

  check_against_string ='XYMKBKUHNIQYNQXE'#手动比较,由于反编译发现原来的函数将比较结果保存到eax,所以设置eax
   state.regs.eax = claripy.If(
      user_input_string == check_against_string, 
      claripy.BVV(1, 32),                  #相当于三元比较,如果相等,则填充数值为1的位向量到寄存器,否则填充0位向量
      claripy.BVV(0, 32)
    )

5.后面流程相似,添加模拟器和状态,if检查found,state.posix.dumps(0)获取键盘输入
simulation = project.factory.simgr(initial_state)

def is_successful(state):
   stdout_output = state.posix.dumps(sys.stdout.fileno())
   return  b'Good Job.' in state.posix.dumps(1)
def should_abort(state):
   stdout_output = state.posix.dumps(sys.stdout.fileno())
   return b'Try again.' in state.posix.dumps(1)

simulation.explore(find=is_successful, avoid=should_abort)

  if simulation.found:
    solution_state = simulation.found[0]``
    solution = solution_state.posix.dumps(0)
    print(solution)
  else:
    raise Exception('Could not find the solution')

10.simProcedure
这里是为了模拟一个过程,即每次到达这个地址,都不用原函数,而使用自定义函数

1.设置项目,入口

  path_to_binary = "E:\\A_reverse\\angr_ctf-master\\dist\\10_angr_simprocedures"
  project = angr.Project(path_to_binary)
  initial_state = project.factory.entry_state()

2.设置替代函数

class ReplacementCheckEquals(angr.SimProcedure):
  def run(self, addr, size):
     user_input_buffer_address =addr
     user_input_buffer_length = size
     user_input_string = self.state.memory.load(
        user_input_buffer_address,
        user_input_buffer_length
      )
     check_against_string = 'ORSDDWXHZURJRBDH'
     return claripy.If(check_against_string==user_input_string, claripy.BVV(1, 32),
                            claripy.BVV(0, 32))

3.代替操作

check_equals_symbol = 'check_equals_ORSDDWXHZURJRBDH' #要替代的函数的名字
project.hook_symbol(check_equals_symbol, ReplacementCheckEquals())

4.后面操作不变

simulation = project.factory.simgr(initial_state)

  def is_successful(state):
    stdout_output = state.posix.dumps(sys.stdout.fileno())
    return b'Good Job.' in state.posix.dumps(1)

  def should_abort(state):
    stdout_output = state.posix.dumps(sys.stdout.fileno())
    return b'Try again.' in state.posix.dumps(1)

  simulation.explore(find=is_successful, avoid=should_abort)

  if simulation.found:
    solution_state = simulation.found[0]

    solution =solution_state.posix.dumps(0)
    print(solution)
  else:
    raise Exception('Could not find the solution')

标签:Ange,06,10,solution,simulation,state,address,input,check
From: https://www.cnblogs.com/ljyink/p/18262618

相关文章

  • YC307A [ 20240622 CQYC省选模拟赛 T1 ] 划船(boat)
    题意给定一个有向图\(G\),以及将所有边反向重连的无向图\(T\)。你最多可以在\(T\)上连续走\(k\)条边,走过每条边的代价都为\(1\),然后必须在\(G\)的对应点上走一条边以恢复体力。若当前对应点没有出边,则停留在该点\(1\)代价。求每个点到\(n\)的最小代价。Sol考......
  • JAVA学习笔记DAY10——SpringBoot基础
    文章目录SpringBoot3介绍SpringBoot快速入门@SpringBootApplicationSpringBoot配置文件统一配置管理Yaml配置优势tipsSpringBoot整合SpringMVC静态资源拦截器interceptorSpringBoot整合DruidSpringBoot整合MybatisSpringBoot整合txaopSpringBoot打包......
  • 2024.06.22【读书笔记】丨生物信息学与功能基因组学(第十七章 人类基因组 第一部分)【AI
    第一部分:人类基因组概述与测序历史(详细版)摘要:第十七章深入探讨了人类基因组的复杂性、测序历程以及其对现代科学的意义。人类基因组由约30,000至40,000个蛋白质编码基因组成,这些基因的表达和变异构成了我们生物学特征和疾病倾向的基础。本章节详细回顾了人类基因组计划的......
  • Zookeeper-06
    Zookeeper的java客户端   Zookeeper的Java客户端主要有以下几种:ZooKeeperJavaClient:这是官方提供的Java客户端,包含在ZooKeeper的发布版本中。它提供了一组简单的API,用于连接ZooKeeper服务器,并对节点进行操作。Curator:Curator是Netflix公司开发的一......
  • kedaOJ#P0609. 质因分解加强版
    题目P0609.质因分解加强版思路代码#include<iostream>#include<vector>#include<string>std::stringprimeFactorization(intn){std::vector<int>factors;std::vector<int>counts;for(inti=2;i*i<=n;++i)......
  • 电压互感器(zmpt101b)交流电压采样
        交流电压采样是我们在控制逆变电路时重要的一环。有一种采样方法就是用电压互感器+运放将目标交流电压转化为单片机可以测量的电压(即控制在合适的大小内,并且均转化为正值)。    在淘宝上我们可以买到现成的互感器模块,如下图: 其原理图如下:感谢@qq_389......
  • [AI资讯·0622] Claude3.5超越GPT-4o,360推出AI搜索,OpenAI收购Rockset,华为发布大模型
    AI资讯「网红」周鸿祎,要为AI带货突发!OpenAI收购数据公司盘古5.0重磅发布!华为云大模型年度杀招来了,人形机器人现场整活GPT-4o一夜被赶超!Anthropic推出Claude3.5,网友3分钟克隆马里奥游戏中国人自己的操作系统!余承东掏出纯血鸿蒙,华为AI大招硬刚苹果Claude3.5突然发布!GPT-4o......
  • 20240622训练
    文件名是abcd的逆天考试(算术(a)题面:给定一个长度为\(n\)的整数数列\(a_1,\dots,a_n\),求有多少个有序对\((i,j)\)满足\(i<j\wedgea_ia_j<a_i+a_j\)题解:枚举\(j\),有\(a_i(a_j-1)<a_j\),对\(a_j\)分类讨论。当\(a_j>1\),\(a_i<a_j/(a_j-1)\),即\(a_i\le1\)。当\(a_j=1\),\(0......
  • 【YOLOv10改进实战】**【6】YOLOv10添加注意力机制 【手把手教学】【经典模块随心选】
    【YOLOv10改进实战】**【6】YOLOv10添加【CBAM】【SE】【CA】【ECA】注意力机制【手把手教学】【经典模块随心选】......
  • 2023.10.28 做题记录
    2023.10.28[NOIP2018提高组]铺设道路题目传送门选择一个区间进行“填坑”操作;所以我们的贪心策略是:若a[i]>a[i-1],sum+=a[i]-a[i-1];假设现在有一个坑,但旁边又有一个坑。你肯定会选择把两个同时减1;那么小的坑肯定会被大的坑带着填掉。所以只要计算每个坑......