CTF练习解析

实验吧逆向工程-bitwise

2019-04-27  本文已影响30人  追求科技的足球

题目下载链接: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是一样的思想,就是换一种语言写。

小结:今天的题也不算难,属于汇编基本知识的应用,基础还是很重要啊。

上一篇下一篇

猜你喜欢

热点阅读