查看: 319|回复: 0

[Misc] bitwise题解

[复制链接]
发表于 2019-5-6 22:28:07 | 显示全部楼层 |阅读模式
做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[i])) {
        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 = [193, 35, 9, 33, 1, 9, 3, 33, 9, 225]
                #user_arr = []
                for char in user_submitted:
                        user_arr=( (((ord(char) << 5) | (ord(char) >> 3)) ^ 111) & 255 )

                if (user_arr == verify_arr[count]):
                        #print "Success"
                        print (count,end="*")
                        print (user_submitted)
                                                                #else:
                                                                        #print "Wrong"
        #count=count+1
一开始只用的英文字母,然后发现有未知字符,于是添加0-9数字,成功破解。
211495cd0445e3bf89.png
然后将明文ub3rs3cr3t提交到bitwise.java脚本成功出现success

之后加上flag{ }提交通过。
温馨提示:
1.如果您喜欢这篇帖子,请给作者点赞评分,点赞会增加帖子的热度,评分会给作者加学币。(评分不会扣掉您的积分,系统每天都会重置您的评分额度)。
2.回复帖子不仅是对作者的最好奖励,还可以获得学币奖励,请尊重作者的劳动成果,拒绝做伸手党!
3.发广告、灌水回复等违规行为一经发现直接禁言,如果本帖内容涉嫌违规,请点击论坛底部的举报反馈按钮,也可以在【投诉建议】板块发帖举报。
关闭

论坛公告上一条 /1 下一条

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