Crypto题型一解Flag详情

admin 2023年1月7日05:54:01评论15 views字数 11467阅读38分13秒阅读模式

Crypto题型一解Flag详情
点击上方蓝字  关注安全知识


hello everyone


一、题目讲解

二、做题思路

三、做题利用工具

 

.题目讲解

先看题

Crypto题型一解Flag详情

众所周知,ctf一般会在题目名或题目中给提示,当看到打了引号的"疑惑"时

了解过异或运算的可能会反应过来

异或运算,简而言之

0110100110001011举列

01执行后是1

00执行后是0

11执行后是0

所以这个列子的结果就是:11100010

所以异或运算就是将两个值对比,检测是否一样若结果为true就为0,如果结果为flash就为1

讲清楚了异或之后我们再回到题目

根据异或运算的格式,需要两个值才能进行运算

花点时间数数,发现keys1有39位、keys2有39位值

我们把他转为8位二进制。

先试试最后一个值来尝试!:00100001   92:01011100

Crypto题型一解Flag详情

异或后的结果:01111101经过ascii之后得到了},这下有很大把握是异或运算了

再通过脚本把所有值转为二进制再进行异或运算再对应ascii表转换为字母or字符

Crypto题型一解Flag详情

01110111 01100101 01101100 01100011 01101111 01101101 01100101 01011111 01110100 01101111 01011111 01101110 01101001 01101110 01100101 00101101 01100001 01101011 01011111 01101101 01100001 01110100 01100011 01101000 01011111 01101001 01110011 01011111 01110011 01101111 01011111 01100101 01100001 01110011 01111001 01011111 00100001 01000000 00100001

Crypto题型一解Flag详情

00010100 00000100 00011000 00000101 01011110 00001100 00000010 00100100 00011010 00000110 00110001 00001011 01000100 00001111 00001110 01110010 00001100 00001010 00101011 00001110 00001001 00101011 00001010 00011011 00011111 00011111 00010110 00101101 00001010 00110000 00111010 00000100 00010010 00001010 00100110 00011111 00001110 01100001 01011100

Crypto题型一解Flag详情

01100011 01100001 01110100 01100110 00110001 01100001 01100111 01111011 01101110 01101001 01101110 01100101 00101101 01100001 01101011 01011111 01101101 01100001 01110100 01100011 01101000 01011111 01101001 01110011 01000000 01110110 01100101 01110010 01111001 01011111 01100101 01100001 01110011 01111001 01011111 01000000 00101111 00100001 01111101

转换为ascii码:ctf1ag{niSe-ak_match_isdvery_easy_@/!}

 

.做题思路

刚拿到题的时候我也没有思路,做了第二题后,队里有大佬让我突然发现是异或

但是知道了异或运算后,看到两个keys,很懵,当时我只想着keys2,导致让我陷入了误区

应为异或需要两个值才行,但是发现keys2只有39位,并不满足2的倍数

这时候就开始懵逼了,可是突然想起还有个keys1,最开始还有个误区,这道题给出的那串英文翻译出来

Crypto题型一解Flag详情

我当时认为keys1并没有用,当我发现keys2并不能够满足异或运算的规则时就想起了keys2

Crypto题型一解Flag详情

光标位置是40,也就是说这段字符串有39位,刚好对应了keys2的值位

确定了是异或运算之后,发现现在又有一个问题,上面我们说了异或运算是怎样运算的

但是字符串和数字怎么异或呢

这可是ctf,发挥自己的想象力,常用的ascii编码,字符串中所有字母字符都包含在这个编码里了

所以先用ascii尝试,最后利用keys1最后一位和keys2最后一个值都转换为八位二进制进行异或再通过ascii编码转换为字母or字符

最后也成功拿到了flag


.做题利用工具

可以自己提前写脚本或者直接在网上找在线转换

做题的时候并没有写这个脚本,所以当时在网上找的批量在线转换

三类利用工具:

1.在线转换

站长工具(编码转换):https://tool.chinaz.com/tools/Unicode.aspx

Crypto题型一解Flag详情

蛙蛙工具:https://www.iamwawa.cn/Crypto题型一解Flag详情

或指定对应转换搜索:

Crypto题型一解Flag详情

2.开源脚本

如果看不懂,有写代码功底还是推荐自己写,网上许多大佬写的确实看不懂,甚至用不来

也可以找简单的,自己修修补补加上自己需要的功能就行了

Crypto题型一解Flag详情Crypto题型一解Flag详情

3.自写脚本

这种最好是在比赛前最准备,比赛时再写就有点麻烦了,简单的脚本还好,难的就浪费时间了

做着道题中我用到的脚本,或许还有bug或许很简陋,但勉强可用:

Ascii转换:

在这道题中我用的脚本:# This Python file uses the following encoding: utf-8

ASCII = [
    ['00000000', '0', '00', 'NUL 空字符'],
    ['00000001', '1', '01', 'SOH 标题开始'],
    ['00000010', '2', '02', 'STX 正文开始'],
    ['00000011', '3', '03', 'ETX 正文结束'],
    ['00000100', '4', '04', 'EOT 传输结束'],
    ['00000101', '5', '05', 'ENQ 请求'],
    ['00000110', '6', '06', 'ACK 回应/响应/收到通知'],
    ['00000111', '7', '07', 'BEL 响铃'],
    ['00001000', '8', '08', 'BS 退格'],
    ['00001001', '9', '09', 'HT 水平制表符'],
    ['00001010', '10', '0A', 'LF/NL 换行键'],
    ['00001011', '11', '0B', 'VT 垂直制表符'],
    ['00001100', '12', '0C', 'FF/NP 换页键'],
    ['00001101', '13', '0D', 'CR 回车键'],
    ['00001110', '14', '0E', 'SO 不用切换'],
    ['00001111', '15', '0F', 'SI 启用切换'],
    ['00010000', '16', '10', 'DLE 数据链路转义'],
    ['00010001', '17', '11', 'DC1/XON 设备控制1/传输开始'],
    ['00010010', '18', '12', 'DC2 设备控制'],
    ['00010011', '19', '13', 'DC3/XOFF 设备控制3/传输中断'],
    ['00010100', '20', '14', 'DC4 设备控制4'],
    ['00010101', '21', '15', 'NAK 无响应/非正常响应/拒绝接收'],
    ['00010110', '22', '16', 'SYN 同步空闲'],
    ['00010111', '23', '17', 'ETB 传输块结束/块传输终止'],
    ['00011000', '24', '18', 'CAN'],
    ['00011001', '25', '19', 'EM 已到介质末端/介质存储已满/介质中断'],
    ['00011010', '26', '1A', 'SUB 替补/替换'],
    ['00011011', '27', '1B', 'ESC 逃离/取消'],
    ['00011100', '28', '1C', 'FS 文件分割符'],
    ['00011101', '29', '1D', 'GS 组分隔符/分组符'],
    ['00011110', '30', '1E', 'RS 记录分离符'],
    ['00011111', '31', '1F', 'US 单元分隔符'],
    ['00100000', '32', '20', '空格'],
    ['00100001', '33', '21', '!'],
    ['00100010', '34', '22', '"'],
    ['00100011', '35', '23', '#'],
    ['00100100', '36', '24', '$'],
    ['00100101', '37', '25', '%'],
    ['00100110', '38', '26', '&'],
    ['00100111', '39', '27', '''],
    ['00101000', '40', '28', '('],
    ['00101001', '41', '29', ')'],
    ['00101010', '42', '2A', '*'],
    ['00101011', '43', '2B', '+'],
    ['00101100', '44', '2C', ','],
    ['00101101', '45', '2D', '-'],
    ['00101110', '46', '2E', '.'],
    ['00101111', '47', '2F', '/'],
    ['00110000', '48', '30', '0'],
    ['00110001', '49', '31', '1'],
    ['00110010', '50', '32', '2'],
    ['00110011', '51', '33', '3'],
    ['00110100', '52', '34', '4'],
    ['00110101', '53', '35', '5'],
    ['00110110', '54', '36', '6'],
    ['00110111', '55', '37', '7'],
    ['00111000', '56', '38', '8'],
    ['00111001', '57', '39', '9'],
    ['00111010', '58', '3A', ':'],
    ['00111011', '59', '3B', ';'],
    ['00111100', '60', '3C', '<'],
    ['00111101', '61', '3D', '='],
    ['00111110', '62', '3E', '>'],
    ['00111111', '63', '3F', '?'],
    ['01000000', '64', '40', '@'],
    ['01000001', '65', '41', 'A'],
    ['01000010', '66', '42', 'B'],
    ['01000011', '67', '43', 'C'],
    ['01000100', '68', '44', 'D'],
    ['01000101', '69', '45', 'E'],
    ['01000110', '70', '46', 'F'],
    ['01000111', '71', '47', 'G'],
    ['01001000', '72', '48', 'H'],
    ['01001001', '73', '49', 'I'],
    ['01001010', '74', '4A', 'J'],
    ['01001011', '75', '4B', 'K'],
    ['01001100', '76', '4C', 'L'],
    ['01001101', '77', '4D', 'M'],
    ['01001110', '78', '4E', 'N'],
    ['01001111', '79', '4F', 'O'],
    ['01010000', '80', '50', 'P'],
    ['01010001', '81', '51', 'Q'],
    ['01010010', '82', '52', 'R'],
    ['01010011', '83', '53', 'S'],
    ['01010100', '84', '54', 'T'],
    ['01010101', '85', '55', 'U'],
    ['01010110', '86', '56', 'V'],
    ['01010111', '87', '57', 'W'],
    ['01011000', '88', '58', 'X'],
    ['01011001', '89', '59', 'Y'],
    ['01011010', '90', '5A', 'Z'],
    ['01011011', '91', '5B', '['],
    ['01011100', '92', '5C', '\'],
    ['01011101', '93', '5D', ']'],
    ['01011110', '94', '5E', '^'],
    ['01011111', '95', '5F', '_'],
    ['01100000', '96', '60', '`'],
    ['01100001', '97', '61', 'a'],
    ['01100010', '98', '62', 'b'],
    ['01100011', '99', '63', 'c'],
    ['01100100', '100', '64', 'd'],
    ['01100101', '101', '65', 'e'],
    ['01100110', '102', '66', 'f'],
    ['01100111', '103', '67', 'g'],
    ['01101000', '104', '68', 'h'],
    ['01101001', '105', '69', 'i'],
    ['01101010', '106', '6A', 'j'],
    ['01101011', '107', '6B', 'k'],
    ['01101100', '108', '6C', 'l'],
    ['01101101', '109', '6D', 'm'],
    ['01101110', '110', '6E', 'n'],
    ['01101111', '111', '6F', 'o'],
    ['01110000', '112', '70', 'p'],
    ['01110001', '113', '71', 'q'],
    ['01110010', '114', '72', 'r'],
    ['01110011', '115', '73', 's'],
    ['01110100', '116', '74', 't'],
    ['01110101', '117', '75', 'u'],
    ['01110110', '118', '76', 'v'],
    ['01110111', '119', '77', 'w'],
    ['01111000', '120', '78', 'x'],
    ['01111001', '121', '79', 'y'],
    ['01111010', '122', '7A', 'z'],
    ['01111011', '123', '7B', '{'],
    ['01111100', '124', '7C', '|'],
    ['01111101', '125', '7D', '}'],
    ['01111110', '126', '7E', '~'],
    ['01111111', '127', '7F', 'DEL']
]

erjinzhi_list=[]
shijinzhi_list=[]
shiliujinzhi_list=[]
zimu_or_zifu_list=[]
jiami_list=[]

def gongnegn():
    print("**********33[31mASCII转换器33[0m***********")
    print(" tt  1,二进制转换t tt ")
    print(" tt  2,十进制转换t tt ")
    print(" tt  3,十六进制转换t tt ")
    print(" tt  4,字符or字母转换tt ")
    print(" tt  5,Helptttt ")
    print(" tt  0,退出ttttt ")
    print("*******************************")

def help():
    print("*******************33[31mHelp33[0m**********************")
    print(" tt   33[31m二进制:8位    十进制:最多3位 ttt")
    print(" tt   十六进制:2位  字母or字符:1位 tt")
    print(" ttt    输入的数据不能为空 ttt")
    print(" ttt   转换器中空格即为分割 ttt")
    print(" tt    字母or字符自动多个数据转换 ttt")
    print(" tt     字母or字符不需要空格分割 ttt")
    print(" tt 如果返回值为空即是没有对应转换后的值 33[0mtt")
    print("*********************************************")

def erjinzhi():
    shuju=input("请输入二进制数据:")
    j = ""
    k = ""
    l = ""
    if shuju == '':
        print("数据不能为空")
        return
    i=len(shuju)/8
    for a in range(0, int(i)):
        c = shuju.split(' ')[a]
        erjinzhi_list.append(c)
    for p in erjinzhi_list:
        for q in ASCII:
            if p == q[0]:
                jiami_list.clear()
                j += q[1] + " "
                k += q[2] + " "
                l += q[3] + " "
                jiamihou = {
                    "十进制": j,
                    "十六进制": k,
                    "字母or字符": l
                }
                jiami_list.append(jiamihou)
    for n in jiami_list:
        print("转换后的十进制:" + n["十进制"] + "n" + "转换后的十六进制:" + n["十六进制"] + "n" + "字母or字符:" + n["字母or字符"] + "n")

def shijinzhi():
    shuju = input("请输入十进制数据:")
    j = ""
    k = ""
    l = ""
    if shuju == '':
        print("数据不能为空")
        return
    try:
        for a in range(0,len(shuju)):
            c = shuju.split(' ')[a]
            shijinzhi_list.append(c)
    except:
        pass
    for p in shijinzhi_list:
        for q in ASCII:
            if p == q[1]:
                jiami_list.clear()
                j += q[0] + " "
                k += q[2] + " "
                l += q[3] + " "
                jiamihou={
                    "二进制":j,
                    "十六进制":k,
                    "字母or字符":l
                }
                jiami_list.append(jiamihou)
    for n in jiami_list:
        print("转换后的二进制:" + n["二进制"] + "n" + "转换后的十进制:" + n["十六进制"] + "n" + "字母or字符:" + n["字母or字符"] + "n")

def shiliujinzhi():
    shuju = input("请输入十六进制数据:")
    j = ""
    k = ""
    l = ""
    if shuju == '':
        print("数据不能为空")
        return
    i=len(shuju)/2
    try:
        for a in range(0, int(i)):
            c = shuju.split(' ')[a]
            shiliujinzhi_list.append(c)
    except:
        pass
    for p in shiliujinzhi_list:
        for q in ASCII:
            if p == q[2]:
                jiami_list.clear()
                j += q[0] + " "
                k += q[1] + " "
                l += q[3] + " "
                jiamihou = {
                    "二进制": j,
                    "十进制": k,
                    "字母or字符": l
                }
                jiami_list.append(jiamihou)
    for n in jiami_list:
        print("转换后的二进制:" + n["二进制"] + "n" + "转换后的十进制:" + n["十进制"] + "n" + "转换后的字母or字符:" + n["字母or字符"] + "n")

def zifu_or_zimu():
    shuju = input("请输入字母/字符:")
    j = ""
    k = ""
    l = ""
    if shuju == '':
        print("数据不能为空")
        return
    for i in shuju:
        zimu_or_zifu_list.append(i)
    for t in zimu_or_zifu_list:
        for q in ASCII:
            if t[0] == q[3]:
                jiami_list.clear()
                j+=q[0]+" "
                k+=q[1]+" "
                l+=q[2]+" "
                jiamihou = {
                    "二进制": j,
                    "十进制": k,
                    "十六进制": l
                }
                jiami_list.append(jiamihou)
    for n in jiami_list:
        print("转换后的二进制:" + n["二进制"] + "n" + "转换后的十进制:" + n["十进制"] + "n" + "转换后的十六进制:" + n["十六进制"] + "n")

def kaishi():
    gongnegn()
    while 1:
        A=input("请选择:")
        if int(A) == 1:
            erjinzhi()
            erjinzhi_list.clear()
        elif int(A) == 2:
            shijinzhi()
            shijinzhi_list.clear()
        elif int(A) == 3:
            shiliujinzhi()
            shiliujinzhi_list.clear()
        elif int(A) == 4:
            zifu_or_zimu()
            zimu_or_zifu_list.clear()
        elif int(A) == 5:
            help()
        elif int(A) == 0:
            print('ASCII转换器已关闭nn')
            return

异或运算:

# This Python file uses the following encoding: utf-8

def gongneng():
    print("**********33[31mASCII转换器33[0m***********")
    print(" tt  1,xor运算t tt ")
    print(" tt  0,退出ttttt ")
    print("*******************************")

def help():
    print("*******************33[31mHelp33[0m**********************")
    print(" ttt   33[31m仅仅转换二进制值 33[0mttt")
    print(" ttt   33[31m两值中间空格隔开 33[0mttt")
    print(" ttt   33[31m两值len值必相等 33[0mttt")
    print(" ttt   33[31m 不对字母等计算 33[0mttt")
    print("*********************************************")


shuju_1_list=[]
shuju_2_list=[]
def xor():
    shuju_1=str(input("请输入要进行异或的第一段数据:"))
    shuju_2=str(input("请输入要进行异或的第二段数据:"))
    jieguo=""
    i=len(shuju_1)
    try:
        for a in range(0, int(i)):
            c = shuju_1.split(' ')[a]
            shuju_1_list.append(c)
    except:
        pass
    i=len(shuju_2)
    try:
        for a in range(0, int(i)):
            c = shuju_2.split(' ')[a]
            shuju_2_list.append(c)
    except:
        pass
    for a1,a2 in zip(shuju_1_list,shuju_2_list):
        c=""
        for b1,b2 in zip(a1,a2):
            m=int(b1)^int(b2)
            if m != "":
                c+=str(m)
        jieguo+=c+' '

    print("异或后的结果:"+jieguo)


def kaishi():
    gongneng()
    help()
    xor()
    print("结束")

kaishi()





往期精选



围观

PHP代码审计学习

丨更多

热文

浅谈应急响应

丨更多

·end·

—如果喜欢,快分享给你的朋友们吧—

我们一起愉快的玩耍吧



原文始发于微信公众号(Rot5pider安全团队):Crypto题型一解Flag详情

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年1月7日05:54:01
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Crypto题型一解Flag详情http://cn-sec.com/archives/1498559.html

发表评论

匿名网友 填写信息