BUUCTF第十九、二十题解题思路

目录

第十九题rome

第二十题rsa


第十九题rome

解压、查壳。

无壳,用32位IDA打开,检索字符串,找到一个字符串“You are correct!”,与flag相关,对其交叉引用找到函数,查看伪代码。

int func()
{
  int result; // eax
  int v1[4]; // [esp+14h] [ebp-44h]
  unsigned __int8 v2; // [esp+24h] [ebp-34h] BYREF
  unsigned __int8 v3; // [esp+25h] [ebp-33h]
  unsigned __int8 v4; // [esp+26h] [ebp-32h]
  unsigned __int8 v5; // [esp+27h] [ebp-31h]
  unsigned __int8 v6; // [esp+28h] [ebp-30h]
  int v7; // [esp+29h] [ebp-2Fh]
  int v8; // [esp+2Dh] [ebp-2Bh]
  int v9; // [esp+31h] [ebp-27h]
  int v10; // [esp+35h] [ebp-23h]
  unsigned __int8 v11; // [esp+39h] [ebp-1Fh]
  char v12[29]; // [esp+3Bh] [ebp-1Dh] BYREF

  strcpy(v12, "Qsw3sj_lz4_Ujw@l");
  printf("Please input:");
  scanf("%s", &v2);
  result = v2;
  if ( v2 == 65 )
  {
    result = v3;
    if ( v3 == 67 )
    {
      result = v4;
      if ( v4 == 84 )
      {
        result = v5;
        if ( v5 == 70 )
        {
          result = v6;
          if ( v6 == 123 )
          {
            result = v11;
            if ( v11 == 125 )
            {
              v1[0] = v7;
              v1[1] = v8;
              v1[2] = v9;
              v1[3] = v10;
              *(_DWORD *)&v12[17] = 0;
              while ( *(int *)&v12[17] <= 15 )
              {
                if ( *((char *)v1 + *(_DWORD *)&v12[17]) > 64 && *((char *)v1 + *(_DWORD *)&v12[17]) <= 90 )
                  *((_BYTE *)v1 + *(_DWORD *)&v12[17]) = (*((char *)v1 + *(_DWORD *)&v12[17]) - 51) % 26 + 65;
                if ( *((char *)v1 + *(_DWORD *)&v12[17]) > 96 && *((char *)v1 + *(_DWORD *)&v12[17]) <= 122 )
                  *((_BYTE *)v1 + *(_DWORD *)&v12[17]) = (*((char *)v1 + *(_DWORD *)&v12[17]) - 79) % 26 + 97;
                ++*(_DWORD *)&v12[17];
              }
              *(_DWORD *)&v12[17] = 0;
              while ( *(int *)&v12[17] <= 15 )
              {
                result = (unsigned __int8)v12[*(_DWORD *)&v12[17]];
                if ( *((_BYTE *)v1 + *(_DWORD *)&v12[17]) != (_BYTE)result )
                  return result;
                ++*(_DWORD *)&v12[17];
              }
              return printf("You are correct!");
            }
          }
        }
      }
    }
  }
  return result;
}

分析代码:将字符串“Qsw3sj_lz4_Ujw@l”赋值给v12,用v2接收输入,进行判断(这里把ascll码转换成字符串可以看出整个if嵌套语句的条件能拼出ACTF{},与flag没有关系)。接着对v1的四位分别赋值,但是不难发现v7到v10都是查不到值的,大概能确定v1就是flag。

最后是while循环15次,遍历v12,根据v12中字符的大小写分别运算得到flag,可以写脚本求解。

import base64
v12 = [81, 115, 119, 51, 115, 106, 95, 108, 122, 52, 95, 85, 106, 119, 64, 108]
flag = ''
for i in range(0, 16):
    for k in range(0, 127):
        z = k
        if 64 < k <= 90:
            k = (k - 51) % 26 + 65
        if k <= 96 or k > 122:
            pass
        else:
            k = (k - 79) % 26 + 97
        if k == v12[i]:
            flag += chr(z)
print(flag)

得到flag为Cae3ar_th4_Gre@t

第二十题rsa

首先需要了解rsa加密:rsa加密是对明文的E次方后除以N后求余数的过程,N = p * q,其中p和q是两个大素数,而公钥是E和N的组合。

rsa解密则是密文进行D次方后除以N的余数,私钥是D和N的组合,知道私钥就可以解密了

这道题有两个文件,flag.enc和pub.key。可以根据后缀和文件名判断出前者为密文,而后者为公钥

可以用Typora打开key文件,发现公钥N为“MDwwDQYJKoZIhvcNAQEBBQADKwAwKAIhAMAzLFxkrkcYL2wch21CM2kQVFpY9+7+ /AvKr1rzQczdAgMBAAE= ”

可以用工具网站(http://tool.chacuo.net/)解出E和N。

E=65537 (0x10001)
N=0xC0332C5C64AE47182F6C1C876D42336910545A58F7EEFEFC0BCAAF5AF341CCDD

先将N转化为10进制,再使用工具网站(factordb.com)解出p和q。

p为285960468890451637935629440372639283459

q为304008741604601924494328155975272418463

根据L=lcm(p-1,q-1),算出L,再根据1 < D < L,E*D mod L = 1算出D,有了D和N,就可以对密文进行解密了。

写一个脚本(需要安装rsa)

import rsa

e = 65537
n = 86934482296048119190666062003494800588905656017203025617216654058378322103517
p = 285960468890451637935629440372639283459
q = 304008741604601924494328155975272418463
d = 81176168860169991027846870170527607562179635470395365333547868786951080991441

key = rsa.PrivateKey(n, e, d, q, p)
with open(r'C:\\Users\\40271\\Downloads\\41c4e672-98c5-43e5-adf4-49d75db307e4\\output\\flag.enc', 'rb') as flag:
    flag = flag.read()
    print(rsa.decrypt(flag, key))

解得flag为flag{decrypt_256}

  • 20
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
美赛e通常会要求解决一个实际的工程或管理问,涉及到建模、数据分析、优化等方面。解题思路通常分为以下几个步骤: 1. 问理解:首先要仔细阅读目,理解问背景、要求和限制条件。明确问的目标和约束条件是解题的第一步。 2. 建立数学模型:根据问要求和数据,建立合适的数学模型来描述问。可能涉及到微积分、概率统计、线性代数等数学知识。模型的建立需要考虑到实际情况和假设条件,尽量简化和抽象问方便求解。 3. 数据分析:根据所给数据或者自行获取数据,进行数据的处理和分析。可能需要进行数据清洗、统计分析、可视化等工作,以便更好地理解问和验证模型。 4. 求解优化问:根据建立的数学模型,可以采用各种优化方法来求解问。常用的方法包括线性规划、整数规划、动态规划、遗传算法等。在求解的过程中需要注意约束条件的处理和结果的解释。 5. 结果分析和验证:得到结果后,需要进行结果的分析和验证,看是否符合实际情况和问要求。如果有必要,可以进行灵敏度分析和稳定性分析,探讨模型的鲁棒性和可靠性。 6. 方案优化和改进:根据结果分析的情况,可以对建模和求解过程进行改进和优化,以提高解题的精度和效率。 以上是美赛e解题思路的一般流程,具体问具体分析,需要根据具体问的特点来灵活应对。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值