[WUSTCTF2020]level3题解

简介: [WUSTCTF2020]level3题解

[WUSTCTF2020]level3题解


解题思路

1.找到主函数反编译

int __cdecl main(int argc, const char **argv, const char **envp)
{
  char *v3; // rax
  char v5; // [rsp+Fh] [rbp-41h]
  char v6; // [rsp+10h] [rbp-40h]
  unsigned __int64 v7; // [rsp+48h] [rbp-8h]
  v7 = __readfsqword(0x28u);
  printf("Try my base64 program?.....\n>", argv, envp);
  __isoc99_scanf("%20s", &v6);  
    //输入字符串
  v5 = time(0LL);
  srand(v5);
  if ( rand() & 1 )
  {
    v3 = base64_encode(&v6);  
    //对输入的字符串进行base64编码
    puts(v3);
    puts("Is there something wrong?");
  }
  else
  {
    puts("Sorry I think it's not prepared yet....");
    puts("And I get a strange string from my program which is different from the standard base64:");     
    //得到了一段奇怪的字符串与标准base64编码表不同,可知应该不是标准的base64编码表
    puts("d2G0ZjLwHjS7DmOzZAY0X2lzX3CoZV9zdNOydO9vZl9yZXZlcnGlfD==");  
    //一段base64编码
    puts("What's wrong??");
  }
  return 0;
}

根据文字提示和一段应该是base64加密后的算法确定,应该是一道base64的题目

2.想寻找这道题目的base64编码表,打开string窗口

发现了一个疑似base64编码表的字符串

发现少一个字符

3.跟进查看

将这一段按快捷键A,转化为字符串

得到一个通用base64编码表

'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'

分析

1.与主函数的输出信息"And I get a strange string from my program which is different from the standard base64:"("得到了一段奇怪的字符串与标准base64编码表不同")。

2.并不能正确解码。

结论

这个编码表应该经过了修改

4.选中base64_table按快捷键X,交叉引用,查看引用这个字符串的函数

为函数O_OLookAtYou  和 base64_encode,查看这两个函数的代码

5.发现O_OLookAtYou函数对编码表做了修改

根据这个函数,解出改变后的编码表,脚本如下

#include<iostream> 
using namespace std;
int main(){
  string base64_table = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
  for ( int i = 0; i <= 9; ++i ){
      int v1 = base64_table[i];
      base64_table[i] = base64_table[19 - i];
      int result = 19 - i;
      base64_table[result] = v1;
  }
  cout <<base64_table<<endl;
}

运行结果为TSRQPONMLKJIHGFEDCBAUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/

6.将主函数中找到的base64加密后的字符串解码

import base64
str_1 = "d2G0ZjLwHjS7DmOzZAY0X2lzX3CoZV9zdNOydO9vZl9yZXZlcnGlfD=="
str_base = "TSRQPONMLKJIHGFEDCBAUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
#自定义的编码表
str_zh_base = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
#通用编码表
flag = base64.b64decode(str_1.translate(str.maketrans(str_base,str_zh_base)))
print(flag)

运行结果wctf2020{Base64_is_the_start_of_reverse}

相关文章
Leetcode Minimum Depth of Binary Tree (面试题推荐)
计算树的最小深度 很简单的一道题,只需要遍历一次树,到叶子节点的时候计算一下深度和当前最小深度比较,保存最小值就行。 我在这用了一个全局变量 mindepth。总感觉我这代码写的不够简练,求更精简的方法。
47 0
|
开发框架 .NET
poj 3468 A Simple Problem with Integers线段树区间修改
题目意思很简单,有N个数,Q个操作, Q l r 表示查询从l到r 的和,C l r v 表示将从l到r 的值加上v,明显的线段树,不知道线段树的人肯定暴力,肯定超时,哈哈!!
33 0
|
存储
Leetcode Single Number II (面试题推荐)
给你一个整数数组,每个元素出现了三次,但只有一个元素出现了一次,让你找出这个数,要求线性的时间复杂度,不使用额外空间。
39 0
|
机器学习/深度学习 存储 C++
【PAT甲级 - C++题解】1110 Complete Binary Tree
【PAT甲级 - C++题解】1110 Complete Binary Tree
81 0
|
网络协议 Linux Go
[WUSTCTF2020]level4题解
[WUSTCTF2020]level4题解
202 0
[WUSTCTF2020]level4题解
|
Linux 虚拟化
[WUSTCTF2020]level2题解
[WUSTCTF2020]level2题解
285 0
[WUSTCTF2020]level2题解
|
算法
LeetCode 306. Additive Number
累加数是一个字符串,组成它的数字可以形成累加序列。 一个有效的累加序列必须至少包含 3 个数。除了最开始的两个数以外,字符串中的其他数都等于它之前两个数相加的和。 给定一个只包含数字 '0'-'9' 的字符串,编写一个算法来判断给定输入是否是累加数。 说明: 累加序列里的数不会以 0 开头,所以不会出现 1, 2, 03 或者 1, 02, 3 的情况。
123 0
LeetCode 306. Additive Number
|
存储 人工智能 测试技术
LeetCode之Number Complement
LeetCode之Number Complement
71 0