UNCTF2022 WP
Reverse
坐大牢。就出了签到题。剩余的等复现罢。
whereisyourkey
签到题。
1 | v5 = [118,103,112,107,99,109,104,110,99,105] |
ezzzzre
ExeinfoPE打开,发现UPX壳,直接-d没毛病。
IDA打开发现加密算法,输入8位Str加密后与"HELLOCTF"
一一比对。
1 | a = "HELLOCTF" |
套上UNCTF{}后提交。
Crypto
md5-1 & md5-2
md5查询网站:https://www.cmd5.com
需要注意的是md5-2多加了一段异或:
1 | for i in range(0,len(md5_)): |
反向解出即可:
1 | with open("C:\\User\\dell\\Desktop\\md5-2\\md5-2\\out.txt") as f: |
dddd
附件如下:
1 | 110/01/0101/0/1101/0000100/0100/11110/111/110010/0/1111/10000/111/110010/1000/110/111/0/110010/00/00000/101/111/1/0000010 |
一眼摩斯码。以1为-、0为.尝试,未果。遂以1为.、0为-,解码得UNCTF{Y4S_TH1S_JUST_M0RSE}
。
caesar
附件如下:
1 | 我把表换成了base64的表 |
已知flag前5位为UNCTF
,对照base64表得位移为19。
破解程序如下(偷懒了,不想写判断条件就把表复制了一份):
1 | base64_list = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', |
ezRSA
附件如下:
1 | import libnum |
直接开根。代码如下:
1 | import gmpy2 |
Single Table
附件如下:
1 | ABCDEFGHIKLMNOPQRSTUVWXYZ |
1 | key="PLAY" |
移位丁真,鉴定为Playfair。规律如下:
- 选取一串英文字母,除去重复出现的字母,将剩下的字母逐个逐个加入 5 × 5 的矩阵内,剩下的空间由未加入的英文字母依 a-z 的顺序加入。注意,将 q 去除,或将 i 和 j 视作同一字。
- 将要加密的明文分成两个一组。若组内的字母相同,将 X(或 Q)加到该组的第一个字母后,重新分组。若剩下一个字,也加入 X 。
- 在每组中,找出两个字母在矩阵中的地方。
- 若两个字母不同行也不同列,在矩阵中找出另外两个字母(第一个字母对应行优先),使这四个字母成为一个长方形的四个角。
- 若两个字母同行,取这两个字母右方的字母(若字母在最右方则取最左方的字母)。
- 若两个字母同列,取这两个字母下方的字母(若字母在最下方则取最上方的字母)。
易得flag为UNCTF{GODY_OUK_NOWP_LAYFAIR}
Multi Table
附件如下:
1 | from string import ascii_uppercase |
大致过程如下:
- 取大写字母列表用
shuffle()
洗牌后作为base_table,之后循环移位存入table。所以table里有26张打乱的字母表。(维吉尼亚密码的特征) - 随机取4个key,值为[0,25]。之后将key作为读table的一个下标,也就是key决定读table的第几张表。
- 逐位取flag,取其在base_table里的位置后映射到table[key%4]。
所以我们可以利用flag已知的前五位UNCTF
判断4位key,最后一位作为校验。
破解程序如下:
1 | from string import ascii_uppercase |
babyRSA
附件如下:
1 | from Crypto.Util.number import * |
eazy_RSA
附件如下:
1 | from Crypto.Util.number import * |
ezxor
附件如下:
1 | from key import m,flag |
多次一密。把flag作为密钥与明文进行异或加密。具体解题思路可参考这篇文章。
这里说一下大致解题思路。因为c1=m1^key
c2=m2^key
,所以c1^c2=m1^key^m2^key=m1^m2
。又因为小写字母^32(空格的ASCII码)=大写字母
大写字母^32=小写字母
,我们可以把其中一段密文与其他密文两两异或(等价于明文两两异或)后计算字母的个数,如果该位置字母出现概率很高的话,基本可以确定该位置的明文是个空格。之后根据key=c1^m1
求密钥即可。
破解程序如下:
1 | k = [...] # 此处省略数据 |
可以看到部分位置的字符还是很明显的,但是有一些位置还是很迷惑(比如那个~)
我们可以通过猜测这些位置的字符来构造密钥,之后与密文异或后对得出的明文进行语义分析即可。
Flag为UNCTF{Y0u_are_very_Clever!!!}
Today_is_Thursday_V_me_50
附件如下:
1 | import random |
这个TOPIC真让人迷惑啊。看一眼题目条件还有V我50没用,索性就是这个。
除去这个之外就是普通的字符串异或。itertools.permutations(list,num)
是在list中取遍大小为num的排列的意思。
破解程序如下:
1 | import random |
谨防新型网络诈骗(bushi
Fermat
附件如下:
1 | from Crypto.Util.number import * |
费马小定理的应用。准确来说是Pollard’s p-1算法:
这里的B其实就是上面代码中的gift变量。
破解程序如下:
1 | import math |
分解n后常规做法。
写在最后
某密码的脚本小子。
这次一定把剩下做过的题目复现一下,大牢不能白坐了。