BUUCTF-[网鼎杯 2020 青龙组]singal 1(angr用法)

题目下载:题目

查壳

无壳,32位程序,拖入IDA。

这道题之前看了看,主要操作是个switch语句,但是没有看太懂,然后我发现有用angr解这道题的,那时候还没接触,也没安装angr库,基本操作也不会,之前浅学了一下,还是不太精通,但是这道题是最基本的angr解法,所以用angr做一做。

进入主函数:

 发现vm_operad是主要函数,而puts("good,The answer format is:flag {}");是你想要得到的,看它的反汇编记住地址,写脚本要用到。

进入vm_operad:

int __cdecl vm_operad(int *a1, int a2)
{
  int result; // eax
  char Str[200]; // [esp+13h] [ebp-E5h] BYREF
  char v4; // [esp+DBh] [ebp-1Dh]
  int v5; // [esp+DCh] [ebp-1Ch]
  int v6; // [esp+E0h] [ebp-18h]
  int v7; // [esp+E4h] [ebp-14h]
  int v8; // [esp+E8h] [ebp-10h]
  int v9; // [esp+ECh] [ebp-Ch]

  v9 = 0;
  v8 = 0;
  v7 = 0;
  v6 = 0;
  v5 = 0;
  while ( 1 )
  {
    result = v9;
    if ( v9 >= a2 )
      return result;
    switch ( a1[v9] )                        主操作
    {
      case 1:
        Str[v6 + 100] = v4;
        ++v9;
        ++v6;
        ++v8;
        break;
      case 2:
        v4 = a1[v9 + 1] + Str[v8];
        v9 += 2;
        break;
      case 3:
        v4 = Str[v8] - LOBYTE(a1[v9 + 1]);
        v9 += 2;
        break;
      case 4:
        v4 = a1[v9 + 1] ^ Str[v8];
        v9 += 2;
        break;
      case 5:
        v4 = a1[v9 + 1] * Str[v8];
        v9 += 2;
        break;
      case 6:
        ++v9;
        break;
      case 7:
        if ( Str[v7 + 100] != a1[v9 + 1] )  //避免
        {
          printf("what a shame...");
          exit(0);
        }
        ++v7;
        v9 += 2;
        break;
      case 8:
        Str[v5] = v4;
        ++v9;
        ++v5;
        break;
      case 10:
        read(Str);                          //读取输入str
        ++v9;
        break;
      case 11:
        v4 = Str[v8] - 1;
        ++v9;
        break;
      case 12:
        v4 = Str[v8] + 1;
        ++v9;
        break;
      default:
        continue;
    }
  }
}

 其中有read函数,是用户输入的,跟进

 str长度15。

对于angr做法没有必要关注这些过程,我们只要知道我们想要得到puts("good,The answer format is:flag {}");并且不想得到 printf("what a shame..."),它的地址是

就可以了,然后用angr写脚本就好了。

import angr
p=angr.Project("./signal.exe")         #加载文件
state=p.factory.entry_state()          #创造状态state, entry_state构造一个从函数入口点执行的状态
sm=p.factory.simgr(state)              #模拟管理器
good=0x4017A5                          #想要的地址
sm.explore(find=good,avoid=0x4016ED)
if sm.found:                           #如果found分类不为空
    find_state=sm.found[0]             #found里的状态给find_state
    print(find_state.posix.dumps(0))    #获取输入

在虚拟机中运行

得到了一个长度15的字符,正好就是flag。

angr初步学习参考angr 学习笔记__sky123_的博客-CSDN博客

linux下angr安装:ubuntu16.04安装angr 升级python3.7_Forgo7ten的博客-CSDN博客_angr python版本

基本概念

即初始参数用变量代替,模拟程序执行过程,维护执行到各个位置时的状态(用各个变量之间的代数关系表示)。

    符号状态(Symbolic State)
    当前状态所有参数的集合,用 σ σ σ 表示。集合中的每个元素用表示初始参数的变量表示。
    路径约束(Path Constraint)
    到达当前路径需要表示初始参数满足的关系,通常用 PC 表示。
 

 

 

 

 

 

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,关于如何使用angr以及如何解决实际问题的探讨思考,我可以给您一些建议和想法。 首先,angr是一种开源的二进制分析框架,它可以用于模拟程序执行、符号执行、约束求解等任务。使用angr可以帮助我们分析程序的行为,发现安全漏洞,解决Bug等问题。 对于如何使用angr,我认为可以从以下几个方面入手: 1. 理解angr的基本原理和工作流程:学习angr的工作原理和流程是非常关键的,它可以帮助我们更好地理解angr的各个模块和函数,并且可以提高我们的分析效率和准确性。 2. 了解angr的API和使用方法:angr提供了丰富的API和使用方法,包括路径分析、符号执行、约束求解等功能。我们可以通过掌握这些API和使用方法,来实现我们的分析策略,并且解决实际问题。 3. 掌握相应的工具和技术:除了angr本身之外,使用angr还需要掌握一些相关的工具和技术,例如IDA Pro、Ghidra等反汇编工具、Python编程、Shell编程等。这些工具和技术可以帮助我们更好地使用angr进行分析和解决问题。 针对如何解决实际问题,我认为可以从以下几个方面思考: 1. 确定分析目标和关键点:在使用angr进行分析之前,我们需要明确自己的分析目标和关键点,例如发现程序漏洞或者解决程序性能问题等。只有明确了分析目标和关键点,我们才能有针对性地进行分析,并且解决实际问题。 2. 制定分析策略和方案:在明确了分析目标和关键点之后,我们需要制定相应的分析策略和方案。例如,我们可以通过符号执行来发现程序中的漏洞,或者通过约束求解来解决程序的性能问题等。根据不同的分析目标和关键点,我们可以选择不同的分析策略和方案。 3. 结合实际应用场景和技术实践:除了掌握angr和相关工具和技术之外,我们还需要结合实际应用场景和技术实践,来解决实际问题。例如,在分析某个程序时,我们需要了解该程序所使用的编程语言、数据类型和算法等,以便更好地使用angr进行分析,解决实际问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值