BUUCTF Reverse刷题笔记02(xor、reverse3、不一样的flag、SimpleRev、Java逆向解密)

一、xor

在这里插入图片描述
拉入ExeinfoPe分析
在这里插入图片描述
程序为64位

拉入64位IDA分析
在这里插入图片描述找到main函数,F5查看伪代码
在这里插入图片描述发现是字符异或,再与global比较,使用我们跟进global
在这里插入图片描述注意这里不能直接复制,要将global中保存到奇怪字符全部转换为ascll码,然后再去异或

运用脚本

a= [0x66, 0x0A, 0x6B, 0x0C, 0x77, 0x26,
    0x4F, 0x2E, 0x40, 0x11, 0x78, 0x0D,
    0x5A, 0x3B, 0x55, 0x11,
    0x70, 0x19, 0x46, 0x1F, 0x76, 0x22,
    0x4D, 0x23, 0x44, 0x0E, 0x67,
    0x06, 0x68, 0x0F, 0x47, 0x32,0x4F]

flag=''
flag+='f'
for i in range(1,len(a)):
    flag+=chr(a[i]^a[i-1])
print(flag)

在这里插入图片描述

二、reverse3

在这里插入图片描述
拉入ExeinfoPe分析
在这里插入图片描述
拉入32位IDA分析

找到main函数,F5查看伪代码
在这里插入图片描述分析代码发现,该代码是输入一个字符串后然后经过sub_4110BE函数进行加密再通过一个for循环进行变换,然后与Str2中字符串进行比较

所以我们跟进Str2
在这里插入图片描述得到Str2中保存的字符串

接着我们去找加法方式是什么

返回main函数,跟进sub_4110BE函数
在这里插入图片描述感觉很像base64加密,跟进aAbcdefghijklmn
在这里插入图片描述确实是base64加密,运用解题脚本

import base64

s="e3nifIH9b_C@n@dH"

x=""

for i in range(0,len(s)):
    x+=chr(ord(s[i])-i)
print(base64.b64decode(x))

在这里插入图片描述得到flag

flag{i_l0ve_you}

三、不一样的flag

在这里插入图片描述01、运行程序
在这里插入图片描述上下左右,应该是走迷宫

02、拉入ExeinfoPe分析
在这里插入图片描述03、拉入32位IDA分析
shift+F12,查看字符串
在这里插入图片描述这个应该就是走迷宫了,接下来看他怎么走

找到main函数,F5查看伪代码

int __cdecl main(int argc, const char **argv, const char **envp)
{
  char v3; // [esp+17h] [ebp-35h]
  int v4; // [esp+30h] [ebp-1Ch]
  int v5; // [esp+34h] [ebp-18h]
  signed int v6; // [esp+38h] [ebp-14h]
  int i; // [esp+3Ch] [ebp-10h]
  int v8; // [esp+40h] [ebp-Ch]

  __main();
  v4 = 0;
  v5 = 0;
  qmemcpy(&v3, _data_start__, 0x19u);
  while ( 1 )
  {
    puts("you can choose one action to execute");
    puts("1 up");
    puts("2 down");
    puts("3 left");
    printf("4 right\n:");
    scanf("%d", &v6);
    if ( v6 == 2 )
    {
      ++v4;
    }
    else if ( v6 > 2 )
    {
      if ( v6 == 3 )
      {
        --v5;
      }
      else
      {
        if ( v6 != 4 )
LABEL_13:
          exit(1);
        ++v5;
      }
    }
    else
    {
      if ( v6 != 1 )
        goto LABEL_13;
      --v4;
    }
    for ( i = 0; i <= 1; ++i )
    {
      if ( *(&v4 + i) < 0 || *(&v4 + i) > 4 )
        exit(1);
    }
    if ( *((_BYTE *)&v8 + 5 * v4 + v5 - 41) == 49 )
      exit(1);
    if ( *((_BYTE *)&v8 + 5 * v4 + v5 - 41) == 35 )
    {
      puts("\nok, the order you enter is the flag!");
      exit(0);
    }
  }
}

在这里插入图片描述不能走‘1’,找到‘#’就能得到flag
在这里插入图片描述
从‘*’开始,走‘0’不走‘1’,走到‘#’

便得到

222441144222

包上flag上交

四、SimpleRev

在这里插入图片描述拉入ExeinfoPe分析
在这里插入图片描述拉入64位IDA分析

找到main函数,F5查看伪代码
在这里插入图片描述跟进Decry

unsigned __int64 Decry()
{
  char v1; // [rsp+Fh] [rbp-51h]
  int v2; // [rsp+10h] [rbp-50h]
  int v3; // [rsp+14h] [rbp-4Ch]
  int i; // [rsp+18h] [rbp-48h]
  int v5; // [rsp+1Ch] [rbp-44h]
  char src[8]; // [rsp+20h] [rbp-40h]
  __int64 v7; // [rsp+28h] [rbp-38h]
  int v8; // [rsp+30h] [rbp-30h]
  __int64 v9; // [rsp+40h] [rbp-20h]
  __int64 v10; // [rsp+48h] [rbp-18h]
  int v11; // [rsp+50h] [rbp-10h]
  unsigned __int64 v12; // [rsp+58h] [rbp-8h]

  v12 = __readfsqword(0x28u);
  *(_QWORD *)src = 357761762382LL;                //SLCDN
  v7 = 0LL;
  v8 = 0;
  v9 = 512969957736LL;                            //wodah
  v10 = 0LL; 
  v11 = 0;
  text = (char *)join(key3, &v9);                //text=killshadow
  strcpy(key, key1);
  strcat(key, src);                              //key=ADSFKNDCLS
  v2 = 0;
  v3 = 0;
  getchar();
  v5 = strlen(key);
  for ( i = 0; i < v5; ++i )
  {
    if ( key[v3 % v5] > 64 && key[v3 % v5] <= 90 ) 
      key[i] = key[v3 % v5] + 32;
    ++v3;
  }                                             //key=adsfkndcls
  printf("Please input your flag:", src);
  while ( 1 )
  {
    v1 = getchar();
    if ( v1 == 10 )
      break;
    if ( v1 == 32 )
    {
      ++v2;
    }
    else
    {
      if ( v1 <= 96 || v1 > 122 )
      {
        if ( v1 > 64 && v1 <= 90 )
          str2[v2] = (v1 - 39 - key[v3++ % v5] + 97) % 26 + 97;
      }
      else
      {
        str2[v2] = (v1 - 39 - key[v3++ % v5] + 97) % 26 + 97;
      }
      if ( !(v3 % v5) )
        putchar(32);
      ++v2;
    }
  }
  if ( !strcmp(text, str2) )
    puts("Congratulation!\n");
  else
    puts("Try again!\n");
  return __readfsqword(0x28u) ^ v12;
}

分析完程序,运用c++脚本

#include <iostream>

using namespace std;

int main()
{
	char key[] = "adsfkndcls";
	char text[] = "killshadow";
	int v3 = 10;
	for (int i = 0; i < 10; i++)
	{
		for (int j = 0; j < 128; j++)
		{
			if (j < 'A' || j > 'z' || j > 'Z' && j < 'a')
			{
				continue;
			}
			if ((j - 39 - key[v3 % 10] + 97) % 26 + 97 == text[i])
			{
				cout << char(j);
				v3++;
				break;
			}
		}
	}
}

运行得到
在这里插入图片描述

五、Java逆向解密

在这里插入图片描述下载附件得到.class文件

直接用jd-gui工具打开

得到代码

import java.util.ArrayList;
import java.util.Scanner;

public class Reverse {
  public static void main(String[] args) {
    Scanner s = new Scanner(System.in);
    System.out.println("Please input the flag );
    String str = s.next();
    System.out.println("Your input is );
    System.out.println(str);
    char[] stringArr = str.toCharArray();
    Encrypt(stringArr);
  }
  
  public static void Encrypt(char[] arr) {
    ArrayList<Integer> Resultlist = new ArrayList<>();
    for (int i = 0; i < arr.length; i++) {
      int result = arr[i] + 64 ^ 0x20;
      Resultlist.add(Integer.valueOf(result));
    } 
    int[] KEY = { 
        180, 136, 137, 147, 191, 137, 147, 191, 148, 136, 
        133, 191, 134, 140, 129, 135, 191, 65 };
    ArrayList<Integer> KEYList = new ArrayList<>();
    for (int j = 0; j < KEY.length; j++)
      KEYList.add(Integer.valueOf(KEY[j])); 
    System.out.println("Result:");
    if (Resultlist.equals(KEYList)) {
      System.out.println("Congratulations);
    } else {
      System.err.println("Error);
    } 
  }
}

分析代码,首先让我们输入一个字符串,然后经过一个for循环进行异或,然后将得到的新字符串与KEY进行比较

运用脚本

strs = [180, 136, 137, 147, 191, 137, 147, 191,
 148, 136, 133, 191, 134, 140, 129, 135, 191, 65]

flag = ""
for i in range(0,len(strs)):
	flag += chr(strs[i] - ord('@') ^ 0x20)
print(flag)

在这里插入图片描述得到flag

flag{This_is_the_flag_!}
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值