• Crypto(5)2023xctf ezCrypto(待补)


    下载地址:

    https://adworld.xctf.org.cn/match/list?event_hash=a37c4ee0-1808-11ee-ab28-000c29bc20bf

    题目代码分析:

    1. #这两行导入了Python标准库中的 randomstring 模块,用于生成随机数和处理字符串
    2. import random
    3. import string
    4. characters = string.printable[:-6]
    5. #这一行创建了一个字符串 characters,其中包含了string.printable中的可打印字符,但去掉了后面6个不常用的控制字符。
    6. digits = string.digits
    7. #这一行创建了一个字符串 digits,其中包含了09的数字字符。
    8. ascii_letters = string.ascii_letters
    9. #这一行创建了一个字符串 ascii_letters,其中包含了英文字母的大小写。
    10. def Ran_str(seed : int, origin: str):
    11. #这一行定义了一个名为 Ran_str 的函数,它接受两个参数:seed 是一个整数种子,origin 是一个字符串。
    12. random.seed(seed)
    13. #这一行使用给定的种子初始化随机数生成器,以便生成可重现的随机序列。
    14. random_sequence = random.sample(origin, len(origin))
    15. #这一行使用给定的 origin 字符串中的字符,生成一个与原字符串长度相同的随机排列。
    16. return ''.join(random_sequence)
    17. #这一行将生成的随机排列字符列表连接成一个字符串,并将其返回。
    18. rseed = int(input())
    19. #这一行从用户输入中获取一个整数种子,该种子将用于生成随机字符串。
    20. assert rseed <= 1000 and rseed >= 0
    21. #这一行使用 assert 语句来确保输入的种子在01000之间,以确保种子的范围是合理的。
    22. map_string1 = Ran_str(rseed, characters)
    23. map_string2 = Ran_str(rseed * 2, characters)
    24. map_string3 = Ran_str(rseed * 3, characters)
    25. #这三行分别使用不同的种子值生成三个乱序字符串 map_string1、map_string2 和 map_string3,这些字符串将用于加密和解密。
    26. #接下来的代码是一系列自定义函数,用于加密字符串。以下是这些函数的解释:
    27. #这是一个辅助函数,接受一个字符串 flag 作为参数,返回字符串中从索引9到倒数第二个字符的部分。
    28. def util(flag):
    29. return flag[9: -1]
    30. #这是另一个辅助函数,接受一个字符串 map_string 和一个字符 c 作为参数,返回字符 c 在字符串 map_string 中的索引位置。
    31. def util1(map_string: str, c):
    32. return map_string.index(c)
    33. #这是一个函数,用于执行字符串的异或操作。它接受两个字符串 s 和 k 作为参数,然后将这两个字符串按字符进行异或操作,返回结果。
    34. def str_xor(s: str, k: str):
    35. return ''.join(chr((ord(a)) ^ (ord(b))) for a, b in zip(s, k))
    36. #这是一个名为 mess_sTr 的函数,接受两个参数:一个字符串 s 和一个整数 index。该函数执行了以下操作:
    37. def mess_sTr(s : str, index : int):
    38. map_str = Ran_str(index, ascii_letters + digits)#1.使用 index 作为种子生成了一个包含英文字母和数字的乱序字符串 map_str。
    39. new_str = str_xor(s, map_str[index])#2.对输入字符串 s 和 map_str 中的字符进行异或操作,生成新的字符串 new_str。
    40. if not characters.find(new_str) >= 0:
    41. new_str = "CrashOnYou??" + s
    42. #3.检查 new_str 是否包含在可打印字符集 characters 中,如果不包含,则将字符串改为 "CrashOnYou??" 加上原字符串 s。
    43. return new_str, util1(map_str, s)#4.返回新字符串 new_str 和字符在 map_str 中的索引。
    44. #这是名为 crypto_phase1 的函数,接受一个字符串 flag 作为参数,执行以下操作:
    45. def crypto_phase1(flag):
    46. flag_list1 = util(flag).split('_')#1.使用 util 函数将输入字符串 flag 拆分成一个列表 flag_list1,以下划线为分隔符。
    47. newlist1 = []
    48. newlist2 = []
    49. index = 1
    50. k = 0#2.初始化两个空列表 newlist1 和 newlist2,以及两个索引变量 index 和 k
    51. for i in flag_list1:#3.遍历 flag_list1 中的每个子字符串 i,并根据其长度的奇偶性进行不同的处理:
    52. if len(i) % 2 == 1:#如果长度为奇数,对子字符串的每个字符执行 mess_sTr 操作,并将结果连接到新字符串 i1 中。同时更新索引。
    53. i1 = ""
    54. for j in range(len(i)):
    55. p, index = mess_sTr(i[j], index)
    56. i1 += p
    57. p, index = mess_sTr(i[0], index)
    58. i1 += p
    59. i1 += str(k)
    60. k += 1
    61. newlist1.append(i1)
    62. else:#如果长度为偶数,将子字符串末尾添加上一个递增的数字,并将其加入到 newlist2 中。
    63. i += str(k)
    64. k += 1
    65. newlist2.append(i)
    66. return newlist1, newlist2#4.返回两个列表 newlist1 和 newlist2
    67. #这是名为 crypto_phase2 的函数,接受一个列表作为参数,执行以下操作:
    68. def crypto_phase2(list):
    69. newlist = []#1.初始化一个空列表 newlist。
    70. for i in list:#2.遍历输入列表中的每个字符串 i。
    71. str = ""
    72. for j in i:
    73. str += map_string1[util1(map_string3, j)]
    74. #3.遍历字符串 i 中的每个字符 j,并根据 map_string1 中字符在 map_string3 中的索引位置获取字符,然后将其连接到新字符串 str 中。
    75. newlist.append(str)#4.将新字符串 str 添加到 newlist 中。
    76. return newlist#返回包含加密结果的列表 newlist。
    77. #这是名为 crypto_phase3 的函数,接受一个列表作为参数,执行以下操作:
    78. def crypto_phase3(list):
    79. newlist = []#初始化一个空列表 newlist。
    80. for i in list:#遍历输入列表中的每个字符串 i。
    81. str = ""
    82. for j in i:
    83. str += map_string2[util1(map_string3, j)]
    84. #遍历字符串 i 中的每个字符 j,并根据 map_string2 中字符在 map_string3 中的索引位置获取字符,然后将其连接到新字符串 str 中。
    85. newlist.append(str)#将新字符串 str 添加到 newlist 中。
    86. return newlist#返回包含加密结果的列表 newlist。
    87. #这是名为 crypto_final 的函数,接受一个列表作为参数,执行以下操作:
    88. def crypto_final(list):
    89. str=""#初始化一个空字符串 str。
    90. for i in list[::-1]:#遍历输入列表中的每个字符串 i(以倒序方式遍历)。
    91. str += i#将每个字符串 i 连接到结果字符串 str 中。
    92. return str#返回最终的加密字符串。
    93. #这是一个条件语句,它检查是否在直接运行这个脚本时才执行以下的代码块。
    94. if __name__ == '__main__':
    95. format="sixstars{XXX}"
    96. flag="Nothing normal will contribute to a crash. So when you find nothing, you find A Crashhhhhhhh!!! "
    97. #这两行定义了两个字符串变量,format 和 flag。
    98. flaglist1, flaglist2 = crypto_phase1(flag)
    99. #这一行调用 crypto_phase1 函数,对输入的 flag 进行第一阶段加密,然后将结果分成两个列表:flaglist1 和 flaglist2
    100. cipher = crypto_final(crypto_phase3(crypto_phase2(flaglist1) + flaglist1) + crypto_phase2(crypto_phase3(flaglist2)))
    101. #这一行对 flaglist1 进行第二和第三阶段的加密,然后将结果拼接起来,最后通过 crypto_final 函数进行最终的加密,得到最终的加密字符串 cipher。
    102. print("map_string2: " + map_string2)
    103. print("cipher: " + cipher)
    104. #这两行分别打印了 map_string2 和加密后的字符串 cipher,以供查看结果。

    output:

    map_string2: \W93VnRHsA,x@DQ.Sj:_$E/%"+{1
    cipher: &I1}ty~A:bR>)Q/;6:*6`1;bum?8i[LL*t`1;bum?8i[LL?Ia`1;bum?8i[LL72;xl:mvHF"z4_/DD+c:mvHF"z4_/DDzbZ:mvHF"z4_/DDr}vS?

     解密代码:

    参考网站:*CTF 2023 Writeup - 星盟安全团队 (xmcve.com)

    1. import random
    2. import string
    3. rseed = 0
    4. characters = string.printable[:-6]
    5. for rseed in range(0, 1001):
    6. random.seed(rseed)
    7. random_sequence = random.sample(characters, len(characters))
    8. map_string1 = ''.join(random_sequence)
    9. random.seed(rseed * 2)
    10. random_sequence = random.sample(characters, len(characters))
    11. map_string2 = ''.join(random_sequence)
    12. if map_string2[:10] == '8K#Ttr@&5=':
    13. print('rseed =', rseed)
    14. break
    15. random.seed(rseed * 3)
    16. random_sequence = random.sample(characters, len(characters))
    17. map_string3 = ''.join(random_sequence)
    18. def re_xor(c, a, index: int):
    19. return chr(((ord(a) + index) ^ ord(c)) - index)
    20. cipher = "edT0O3/LZALI]~S=}NP=7zY"
    21. for i in range(0, len(cipher), 2):
    22. hou = cipher[:-i]
    23. hou = ''.join([map_string3[map_string1.index(h)] for h in hou])
    24. hou = ''.join([map_string3[map_string2.index(h)] for h in hou])
    25. if hou and hou[-1] in string.digits:
    26. qian = cipher[-i:]
    27. qian = ''.join([map_string3[map_string2.index(q)] for q in qian])
    28. qian1 = qian[:len(qian)//2]
    29. qian2 = ''.join([map_string3[map_string1.index(q)] for q in qian[len(qian)//2:]])
    30. if qian1 == qian2:
    31. qian = qian1
    32. print(hou)
    33. print(qian)
    34. qian11 = qian[:(len(qian)-2)//2]
    35. qian22 = qian[-(len(qian) - 2) // 2-1:-1]
    36. print(qian11)
    37. print(qian22)
    38. for c in characters:
    39. index = 2
    40. qian_ = ''
    41. qian_ += c
    42. try:
    43. for x in qian11:
    44. qian_ += re_xor(x, qian_[-1], index)
    45. if all([y in string.ascii_letters+string.digits for y in qian_]):
    46. print(qian_+'3')
    47. except:
    48. continue
    49. for c in characters:
    50. index = 1
    51. qian_ = ''
    52. qian_ += c
    53. try:
    54. for x in qian22:
    55. qian_ += re_xor(x, qian_[-1], index)
    56. if all([y in string.ascii_letters+string.digits for y in qian_]):
    57. print(qian_+'0')
    58. except:
    59. continue
    60. print()
    61. # cR7PtO5 ln4 s0m32 F1nD1
    62. # ~F3&)0
    63. # F4n3TrY0
    64. # sixstars{TrY_F1nD_s0m3_F4n_ln_cR7PtO}

  • 相关阅读:
    工业物联网网关解决方案openwrt二次开发无线路由WiFi模块选型
    详解JAVA远程debug
    将SpringBOOT项目 打成 war 包 并 部署到 Tomcat
    ubuntu20.04安装MySQL8、MySQL服务管理、mysql8卸载
    基于Freertos的工训机器人
    苹果cms大橙子vfed 5.0去授权完美破解主题模板
    移动端单位自适应的两种方式
    C语言笔记22 •结构体•
    Charles抓取浏览器https包
    电脑正常开机后几分钟就黑屏一直循环怎么办?
  • 原文地址:https://blog.csdn.net/m0_66039322/article/details/133949862