题目下载链接:http://ctf5.shiyanbar.com/reverse/bitwise/bitwise.rar
上来又是一堆英文,其实也挺有趣,逗你一下,让你开心一些。
英文意思为:
你看到loading bay的门,但它们被锁定了。 但是,你可以从控制面板中提取密码验证程序...你是否可以找到密码才能访问loading bay?
先下载题目压缩包看看吧。
解压后有一个java文件和一个python文件,神奇
1、先看python吧,这是体重给的python代码:
#!/usr/bin/env python
user_submitted = raw_input("Enter Password: ")
if len(user_submitted) != 10:
print "Wrong"
exit()
verify_arr = [193, 35, 9, 33, 1, 9, 3, 33, 9, 225]
user_arr = []
for char in user_submitted:
# '<<' is left bit shift
# '>>' is right bit shift
# '|' is bit-wise or
# '^' is bit-wise xor
# '&' is bit-wise and
user_arr.append( (((ord(char) << 5) | (ord(char) >> 3)) ^ 111) & 255 )
if (user_arr == verify_arr):
print "Success"
else:
print "Wrong"
好像就是一个反向解密?感觉如同密码学啊。。
2、直接再写一个python自动化解密吧,首先是暴力破解,ord函数是字符转ASCII码,chr函数为ASCII码转字符。
verify_arr = [193, 35, 9, 33, 1, 9, 3, 33, 9, 225]
user_arr = [0,0,0,0,0,0,0,0,0,0]
for i in range(10):
for j in range(128):
if (verify_arr[i] == (((j << 5) | (j >> 3)) ^ 111) & 255):
user_arr[i] = j
flag = ''
for i in user_arr:
flag += chr(i) #转换成字符
print(flag)
3、再根据处理的顺序反写一个解密吧。
(((ord(char) << 5) | (ord(char) >> 3)) ^ 111) & 255
首先把字符转为ASCII码值,进行二进制操作,左移五位与右移三位的值求或,再与111取异或,最后在与255(11111111)取与。
那就把这个语句反向一下:
(1)与255(11111111)取与是取低8位。
(2)与111异或得的值再异或一次可以返回。
(3)左移五位后补5个0,右移三位后前补3个0,所以或为0,不对中间值起作用(相当于相加)。
verify_arr = [193, 35, 9, 33, 1, 9, 3, 33, 9, 225]
flag = ''
for i in verify_arr:
flag += chr(((i^111)>>5)|((i^111)<<3)&255)
print(flag)
4、java是一样的思想,就是换一种语言写。
小结:今天的题也不算难,属于汇编基本知识的应用,基础还是很重要啊。