首页 > 其他分享 >[LitCTF 2023]enbase64

[LitCTF 2023]enbase64

时间:2023-10-12 22:22:43浏览次数:44  
标签:int ++ LitCTF char Source v3 enbase64 2023 ebp

这是一个将flag换base64表之后加密的代码

附件下载

https://wwvc.lanzouj.com/iwZuF1bmzehg

查壳

无壳,32位
image.png

分析

丢入ida32,找到main函数F5

int __cdecl main(int argc, const char **argv, const char **envp)
{
    char Source[61]; // [esp+1Fh] [ebp-81Dh] BYREF
    char v5[4]; // [esp+5Ch] [ebp-7E0h] BYREF
    char Str1[1000]; // [esp+60h] [ebp-7DCh] BYREF
    char Str[1012]; // [esp+448h] [ebp-3F4h] BYREF

    __main();
    memset(Str, 0, 1000);
    memset(Str1, 0, sizeof(Str1));
    *(_DWORD *)Source = *(_DWORD *)"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
    strcpy(v5, "9+/");
    qmemcpy(&Source[1], &aAbcdefghijklmn[-(Source - &Source[1])], 4 * (((Source - &Source[1] + 65) & 0xFFFFFFFC) >> 2));
    puts("Please input flag:");
    gets(Str);
    if ( strlen(Str) == 33 )
{
    base64(Source, Str, Str1);
    basecheck(Str1);
}
    return 0;
}

第12和第13没有用,Source是base64表,也就是ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/,Str是输入的flag,先经过base64这个函数加密,我们先点入base64函数里面看看
image.png
发现basechange(Source),怀疑将base64表换了,我们继续跟进basechange函数
image.png
将Source的表换成Destination,可以直接跑出来换后的表,即Destination值
image.png
脚本

#include<stdio.h>
#include<string.h>
int main()
{
  char *result; // eax
  char Destination[65]; // [esp+13h] [ebp-155h] BYREF
  int v3[65]; // [esp+54h] [ebp-114h] BYREF
  int j; // [esp+158h] [ebp-10h]
  int i; // [esp+15Ch] [ebp-Ch]
  char Source[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
  memset(v3, 0, sizeof(v3));
  v3[0] = 16;
  v3[1] = 34;
  v3[2] = 56;
  v3[3] = 7;
  v3[4] = 46;
  v3[5] = 2;
  v3[6] = 10;
  v3[7] = 44;
  v3[8] = 20;
  v3[9] = 41;
  v3[10] = 59;
  v3[11] = 31;
  v3[12] = 51;
  v3[13] = 60;
  v3[14] = 61;
  v3[15] = 26;
  v3[16] = 5;
  v3[17] = 40;
  v3[18] = 21;
  v3[19] = 38;
  v3[20] = 4;
  v3[21] = 54;
  v3[22] = 52;
  v3[23] = 47;
  v3[24] = 3;
  v3[25] = 11;
  v3[26] = 58;
  v3[27] = 48;
  v3[28] = 32;
  v3[29] = 15;
  v3[30] = 49;
  v3[31] = 14;
  v3[32] = 37;
  v3[34] = 55;
  v3[35] = 53;
  v3[36] = 24;
  v3[37] = 35;
  v3[38] = 18;
  v3[39] = 25;
  v3[40] = 33;
  v3[41] = 43;
  v3[42] = 50;
  v3[43] = 39;
  v3[44] = 12;
  v3[45] = 19;
  v3[46] = 13;
  v3[47] = 42;
  v3[48] = 9;
  v3[49] = 17;
  v3[50] = 28;
  v3[51] = 30;
  v3[52] = 23;
  v3[53] = 36;
  v3[54] = 1;
  v3[55] = 22;
  v3[56] = 57;
  v3[57] = 63;
  v3[58] = 8;
  v3[59] = 27;
  v3[60] = 6;
  v3[61] = 62;
  v3[62] = 45;
  v3[63] = 29;
  result = strcpy(Destination, Source);
  for ( i = 0; i <= 47; ++i )
  {
    for ( j = 0; j <= 63; ++j )
      Source[j] = Destination[v3[j]];
    result = strcpy(Destination, Source);
  }
  printf("%s",Destination);
  return 0;
}

换后的表
image.png

gJ1BRjQie/FIWhEslq7GxbnL26M4+HXUtcpmVTKaydOP38of5v90ZSwrkYzCAuND

接下来就好办了,把之前写过的base64解密代码的base64表替换一下,找到加密后的值
也就是basecheck函数
image.png
双击跟进,找到加密后的值
image.png

GQTZlSqQXZ/ghxxwhju3hbuZ4wufWjujWrhYe7Rce7ju

现在换的表和加密后的值都找到了,可以得到flag值了,直接上脚本

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

char base64CharsArr[] = "gJ1BRjQie/FIWhEslq7GxbnL26M4+HXUtcpmVTKaydOP38of5v90ZSwrkYzCAuND";

void base64decode(char str[]) {
    int length = strlen(str);
    int padding = 0;

    // 计算填充字符数量
    if (str[length - 1] == '=') {
        padding++;
        if (str[length - 2] == '=')
            padding++;
    }

    // 计算解码后的字符数量
    int decodedLength = (length * 3) / 4 - padding;

    // 分配存储解码结果的内存
    char* decodedStr = (char*)malloc(decodedLength + 1);

    int outIndex = 0;
    for (int i = 0; i < length; i += 4) {
        char char1 = -1, char2 = -1, char3 = -1, char4 = -1;

        // 查找每个字符在Base64字符集中的索引
        for (int j = 0; j < 64; j++) {
            if (base64CharsArr[j] == str[i]) {
                char1 = j;
                break;
            }
        }

        for (int j = 0; j < 64; j++) {
            if (base64CharsArr[j] == str[i + 1]) {
				char2 = j;
                break;
            }
        }

        for (int j = 0; j < 64; j++) {
            if (base64CharsArr[j] == str[i + 2]) {
 				char3 = j;
                break;
            }
        }

        for (int j = 0; j < 64; j++) {
            if (base64CharsArr[j] == str[i + 3]) {
 				char4 = j;
                break;
            }
        }

        // 解码并存储结果
        decodedStr[outIndex++] = (char1 << 2) | ((char2 & 0x30) >> 4);
        if (char3 != -1)
            decodedStr[outIndex++] = ((char2 & 0xf) << 4) | ((char3 & 0x3c) >> 2);
        if (char4 != -1)
            decodedStr[outIndex++] = ((char3 & 0x3) << 6) | char4;
    }

    // 添加字符串结束符
    decodedStr[decodedLength] = '\0';

    printf("Decoded string: %s\n", decodedStr);

    // 释放内存
    free(decodedStr);
}

int main() {
    char str[100]="GQTZlSqQXZ/ghxxwhju3hbuZ4wufWjujWrhYe7Rce7ju"; // Example base64 encoded string
	base64decode(str);
    return 0;
}

运行即得flag:LitCTF{B@5E64_l5_tooo0_E3sy!!!!!}
image.png

标签:int,++,LitCTF,char,Source,v3,enbase64,2023,ebp
From: https://www.cnblogs.com/Zer0o/p/17760751.html

相关文章

  • 20231012
    某大学为进一步推进无纸化考试,欲开发一考试系统。系统管理员能够创建专业方向、课程编号、任课教师等相关考试基础信息。教师和考生进行考试相关工作。系统与考试有关的主要功能如下:(1)考试设置:教师制定试题(题目和答案),制定考试说明、考试时间和提醒时间等考试信息,录入参加考试的学......
  • 训练日记 2023
    连载到NOIP考前吧。我不至于过不了CSP吧。2023/10/12昨天晚上被拉去开会,今天中午又和班主任谈了一下,貌似必须得回去上生物化学。算了也差不多。怎么连数之谜2.3的组合都做不出啊/qd学了DDP,水了两道题。今日题单:LGP4719LGP6021......
  • CSP-2023游记
    Day-9gp终于开网了,做了几道zsq给的题luoguP4306:一开始看到这题觉得复杂度最少是\(\frac{n^3}{w}\),尝试优化了一下,结果发现优化不了,觉得不可做,一看题解,正解竟然真是\(\frac{n^3}{w}\),出题人开2000是不是有病啊。luoguP1407:这题一眼觉得是割边,结果发现是错的。考虑对于原......
  • 2023APA招新游戏代码讲解
    0概况招新小游戏是使用C++与Python设计的几款小游戏,并使用Pyside2设计GUI界面。对于萌新们来说,短时间学会游戏开发并不是很实际,本文旨在让大家简单体会游戏的开发过程,如何设计框架、调用模块、编写游戏以及实现代码封装,并不要求大家看完就能完全理解并具备开发游戏的能力。我们......
  • 2023-10-12 闲话
    昨天把所有博客全用markdown存到本地了。今天打算全转成pdf放到github上,但是人工实现工作量有点大。目前的想法是把所有图片换一个地方存一下。因为我们都不知道今年年底,我们热爱的、坚守的博客园命运会是什么样的。二十多年了。早上重新咀嚼了一下杨卓凡的话,感觉他说的还......
  • 2023.10.12
    大抵是没有挂分。简单题+博弈+图论+树论,典。xor一个\(n\timesn\)的空矩阵\(A\),进行如下操作:给定\(r,c,l,s\),对于\(x\in[r,r+l)\),\(y\in[c,x-r+c]\),给\(A_{x,y}\)加上\(s\),也就是以\((r,c)\)为左上角的下三角区域。最后问整个矩形的异或和。\(n\le1000\),\(q\le......
  • 2023.10.12python练习关于函数
    #让20以内的奇数写入函数里然后输出三遍defnumber():a=-1whilea<19:a+=2print(a,end="")b=1whileb<=3:b+=1number()print()#输出5次20以内的奇数并输出5次9*9乘法表,都写入一个函数里defwww():x,y=1,1z=......
  • 2023/10/12 博沃创新 面试
    2023年应届生6个月试用期被裁第一次社招16号辞职前4天  心里空落落  对自己很失望面试计7-8min心里大受打击好菜啊1.关于BMS的实现细节上问题对于OCV值怎么校正的?答的太差了 在初始化3s内进行校正  DOD2OCV来实现  又问极化存在很长时间怎么办?没回答上......
  • 2023/10/12 学习笔记2
    一、信号与数制转换1.1 信号相关概念1.1.1 信息:不同领域对信息有不同的定义,一般认为信息是人们对现实世界事物的存在方式或运动状态的某种认识。表示信息的形式可以是数值、文字、图形、声音、图像及动画等。1.1.2 数据:数据是用于描述事物的某些属性的具体量值。1.1.......
  • 2023.10.9NOIPSIM1总结
    ##T1区分度先手算一下找下规律,发现数列呈现$1,2,2,3,3,4,4,4,5,5,5,6,6,6,6,7,7,7,7,8,8,8,8,8......$的规律。数据范围到$1e13$,考虑数论分块,每块的块长由前一块块长递推得到。在块内累$\Omicron$(1)累计答案,跳块时间复杂度$\Omicron$($\sqrtn$),总复杂度$\Omicron(t\sqr......