Gu-f 发表于 2019-5-6 22:28:07

bitwise题解

做ctf的时候遇到了一个bitwise的题,当时给的归类我记得是逆向,但是我更觉得不太合适,然后我考虑了下还是发在misc里吧题目描述很简单,提交请加上flag{ },没什么用然后下载下来压缩包解压缩后市两个程序源文件bitwise.java和bitwise.py两个代码实现的功能是完全一样的,所以我们用bitwise.java作为原脚本不动,然后改写bitwise.py脚本进行解密。Bitwise.java内容如下:import java.util.*;

public class Bit {
public static void main(String[] args) {
    System.out.print("Enter Password: ");
    Scanner s = new Scanner(System.in);
    String user_key = s.next();
    if (user_key.length() != 10) {
      System.out.println("Wrong");
      return;
    }

    char[] verify_arr = {193, 35, 9, 33, 1, 9, 3, 33, 9, 225};

    ArrayList<Character> user_arr = new ArrayList<Character>();
    char[] user_submitted_arr = user_key.toCharArray();

    for (char ch : user_submitted_arr) {
      user_arr.add((char)((((ch << 5) | (ch >> 3)) ^ 111) & 255));
    }

    int i;
    for(i = 0; i < 10; i++) {
      if (!user_arr.get(i).equals((char)verify_arr)) {
      System.out.println("Wrong");
      return;
      }
    }
    System.out.println("Success");
}
}
大体上阅读一下了解它的一些内容程序就是在开始让你输入一个字符串,然后判断字符串是否符合长度要求,不符合的话输出错误,如果长度符合,然后进行位运算,就是这一串操作user_arr.add((char)((((ch << 5) | (ch >> 3)) ^ 111)& 255));然后和arr里面的内容进行比较,如果一样的话就success,不一样就wrong首先想到的是给他加个while循环然后直接爆破明文,但是看到是10位就放弃了,直接爆破的话太废时间,然后考虑进行过程的逆向操作,但是对位运算进行的话还是不好操作。仔细看了下代码发现它的加密过程是一个字符一个字符进行的,然后密文是存放在数组中,想到这里就变的非常简单了,直接爆破不行那就间接爆破。间接爆破思路:每次对一位字符进行加密处理然后和arr进行比较,这一操作可以大大降底复杂度,使得总处理时间在几毫秒就可以完成改写原bitwise.py加密脚本为解密爆破脚本:
内容如下:#!/usr/bin/env python

zi=['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','1','2','3','4','5','6','7','8','9','0']
#count=0;
for count in range(10):
      for i in zi:
                user_submitted=i
                verify_arr =
                #user_arr = []
                for char in user_submitted:
                        user_arr=( (((ord(char) << 5) | (ord(char) >> 3)) ^ 111) & 255 )

                if (user_arr == verify_arr):
                        #print "Success"
                        print (count,end="*")
                        print (user_submitted)
                                                                #else:
                                                                        #print "Wrong"
      #count=count+1

一开始只用的英文字母,然后发现有未知字符,于是添加0-9数字,成功破解。然后将明文ub3rs3cr3t提交到bitwise.java脚本成功出现success
之后加上flag{ }提交通过。
页: [1]
查看完整版本: bitwise题解