zoukankan      html  css  js  c++  java
  • buuctf re [WUSTCTF2020]level3

    int __cdecl main(int argc, const char **argv, const char **envp)
    {
      const char *v3; // rax
      char v5; // [rsp+Fh] [rbp-41h]
      char v6[56]; // [rsp+10h] [rbp-40h] BYREF
      unsigned __int64 v7; // [rsp+48h] [rbp-8h]
    
      v7 = __readfsqword(0x28u);
      printf("Try my base64 program?.....\n>");
      __isoc99_scanf("%20s", v6);
      v5 = time(0LL);
      srand(v5);
      if ( (rand() & 1) != 0 )
      {
        v3 = (const char *)base64_encode(v6);
        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:");
        puts("d2G0ZjLwHjS7DmOzZAY0X2lzX3CoZV9zdNOydO9vZl9yZXZlcnGlfD==");
        puts("What's wrong??");
      }
      return 0;
    }
    

    输出里 puts是base加密 然后根据printf("Try my base64 program?.....\n>");看出是base64

    但直接按照base64脚本解密是错误的
    于是查看base64_encode 发现其中的tabe表一直在被调用

    查看都是谁在调用

    查看到有一个函数进入

    __int64 O_OLookAtYou()
    {
      __int64 result; // rax
      char v1; // [rsp+1h] [rbp-5h]
      int i; // [rsp+2h] [rbp-4h]
    
      for ( i = 0; i <= 9; ++i )
      {
        v1 = base64_table[i];
        base64_table[i] = base64_table[19 - i];
        result = 19 - i;
        base64_table[result] = v1;
      }
      return result;
    }
    

    base64_table[i] = base64_table[19 - i];

    跑一下发现是A-T调换顺序

    #include<iostream>
    #include<cstring>
    using namespace std;
    int main()
    {
    	char base64_table[]="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
    	char flag[]="d2G0ZjLwHjS7DmOzZAY0X2lzX3CoZV9zdNOydO9vZl9yZXZlcnGlfD==";
    	char v0;
    	int result;
    	for (int i=0;i<=9;i++)
    	{
    		v0=base64_table[i];
        base64_table[i] = base64_table[19 - i];
        result = 19 - i;
        base64_table[result] = v0;
         }
        for (int i=0;i<=63;i++)
    	  {
    	  	cout<<base64_table[i];
    	  }
    	  cout<<endl;
    	  for (int i=0;i<strlen(flag);i++)
    	  {
    	  	if(flag[i]>='A'&&flag[i]<='T')
    	  	{
    	  		flag[i]=(19-(flag[i]-'A')+'A');
    		  }
    		cout<<flag[i];
    	  }
     } 
    

    flag{Base64_is_the_start_of_reverse}

  • 相关阅读:
    (七)FAP平台--报表篇
    (六)FAP平台--多语言篇
    (五)FAP平台--审批单据篇
    (四)FAP平台--流程篇
    (三)FAP平台--Rbac权限篇
    (二)FAP平台--开发简单界面
    (一)FAP平台--元数据篇
    开源一个基于.netcore的企业级应用开发框架(FAP)
    .netcore实现一个读写分离的数据库访问中间件
    适岗培训企业员工在线免费技能培训学习补贴系统,专业技能在线直播视频培训平台!
  • 原文地址:https://www.cnblogs.com/socialbiao/p/15710109.html
Copyright © 2011-2022 走看看