安全矩阵

 找回密码
 立即注册
搜索
查看: 935|回复: 0

【逆向分析】BUUCTF 逆向题目 Java逆向解密

[复制链接]

417

主题

417

帖子

2391

积分

金牌会员

Rank: 6Rank: 6

积分
2391
发表于 2023-12-7 18:14:01 | 显示全部楼层 |阅读模式
利刃信安 利刃信安攻防实验室 2023-12-02 19:01 发表于北京

题目地址:
  1. https://buuoj.cn/challenges#Java%E9%80%86%E5%90%91%E8%A7%A3%E5%AF%86
复制代码



  1. https://files.buuoj.cn/files/22ddfaaeadab32fe72719e254a0b127e/818a93f3-78b6-4e8d-a5b5-4c492695cef4.zip
复制代码



class文件,先转换成java代码
  1. https://github.com/abc123info/BlueTeamTools/releases
复制代码




  1. import java.util.ArrayList;
  2. import java.util.Scanner;

  3. public class Reverse {
  4.     public static void main(String[] args) {
  5.         Scanner s = new Scanner(System.in);
  6.         System.out.println("Please input the flag \uff1a");
  7.         String str = s.next();
  8.         System.out.println("Your input is \uff1a");
  9.         System.out.println(str);
  10.         char[] stringArr = str.toCharArray();
  11.         Encrypt(stringArr);
  12.     }

  13.     public static void Encrypt(char[] arr) {
  14.         ArrayList<Integer> Resultlist = new ArrayList();

  15.         for(int i = 0; i < arr.length; ++i) {
  16.             int result = arr[i] + 64 ^ 32;
  17.             Resultlist.add(result);
  18.         }

  19.         int[] KEY = new int[]{180, 136, 137, 147, 191, 137, 147, 191, 148, 136, 133, 191, 134, 140, 129, 135, 191, 65};
  20.         ArrayList<Integer> KEYList = new ArrayList();

  21.         for(int j = 0; j < KEY.length; ++j) {
  22.             KEYList.add(KEY[j]);
  23.         }

  24.         System.out.println("Result:");
  25.         if (Resultlist.equals(KEYList)) {
  26.             System.out.println("Congratulations\uff01");
  27.         } else {
  28.             System.err.println("Error\uff01");
  29.         }

  30.     }
  31. }
复制代码


分析代码可知,用户输入flag后,flag中每一位都加64 ^ 32得到KEY

KEY = 180, 136, 137, 147, 191, 137, 147, 191, 148, 136, 133, 191, 134, 140, 129, 135, 191, 65



用python3写代码反推flag


  1. import sys

  2. def decrypt(KEY):
  3.     original_flag = ''.join(chr(key_value - 64 ^ 32) for key_value in KEY)
  4.     return original_flag

  5. def main():
  6.     KEY = [180, 136, 137, 147, 191, 137, 147, 191, 148, 136, 133, 191, 134, 140, 129, 135, 191, 65]

  7.     decrypted_flag = decrypt(KEY)

  8.     sys.stdout.buffer.write(f"Decrypted flag:\n{decrypted_flag}\n".encode('utf-8'))

  9. if __name__ == "__main__":
  10.     main()
复制代码



用C++写代码反推flag
  1. #include <iostream>
  2. #include <vector>

  3. void decrypt(const std::vector<int>& KEY) {
  4.     std::string originalFlag;

  5.     for (int j = 0; j < KEY.size(); ++j) {
  6.         int original = KEY[j] - 64 ^ 32;
  7.         originalFlag += static_cast<char>(original);
  8.     }

  9.     std::cout << "Decrypted flag:\n" << originalFlag << std::endl;
  10. }

  11. int main() {
  12.     std::vector<int> KEY = {180, 136, 137, 147, 191, 137, 147, 191, 148, 136, 133, 191, 134, 140, 129, 135, 191, 65};
  13.     decrypt(KEY);

  14.     return 0;
  15. }
复制代码


  1. flag{This_is_the_flag_!}
复制代码


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|安全矩阵

GMT+8, 2024-11-27 22:26 , Processed in 0.012756 second(s), 19 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表