2022-01-06

SimpleRev

在这里插入图片描述
说明这是一个win文件,没有加壳,而且是64位的

用IDA64打开

很容易找到main函数
在这里插入图片描述
F5查看代码
在这里插入图片描述
读程序,发现当输入的字符v4既不是d也不是D的时候会停止内层循环,反之会调用Decry()函数;过了内测循环之后是判断v4如果等于q或者Q就会直接结束,如果没有结束(继续运行的话),会输出:输入格式错误!

可以查看这个Decry()函数,如下
在这里插入图片描述
i++,表示先取i的值进行表达式计算或函数调用,最后加法再计算 i=i+1;

++i,表示先加法计算i=i+1,然后在进行表达式计算或函数调用。

C 库函数 int strcmp(const char *str1, const char *str2) 把 str1 所指向的字符串和 str2 所指向的字符串进行比较。
如果返回值小于 0,则表示 str1 小于 str2。
如果返回值大于 0,则表示 str1 大于 str2。
如果返回值等于 0,则表示 str1 等于 str2。

C 库函数 char *strcat(char *dest, const char *src) 把 src 所指向的字符串追加到 dest 所指向的字符串的结尾。

join函数,它的作用是以指定的字符连接成一个新的字符串。

加上注释,转变为可读性比较强的

__int64 Decry()
{
  char *v0; // rax@1
  char v2; // [sp+Fh] [bp-51h]@19
  int v3; // [sp+10h] [bp-50h]@1
  signed int v4; // [sp+14h] [bp-4Ch]@1
  signed int i; // [sp+18h] [bp-48h]@1
  signed int v6; // [sp+1Ch] [bp-44h]@1
  char src[8]; // [sp+20h] [bp-40h]@1
  __int64 v8; // [sp+28h] [bp-38h]@1
  int v9; // [sp+30h] [bp-30h]@1
  __int64 v10; // [sp+40h] [bp-20h]@1
  __int64 v11; // [sp+48h] [bp-18h]@1
  int v12; // [sp+50h] [bp-10h]@1
  __int64 v13; // [sp+58h] [bp-8h]@1

  v13 = *MK_FP(__FS__, 40LL);
  *(_QWORD *)src = 'SLCDN';
  v8 = 0LL;
  v9 = 0;
  v10 = 'wodah';
  v11 = 0LL;
  v12 = 0;
  LODWORD(v0) = join(key3, &v10);               // key3=='kills',v10='wodah'。连接key3,v10
  text = v0;
  strcpy(key, key1);                            // key1=='ADSFK',src=='SLCDN'。连接
  strcat(key, src);
  v3 = 0;
  v4 = 0;
  getchar();
  v6 = strlen(key);                             // 10
  for ( i = 0; i < v6; ++i )
  {
    if ( key[v4 % v6] > '@' && key[v4 % v6] <= 'Z' )
      key[i] = key[v4 % v6] + 32;               // 如果key里有大写字符,变成小写
    ++v4;
  }
  printf("Please input your flag:", src);
  while ( 1 )
  {
    v2 = getchar();
    if ( v2 == '\n' )
      break;
    if ( v2 == ' ' )
    {
      ++v3;
    }
    else
    {
      if ( v2 <= '`' || v2 > 'z' )
      {
        if ( v2 > '@' && v2 <= 'Z' )            // 如果是大写字符
          str2[v3] = (v2 - '\'' - key[v4++ % v6] + 'a') % 26 + 'a';
      }
      else                                      // 如果是小写字母
      {
        str2[v3] = (v2 - '\'' - key[v4++ % v6] + 'a') % 26 + 'a';// 都变成小写字符,并且按位减去key中字符-'a'
      }
      if ( !(v4 % v6) )
        putchar(' ');
      ++v3;
    }
  }
  if ( !strcmp(text, str2) )//如果text==str2
    puts("Congratulation!\n");
  else
    puts("Try again!\n");
  return *MK_FP(__FS__, 40LL) ^ v13;
}

了解过程就容易写程序了

#include <stdio.h>
int main()
{
	char key[] = "adsfkndcls";
	char text[] = "killshadow";
	int v = 10;
	for (int i = 0; i < 10; i++)
	{
		for (int j = 65; j < 123; j++)
		{
			if (j > 'Z' && j < 'a')
			{
				continue;
			}
			if ((j - 39 - key[v % 10] + 'a') % 26 + 'a' == text[i])
			{
				printf("%c",j);
				v++;
				break;
			}
		}
	}
	printf("\n");
	return 0;
}

运行得到
在这里插入图片描述
提交flag{KLDQCUDFZO}显示正确

Java逆向解密

程序员小张不小心弄丢了加密文件用的秘钥,已知还好小张曾经编写了一个秘钥验证算法,聪明的你能帮小张找到秘钥吗? 注意:得到的 flag 请包上 flag{} 提交

解压就得到一个.class文件,用Eclipse还打不开
在这里插入图片描述
搜了一下java反编译工具,jd-gui要下载,直接用的在线反编译网站:https://jdec.app/
得到

/* Decompiler 33ms, total 22066ms, lines 39 */
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 ^ 32;
         Resultlist.add(result);
      }

      int[] KEY = new int[]{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(KEY[j]);
      }

      System.out.println("Result:");
      if (Resultlist.equals(KEYList)) {
         System.out.println("Congratulations!");
      } else {
         System.err.println("Error!");
      }

   }
}

还是习惯用python敲

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{This_is_the_flag_!}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值