美文网首页CTF练习解析
实验吧逆向工程-bitwise

实验吧逆向工程-bitwise

作者: 追求科技的足球 | 来源:发表于2019-04-27 09:34 被阅读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是一样的思想,就是换一种语言写。

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

    相关文章

      网友评论

        本文标题:实验吧逆向工程-bitwise

        本文链接:https://www.haomeiwen.com/subject/ofhtnqtx.html