欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 科技 > 能源 > [TPCTF 2025] crypto 复现两题

[TPCTF 2025] crypto 复现两题

2025/3/14 14:34:46 来源:https://blog.csdn.net/weixin_52640415/article/details/146243432  浏览:    关键词:[TPCTF 2025] crypto 复现两题

周末很忙。比赛都没怎么看。晚上把密码复现两个。

randomized random

这题在小鸡块博客里见过,稍有区别。

# FROM python:3
import random
with open("flag.txt","rb") as f:flag=f.read()
for i in range(2**64):print(random.getrandbits(32)+flag[random.getrandbits(32)%len(flag)])input()

这里每次取两个32位随机数,第1个加上flag[r%xx],所以在原来的随机算法的改一点点,这里用第1个随机数的高4位,第2个跳过。由于加法会有进位,所以不能直接用前25位,连进20位的概率就比较小可以忽略掉。恢复出随机数来作个差再排个序就OK了。不过交互次数比较多多多多。

def construct_a_row(RNG):row = []for _ in range(length//4):v = RNG.getrandbits(4)row += [int(i) for i in bin(v)[2:].zfill(4)]RNG.getrandbits(32)return row

nanonymous msg

这个题就连看都没看,以为没放附件。今天看着WP复现一下。

先是复制那个提示信息贴到Notepad+里,这里边有UTF-8的字符。显示为小方块。转16进制看

b'\xf3\xa0\x87\x96\xf3\xa0\x86\x96\xf3\xa0\x84\x9f

UTF-8转回字符看,都是0xe01xx的字符,可以查到变体选择符

# -*- coding: utf-8 -*-msg = open('msg.txt', encoding='utf-8').read()
#Variation Selector 变体选择符 https://www.utf8-chartable.de/unicode-utf8-table.pl?start=917760
a = [ord(i)-0xe0100+17 for i in msg[:91]] #异体字从e0100开始对应17

 结果显然不是flag,先统计一下各个字符出现的频率

b = [0]*len(a)
for i in a:for j in range(len(a)):if a[j]==i:b[j]+=1#[2, 1, 1, 2, 1, 1, 3, 6, 7, 3, 5, 15, 1, 6, 2, 15, 5, 3, 4, 2, 5, 6, 7, 15, 2, 1, 15, 3, 4, 7, 4, 4, 15, 5, 1, 7, 15, 5, 2, 3, 3, 15, 1, 6, 5, 5, 7, 4, 2, 15, 6, 5, 15, 6, 6, 4, 5, 7, 6, 15, 3, 5, 5, 15, 5, 6, 6, 1, 15, 1, 7, 5, 2, 6, 3, 15, 2, 5, 5, 15, 3, 6, 3, 3, 15, 1, 4, 3, 2, 4, 1]

TPCTF{}都能确定了T两次,其它只1次,还有236出现15次可以确定为下划线。

然后看T和P(后边发现加17不大对,需要减1,这里用减1后的比较)的ASCII码和密文。

0x54和0x50只差1位,而密文也只差1位,明文2进制的第5位对应密文的第2位。

'''ASCII    CIPHER-1
T 54 01010100   11100110
P 50 01010000   10100110   5:2 密文第2位对应明文第5位
'''

继续往下找,其中4位反转

'''
{ 7B 01111011   10111011
} 7D 01111101   11111010   6:717     5     6
C 43 01000011   00101111
F 46 01000110   01100111   7:4174    5  7  6
T 54 01010100   11100110
_ 5F 01011111   11101011   4:5 反转5174    5  74 6
T 54 01010100   11100110
C 43 01000011   00101111   3:005174   35  74 6
{ 7B 01111011   10111011
C 43 01000011   00101111   2:3305174   35 274 6
'''

这样找到6个对应关系,已知的密文第2,6位都是1,然后看剩余部分的密文。

'''
>>> [bin(i-1)[2:].zfill(8) for i in list(set(a[6:-1]))]
'01111111', '11111111', '00110010', '00110011', '10110100', '10110101', '10110110', '10110111', 
'00110111', '10111010', '00111010', '00111110', '00111111', '10111110', '01110110', '11101011', 
'01110010', '01110011', '11110110', '01110111', '01111010', '01111110', '11111100', '11111110']^           ^           ^           ^           ^           ^           ^           ^
'''

这里第2位都是1,应该对应的是明文最高位反转(ASCII码高位的0)

于是找到一个完整的对应关系:26305174   35027416 其中3,7位反转1->0

flag = []
for i in a:b = bin(i-1)[2:].zfill(8)c = int(''.join([b[int(_) for _ in '26305174']]),2)flag.append(c^0x88)bytes(flag)
#b'TPCTF{great_j0b_in5pire_by_gue55_the_flag_writeup_0f_r0uter_nii_fr0m_defc0n_ctf_2022_qual5}'

还有个第4题,在另外一个比赛里似乎见过,那个题也是0解,就是给些提示猜hash,看来没有猜出来。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词