首页 > 其他分享 >[ACTF新生赛2020]usualCrypt

[ACTF新生赛2020]usualCrypt

时间:2024-10-27 20:47:24浏览次数:3  
标签:sub list a1 v1 v2 2020 key usualCrypt ACTF

[ACTF新生赛2020]usualCrypt

总体分析

点进byte_40E0E4函数界面,大概就能猜到解密与base64解密有关了

image-20241027204832026

点进sub_401080()函数

image-20241027204927868

确实是常见的base64加密

但这里有两个自定义函数 sub_401000() sub_401030(a)

sub_401000()

int sub_401000()
{
  int i; // eax
  char v1; // cl

  for ( i = 6; i < 15; ++i )
  {
    v1 = key[i + 10];
    key[i + 10] = key[i];
    key[i] = v1;
  }
  return i;
}

我修改了一下变量名

这里主要是对加密表进行了简单的移位变换

key = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
key_list = list(key)
for i in range(6, 15):
    v1 = key_list[i + 10]
    key_list[i + 10] = key_list[i]
    key_list[i] = v1
key = ''.join(key_list)

得到key = ABCDEFQRSTUVWXYPGHIJKLMNOZabcdefghijklmnopqrstuvwxyz0123456789+/

sub_401030(a)

int __cdecl sub_401030(const char *a1)
{
  __int64 v1; // rax
  char v2; // al

  v1 = 0i64;
  if ( strlen(a1) )
  {
    do
    {
      v2 = a1[HIDWORD(v1)];
      if ( v2 < 'a' || v2 > 'z' )
      {
        if ( v2 < 'A' || v2 > 'Z' )
          goto LABEL_9;
        LOBYTE(v1) = v2 + 32;
      }
      else
      {
        LOBYTE(v1) = v2 - 32;
      }
      a1[HIDWORD(v1)] = v1;
LABEL_9:
      LODWORD(v1) = 0;
      ++HIDWORD(v1);
    }
    while ( HIDWORD(v1) < strlen(a1) );
  }
  return v1;
}

这是对解密结果进行大小写替换

脚本实现

enc = 'zMXHz3TIgnxLxJhFAdtZn2fFk3lYCrtPC2l9'
enc2 = enc.swapcase()

得到enc2 = ZmxhZ3tiGNXlXjHfaDTzN2FfK3LycRTpc2L9

丢到base64解码软件就行

image-20241027205623500

flag{bAse64_h2s_a_Surprise}

标签:sub,list,a1,v1,v2,2020,key,usualCrypt,ACTF
From: https://www.cnblogs.com/murasame520/p/18508933

相关文章

  • [ACTF新生赛2020]rome
    DIE查壳32位,无壳32位ida打开界面很难看,按\后得到加密程序关注这个while循环,明明是个循环16次,但却v1却只有四个元素从声明变量这里可以看到v1是int数组,每个元素占四字节梳理一下逻辑,v1是我们需要求的flag,也就是传入的数据,这里通过第一个while循环进行了两次if判断,处理输入......
  • 如何选取笔记本外接显示器(以华为matebook14 2020版为例)
    选取与自己相近笔记本规格主要就是看:1、分辨率(像素):1k就是1920*1080像素,2k就是2560×1440像素,4k就是3840x2160像素、4096x2160像素;2、刷新率:就是一秒刷新多少个画面,体现在游戏流不流畅、视频卡不卡这种,例如60hz、100hz;3、连接线:看电脑的接口包含哪一些,如HDMI、USB-C(Thun......
  • 洛谷 P6628 [省选联考 2020 B 卷] 丁香之路 做题记录
    图论好题啊!首先我们枚举终点\(u\),看到一定要走完指定的\(m\)条边,很像一条欧拉路问题啊!但是现在问题是一个欧拉路问题,有两个点的度数是奇数,并不好做。我们不妨先从起点\(s\)向\(u\)连一条边,变成欧拉回路问题。现在我们需要做的是将度数为奇数的点加边使其变为偶数。方法是......
  • BUUCTF_2020网鼎杯[朱雀组]phpweb
    BUUCTF_2020网鼎杯[朱雀组]phpweb启动环境页面出现warning,并且发现页面存在自动刷新,使用burpsuite抓包:发现两个参数func和p并且发现页面中有2024-10-2403:55:59am,判断执行了date函数,根据func和p的形式猜测函数执行,func输入函数,p输入语句获取源代码:func=highlight_file&p=......
  • 【真题研究】CSP-S2020
    [CSP-S2020]儒略日大模拟。可以将时间分为\(4\)个部分:\(-4713.1.1\)至\(-1.12.31\)\(1.1.1\)至\(1582.10.4\)\(1582.10.5\)至\(1582.10.14\)\(1582.10.15\)至无穷大体可分为公元前(儒略历),公元后儒略历,公元后格里高利历。如果\(x\le1721424\),说明是公元前儒略......
  • P7074 [CSP-J2020] 方格取数 题解
    动态规划dp方格取数类似于数字三角形,均可以使用动态规划直接秒杀.但此题有$3$个方向:上、右、下.所以可以定义一个三维数组dp数组.假设$f_{i,j,1}$是从右、上方到达$(i,j)$的和的最大值.又有$f_{i,j,0}$是从右、下方到达$(i,j)$的和的最大值.我们可以先确定......
  • P7071 [CSP-J2020] 优秀的拆分 题解
    二进制"优秀的拆分"如果存在,则代表$n$的二进制最低位不是$1$.$\because2^0=1$$\therefore$当$n$的二进制最低位为$1$时,不存在优秀的拆分.即$n$不是奇数.上述条件判断完后,就可以从$2$的$30$次方开始模拟(int的上限是$2^{31}-1$).代码#include<iostream>......
  • P7072 [CSP-J2020] 直播获奖 题解
    暴力使用$\Theta(n^2)$的时间复杂度来解决这题大约能拿到$60pts$.即枚举$p$,再枚举每个选手的分数.正解桶是个好东西.我们开一个桶,记录当前分数有多少人.然后计算获奖人数,分数从大到小进行枚举,直到当前人数$\ge$获奖人数.代码#include<iostream>#include<cstdio>#i......
  • [CSP-J2020] 表达式 题解
    短路这道题目中所含的运算符只有3个:与、或、非.在与运算和或运算中有2个性质.进行与运算时,若其中有一个值为0,则这个运算的结果就为0,即无需判断另1个数是否是0或1.进行或运算时,若其中有一个值为1,则这个运算的结果就为1,也无需判断另一个数是否是0或1.表达式树根据短路的性......
  • [CSP-S2020] VP
    【比赛地址】省流:\(100+100+70+55\to100+100+70+0,325\to270\)[CSP-S2020]儒略日乱搞。这道题太恶心了,场上用了\(1h\)才做出来。代码过于抽象,不放了。[CSP-S2020]动物园非常简单的黄题。#include<bits/stdc++.h>usingnamespacestd;unsignedlonglongn,m,c,k......