做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数字,成功破解。 然后将明文ub3rs3cr3t提交到bitwise.java脚本成功出现success
之后加上flag{ }提交通过。 |