zoukankan      html  css  js  c++  java
  • 2020网鼎杯第一场青龙组re部分wp

    一、Bang

    拿到手是一个APK文件,打开看一下:

     

    题目描述简单加壳,于是想到用frida脱壳脚本:

     

    得到dex文件并用jeb打开:

     

    可以看到直接得到了flag

    二、Signal

    vm题:

     

     

    太长了,写个脚本模拟一下流程:(这里贴上最后的脚本,验证内容直接写了flag,为了验证正确性)

    #include<iostream>
    
    #include<stdlib.h>
    
    using namespace std;
    
     
    
    unsigned char a[] =
    
    {
    
      0x0A, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0x00,
    
      0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
    
      0x05, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00,
    
      0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00,
    
      0x05, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00,
    
      0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
    
      0x08, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x01, 0x00,
    
      0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00,
    
      0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00,
    
      0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
    
      0x08, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x21, 0x00,
    
      0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00,
    
      0x08, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x01, 0x00,
    
      0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00,
    
      0x08, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x20, 0x00,
    
      0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
    
      0x51, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00,
    
      0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
    
      0x0C, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x0B, 0x00,
    
      0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00,
    
      0x02, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x02, 0x00,
    
      0x00, 0x00, 0x25, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
    
      0x02, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x08, 0x00,
    
      0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00,
    
      0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x20, 0x00,
    
      0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00,
    
      0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x05, 0x00,
    
      0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00,
    
      0x02, 0x00, 0x00, 0x00, 0x25, 0x00, 0x00, 0x00, 0x01, 0x00,
    
      0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00,
    
      0x08, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x20, 0x00,
    
      0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
    
      0x41, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x0C, 0x00,
    
      0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00,
    
      0x22, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x3F, 0x00,
    
      0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00,
    
      0x07, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00, 0x00, 0x07, 0x00,
    
      0x00, 0x00, 0x72, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00,
    
      0x33, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x18, 0x00,
    
      0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0xA7, 0x00, 0x00, 0x00,
    
      0x07, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x07, 0x00,
    
      0x00, 0x00, 0xF1, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00,
    
      0x28, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x84, 0x00,
    
      0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0xC1, 0x00, 0x00, 0x00,
    
      0x07, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x07, 0x00,
    
      0x00, 0x00, 0x7A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    
      0x00, 0x00
    
    };
    
     
    
    int main()
    
    {
    
        int len;
    
    int v9=v8=v7=v6=v5=0,tmp;
    
    char *v3 = "757515121f3d478";
    
    unsigned char v4[100];
    
    len = sizeof(a);
    
    for(int v10=0;v10<len;) {
    
    switch(a[v10]) {
    
    case 1:
    
            cout<<"[*] v4[v7] = v5"<<endl;
    
    v4[v7] = v5;
    
    cout<<"v7="<<v7<<endl;
    
    cout<<"v4["<<v7<<"]="<<v5<<endl;
    
            v10+=4;
    
            ++v7;
    
            ++v9;
    
            break;
    
          case 2:
    
            cout<<"[*] v5 = a1[v10 + 1] + v3[v9]"<<endl;
    
    v5 =  v3[v9] + a[v10 + 4];
    
    printf("a1[v10+1]=%d
    ",a[v10+4]);
    
    tmp =v3[v9];
    
    cout<<"v3[v9]="<<tmp<<endl;
    
    cout<<"v5="<<v5<<endl;
    
            v10+=8;
    
            break;
    
          case 3:
    
            cout<<"[*] v5 = v3[v9] - LOBYTE(a1[v10 + 1])"<<endl;
    
    v5 = v3[v9] - (a[v10 + 4]);
    
    printf("a1[v10+1]=%d
    ",a[v10+4]);
    
    tmp =v3[v9];
    
    cout<<"v3[v9]="<<tmp<<endl;
    
    cout<<"v5="<<v5<<endl;
    
            v10+=8;
    
            break;
    
          case 4:
    
            cout<<"[*] v5 = a1[v10 + 1] ^ v3[v9]"<<endl;
    
    v5 = a[v10 + 4] ^ v3[v9];
    
    printf("a1[v10+1]=%d
    ",a[v10+4]);
    
    tmp =v3[v9];
    
    cout<<"v3[v9]="<<tmp<<endl;
    
    cout<<"v5="<<v5<<endl;
    
            v10+=8;
    
            break;
    
          case 5:
    
            cout<<"[*] v5 = a1[v10 + 1] * v3[v9]"<<endl;
    
    v5 = v3[v9] * a[v10 + 4];
    
    printf("a1[v10+1]=%d
    ",a[v10+4]);
    
    tmp =v3[v9];
    
    cout<<"v3[v9]="<<tmp<<endl;
    
     
    
    cout<<"v5="<<v5<<endl;
    
            v10+=8;
    
            break;
    
          case 6:
    
    cout<<"[*] ++v10"<<endl;
    
    cout<<"v10="<<v10<<endl;
    
            v10+=4;
    
            break;
    
          case 7:
    
            cout<<"[*] compare.."<<endl;
    
    cout<<"v8="<<v8<<endl;
    
    printf("v4[v8]=%d
    ",v4[v8]);
    
    printf("a1[v10+1]=%d
    ",a[v10+4]);
    
            ++v8;
    
            v10+=8;
    
            break;
    
          case 8:
    
            cout<<"[*] v3[v6] = v5"<<endl;
    
    v3[v6] = v5;
    
    cout<<"v3[v6]="<<v5<<endl;
    
    cout<<"v6="<<v6<<endl;
    
            v10+=4;
    
            ++v6;
    
            break;
    
          case 10:
    
            //read(v3);
    
    cout<<"[*] read"<<endl;
    
            v10+=4;
    
            break;
    
          case 11:
    
            cout<<"[*] v5 = v3[v9] - 1"<<endl;
    
    v5 = v3[v9] - 1;
    
    tmp =v3[v9];
    
    cout<<"v3[v9]="<<tmp<<endl;
    
    cout<<"v5="<<v5<<endl;
    
            v10+=4;
    
            break;
    
          case 12:
    
            cout<<"[*] v5 = v3[v9] + 1"<<endl;
    
    v5 = v3[v9] + 1;
    
    tmp =v3[v9];
    
    cout<<"v3[v9]="<<tmp<<endl;
    
    cout<<"v5="<<v5<<endl;
    
            v10+=4;
    
            break;
    
          default:
    
            continue;
    
    }
    
    }
    
        return 0;
    
    }

     

    可以清楚的看到运算过程,之后再逆着推一遍就可以了。

    三、Joker

    这道题是个代码自修改的题目。

    看到

     

    修改了代码段的encrypt函数,又看到下面进行了异或操作:

     

    简单修复后F5查看:

    经过分析,wrong函数和omg函数没有用。

     

    encrypt函数把输入和hahahaha_do_you_find_me?异或,与dword_403040比较

    py

      

    可以看到少了后面几位,看下一个函数:

    这个函数逻辑明显有问题。。。

     

    X32dbg看这里是time(0)

    而且

     

    这里对于v8的操作也没有正确反编译。

    后来想到字符串中的提示:

    隐藏了后面几位,并且不会成功,暗示着这个函数就是有问题的。

    但是flag格式是固定的flag{}

    所以根据最后一位是}来推断,与

    逐位异或71

    所以得到了后面几位:b37a}

    完整拼接后得到flag{d07abccf8a410cb37a}

  • 相关阅读:
    petshop4.0 详解之三(PetShop数据访问层之消息处理)
    MemberShip的使用
    PetShop 详解之一 系统架构设计
    PetShop4,错误提示:没有为 SQL 缓存通知启用数据库"MyCard"
    PetShop4,错误提示:System.Web.Security.SqlMembershipProvider”要求一个与架构版本“1”兼容的数据
    【Linux从零开始】:1.文件与目录的管理和配置(1)
    【笔记】在.NET中使用强类型有以下优点:
    【好文收藏】:Linq to DataSet
    【好文收藏】泛型与非泛型的比较(百度文库)
    HDOJ1102 Constructing Roads[Prim()]
  • 原文地址:https://www.cnblogs.com/basstorm/p/12893671.html
Copyright © 2011-2022 走看看