编码

摩斯编码

摩斯编码(Morse Code)是一种早期的电报通信方式,通过短音(点)和长音(划)来表示字母和数字。它可以用来将字母、数字甚至标点符号编码成一系列的点和划。

摩斯编码的基本规则:

  • (.)表示短音,(-)表示长音。

  • 字母之间用空格隔开,单词之间用更长的空格隔开。

    摩斯密码表
字符 电码符号 字符 电码符号 字符 电码符号 字符 电码符号
A .━ B ━ ... C ━ .━ . D ━ ..
E F ..━ . G ━ ━ . H ....
I .. J .━ ━ ━ K ━ .━ L .━ ..
M ━ ━ N ━ . O ━ ━ ━ P .━ ━ .
Q ━ ━ .━ R .━ . S ... T
U ..━ V ...━ W .━ ━ X ━ ..━
Y ━ .━ ━ Z ━ ━ ..
0 ━ ━ ━ ━ ━ 1 .━ ━ ━ ━ 2 ..━ ━ ━ 3 ...━ ━
4 ....━ 5 ..... 6 ━ .... 7 ━ ━ ...
8 ━ ━ ━ .. 9 ━ ━ ━ ━ .
. .━ .━ .━ : ━ ━ ━ ... , ━ ━ ..━ ━ ; ━ .━ .━ .
? ..━ ━ .. = ━ ...━ .━ ━ ━ ━ . / ━ ..━ .
! ━ .━ .━ ━ ━ ....━ _ ..━ ━ .━ .━ ..━ .
( ━ .━ ━ . ) ━ .━ ━ .━ $ ...━ ..━ & . ...
@ .━ ━ .━ .

示例:

1
2
3
4
密文
--. . -. ... .... .. -. .. -- .--. .- -.-. - .-.. .- ..- -. -.-. ....
明文
GenshinImpactLaunch

BUU-信息化时代的步伐

也许中国可以早早进入信息化时代,但是被清政府拒绝了。附件中是数十年后一位伟人说的话的密文。请翻译出明文(答案为一串中文!) 注意:得到的 flag 请包上 flag{} 提交

附件内容606046152623600817831216121621196386

根据提示”答案为一串中文“,猜测为中文电码解密

电报码在线翻译,得到计算机要从娃娃抓起

flag{计算机要从娃娃抓起}

PS:中文和数字电码的对应关系——标准电码本(修订本)

中文电码表采用四位阿拉伯数字表示一个中文字符(汉字、字母和符号),从0001到9999顺序排列。汉字先按部首,后按笔画排列;字母和符号放到电码表的最后。发送中文电报时,先按照中文电码本将中文翻译为数字串,再以摩尔斯电码发送这组数字串。收报方先将电码翻译为数字串,再转译为中文即完成。

BUU-[AFCTF2018]Morse

-..../.----/-..../-..../-..../...--/--.../....-/-..../-..../--.../-.../...--/.----/--.../...--/..---/--.../--.../....-/...../..-./--.../...--/...--/-----/...../..-./...--/...--/...--/....-/...--/...../--.../----./--.../-..

很明显这是用/分割的摩斯密码,使用在线摩斯电码转换得到61666374667B317327745F73305F333435797D

提交后发现flag不正确,数字里边含有”D“,”F“,”B“等字母,尝试用cyber chef汉化版16进制转字符得到afctf{1s't_s0_345y}

UUencode

UUencode(Unix-to-Unix Encode)是一种古老的编码方法,最早在 Unix 系统中用于将二进制数据转换为 ASCII 字符串格式,以便通过电子邮件等文本传输协议发送。UUencode 通过将二进制数据编码为可打印的 ASCII 字符串,使得原本不支持二进制传输的系统可以通过文本的方式传递这些数据。

主要特征总结:

  1. beginend 标签:开头有 begin 行,结尾有 end 行。
  2. 文件权限和文件名:开头行包含文件权限(如 644)和文件名(如 example.txt)。
  3. 编码字符:编码后的数据使用可打印的 ASCII 字符(范围大致在 ASCII 32 到 95 之间),每行大约 45 个字符。
  4. 长度说明:每一行的第一个字符表示这一行包含的原始数据字节数,最多可以是 45 个字节(即,M)。每行的第一字符(通常是 M)表示该行的字节长度,如果数据不足则补齐。

BUU-UUencode

89FQA9WMD<V1A<V1S83DY.#<W3$Q,2TM]

使用在线UUencode编解码解码后得到flag{dsdasdsa99877LLLKK}

古典密码

移位密码

简单移位

栅栏密码

云影密码

曲路密码

替代密码

单表替代密码

凯撒密码

凯撒(Caesar)密码是公元前一世纪在高卢战争时被使用的,它是将英文字母向前移动k位

示例:

1
2
3
明文	flag{genshin impact launch!}
当k=3时
密文 iodj{jhqvklq lpsdfw odxqfk!}
Rot5、13

Rot是凯撒密码的特殊情况,即步长(k的值)是固定的。常见的步长为5、13、18、47。

变异凯撒
1
2
加密密文:afZ_r9VYfScOeO_UL^RWUc
格式:flag{}

根据ASCII表,其对应的十进制编码为97 102 90 95 114 57 86 89 102 83 99 79 101 79 95 85 76 94 82 87 85 99

flag{}对应的十进制编码为102 108 97 103 123 125

afZ_分别+5、+6、+7、+8可以得到flag

于是,将密文的ASCII十进制值依照上方规律依次递增即可得到flag。

1
2
3
4
5
6
k = 5
str = 'afZ_r9VYfScOeO_UL^RWUc'
for i in str:
print(chr(ord(i)+k),end="")
k += 1
#flag{Caesar_variation}

PS:

ord()函数返回字符 i 的 ASCII 或 Unicode 码(整数值)。例如,ord('a') 会返回 97,ord('Z') 会返回 90。

chr()函数是用来将整数转换回对应的字符。例如,chr(102) 返回 'f'。因此,这一步的操作是将修改后的 ASCII 码转换回字符。

print() 函数通常会在输出的末尾添加一个换行符 (\n),end="" 参数则让每次输出都不换行,从而所有字符会被输出在同一行。

多表替代密码

维吉尼亚密码

维吉尼亚密码(Vigenère Cipher)

凯撒密码是单表替代密码,其只使用了一个 替代表,维吉尼亚密码则是标准的多表替代密 码。 首先,多表替代密码的密钥不再是固定不变 的,而是随着位置发生改变的。在维吉利亚密码中,根据密钥的字母来选择。比如密钥是LOVE, 那么明文会每四个一组进行循环,使用的密钥如下表所示

key 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
L - L M N O P Q R S T U V W X Y Z A B C D E F G H I J K
O - O P Q R S T U V W X Y Z A B C D E F G H I J K L M N
V - V W X Y Z A B C D E F G H I J K L M N O P Q R S T U
E - E F G H I J K L M N O P Q R S T U V W X Y Z A B C D

明文从第一个字符开始按”L“行进行加密,第二个字符按”O“行进行加密,……,接着第五个字符回到”L“行进行加密,依此循环直至加密完成。

一般情况下,维吉尼亚密码的破解必须依赖爆破+词频统计的方法来进行,可以使用quipquip在线破解

BUU-凯撒?替换?呵呵!

MTHJ{CUBCGXGUGXWREXIPOYAOEYFIGXWRXCHTKHFCOHCFDUCGTXZOHIXOEOWMEHZO} 注意:得到的 flag 请包上 flag{} 提交, flag{小写字母}

使用quipquip分析后得到最可能包含flag的 flag substitution ricked her dyction is always easy must live aciere of rave

即,flag{substitutionrickedherdyctionisalwayseasymustliveaciereofrave}

BUU-old-fashion

Os drnuzearyuwn,y jtkjzoztzoes douwlr oj y ilzwex eq lsdexosa kn pwodw tsozj eq ufyoszlbz yrl rlufydlx pozw douwlrzlbz,ydderxosa ze y rlatfyr jnjzli;mjy gfbmw vla xy wbfnsy symmyew(mjy vrwm qrvvrf),hlbew rd symmyew,mebhsymw rd symmyew,vbomgeyw rd mjy lxrzy,lfk wr dremj.Mjy eyqybzye kyqbhjyew mjy myom xa hyedrevbfn lf bfzyewy wgxwmbmgmbrf.Wr mjy dsln bw f1_2jyf-k3_jg1-vb-vl_l

使用quipquip分析后得到最可能的一条为

Xl fogkvryoeksg,e hjdhvxvjvxrl fxksao xh e zavsrb rc alfrbxly dg wsxfs jlxvh rc knexlvaiv eoa oaknefab wxvs fxksaovaiv,effrobxly vr e oayjneo hghvaz;the units may be single letters(the most common),pairs of letters,triplets of letters,mixtures of the above,and so forth.The receiver deciphers the text by performing an inverse substitution.So the flag is n1_2hen-d3_hu1-mi-ma_a

即,flag{n1_2hen-d3_hu1-mi-ma_a}

现代密码

非对称加密算法

RSA算法

RSA是一种广泛使用的非对称加密算法,基于数论中的大素数分解问题。它由Ron Rivest、Adi Shamir和Leonard Adleman在1977年发明,因此得名RSA。RSA算法的安全性依赖于分解一个大数为两个素数乘积的难度。

算法原理

RSA使用一对密钥:公钥私钥。其中,公钥(n,e)用于加密,私钥(n,d)用于解密。

1、密钥生成

  • 选择两个大素数p和q,计算它们的乘积n=p×q。这个 n 是密钥长度的一部分,称为模数

  • 计算欧拉函数 φ(n)=(p−1)×(q−1),表示 n 内与 n 互质的整数个数。

    • 选择公钥指数e,使得1<e<φ(n)e与φ(n)互质。e通常选为 65537,因为它是一个常用的加密指数。
  • 确定私钥指数d,使得d×e≡1 (mod φ(n)),即 d 是 e 在 φ(n) 模下的乘法逆元。

​ 生成的公钥为 (n,e),私钥为 (n,d)。其中,公钥可以公开,私钥必须保密。

2、加密过程

(1)将明文转换为数字

假设要加密的明文为数字形式 M,且 M<n。

(2)加密

使用公钥 (n,e) 对消息 M 进行加密:
$$
C=M^e,(mod;n)
$$
其中,C为密文,M为明文。

3、解密过程

收到密文 C 后,使用私钥 (n,d)解密:
$$
M=C^d,(mod;n)
$$
通过这个过程可以恢复原始的明文 M。

BUU-RSA

题目:在一次RSA密钥对生成中,假设p=473398607161,q=4511491,e=17,求解出d作为flag提交。

模数n=p×q=473398607161×4511491

欧拉函数φ(n)=(p−1)×(q−1)=473398607160×4511490

d×e≡1 (mod φ(n))得私钥指数d

Python计算如下:

1
2
3
4
5
6
7
8
9
from gmpy2 import invert
p=473398607161
q=4511491
e=17
phi=(p-1)*(q-1)
d=invert(e,phi)
print(d)
#125631357777427553
#flag{125631357777427553}

PS:

  • phi: 它是计算 RSA 私钥的关键参数,定义为 (p-1)*(q-1)。这是与模数 n = p \times q 相关的欧拉函数值
  • invert: invert(e, phi) 通过欧几里得算法快速找到模逆,计算 RSA 中的私钥 d,使得 e * d ≡ 1 (mod phi)

BUU-rsarsa

1
2
3
4
5
6
7
8
Math is cool! Use the RSA algorithm to decode the secret message, c, p, q, and e are parameters for the RSA algorithm.

p = 9648423029010515676590551740010426534945737639235739800643989352039852507298491399561035009163427050370107570733633350911691280297777160200625281665378483
q = 11874843837980297032092405848653656852760910154543380907650040190704283358909208578251063047732443992230647903887510065547947313543299303261986053486569407
e = 65537
c = 83208298995174604174773590298203639360540024871256126892889661345742403314929861939100492666605647316646576486526217457006376842280869728581726746401583705899941768214138742259689334840735633553053887641847651173776251820293087212885670180367406807406765923638973161375817392737747832762751690104423869019034

Use RSA to find the secret message

解题代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from gmpy2 import invert
p=9648423029010515676590551740010426534945737639235739800643989352039852507298491399561035009163427050370107570733633350911691280297777160200625281665378483
q=11874843837980297032092405848653656852760910154543380907650040190704283358909208578251063047732443992230647903887510065547947313543299303261986053486569407
e=65537
n=p*q
phi=(p-1)*(q-1)
d=invert(e,phi)
print(d)
#私钥d=56632047571190660567520341028861194862411428416862507034762587229995138605649836960220619903456392752115943299335385163216233744624623848874235303309636393446736347238627793022725260986466957974753004129210680401432377444984195145009801967391196615524488853620232925992387563270746297909112117451398527453977
c=83208298995174604174773590298203639360540024871256126892889661345742403314929861939100492666605647316646576486526217457006376842280869728581726746401583705899941768214138742259689334840735633553053887641847651173776251820293087212885670180367406807406765923638973161375817392737747832762751690104423869019034
m=pow(c,d,n)
print(m)
#明文m=5577446633554466577768879988
#flag{5577446633554466577768879988}

PS:

pow(x,y,z)
  • x——底数
  • y——指数
  • z——取余数字,可省略的参数。当z存在时,函数返回值等于 pow(x, y)%z

BUU-RSA1

p = 8637633767257008567099653486541091171320491509433615447539162437911244175885667806398411790524083553445158113502227745206205327690939504032994699902053229 q = 12640674973996472769176047937170883420927050821480010581593137135372473880595613737337630629752577346147039284030082593490776630572584959954205336880228469 dp = 6500795702216834621109042351193261530650043841056252930930949663358625016881832840728066026150264693076109354874099841380454881716097778307268116910582929 dq = 783472263673553449019532580386470672380574033551303889137911760438881683674556098098256795673512201963002175438762767516968043599582527539160811120550041 c = 24722305403887382073567316467649080662631552905960229399079107995602154418176056335800638887527614164073530437657085079676157350205351945222989351316076486573599576041978339872265925062764318536089007310270278526159678937431903862892400747915525118983959970607934142974736675784325993445942031372107342103852

已知两个大素数p,q,以及dp,dq,还有密文c,未知公钥指数e和私钥指数d,应当使用中国剩余定理来计算出明文m,计算出明文m后,发现不符合flag要求,于是将明文转换为字符,得到flag。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import gmpy2

# 给定的RSA参数
p = 8637633767257008567099653486541091171320491509433615447539162437911244175885667806398411790524083553445158113502227745206205327690939504032994699902053229
q = 12640674973996472769176047937170883420927050821480010581593137135372473880595613737337630629752577346147039284030082593490776630572584959954205336880228469
dp = 6500795702216834621109042351193261530650043841056252930930949663358625016881832840728066026150264693076109354874099841380454881716097778307268116910582929
dq = 783472263673553449019532580386470672380574033551303889137911760438881683674556098098256795673512201963002175438762767516968043599582527539160811120550041
c = 24722305403887382073567316467649080662631552905960229399079107995602154418176056335800638887527614164073530437657085079676157350205351945222989351316076486573599576041978339872265925062764318536089007310270278526159678937431903862892400747915525118983959970607934142974736675784325993445942031372107342103852

# 使用中国剩余定理 (CRT) 来计算m
# m1 = c^dp % p
# m2 = c^dq % q
# 使用 CRT: m = (m1*q*inv_q + m2*p*inv_p) % (p*q)

# 计算m1和m2
m1 = pow(c, dp, p)
m2 = pow(c, dq, q)

# 计算q mod p 的逆元
inv_q = gmpy2.invert(q, p)

# 使用中国剩余定理 (CRT) 组合m1和m2
h = (m1 - m2) * inv_q % p
m = m2 + h * q

# 将明文m转换为字符
# hex(m)[2:]先将大整数转换成16进制,然后bytes.fromhex(...)将16进制字符串转换为字节序列,.decode('utf-8')将字节序列解码为UTF-8字符
plaintext = bytes.fromhex(hex(m)[2:]).decode('utf-8')

# 输出明文
print(plaintext)
#noxCTF{W31c0m3_70_Ch1n470wn}

最后明文转换的步骤:

  1. 十六进制字符串的值:'0x6e6f784354467b57333163306d335f37305f4368316e343730776e7d'
  2. 去掉前缀后的值:'6e6f784354467b57333163306d335f37305f4368316e343730776e7d'
  3. 转换后的字节序列值:b'noxCTF{W31c0m3_70_Ch1n470wn}'
  4. 最终解码的字符串值:'noxCTF{W31c0m3_70_Ch1n470wn}'

中国剩余定理

China Remainder Theorem,CRT

BUU-RSA2

e = 65537 n = 248254007851526241177721526698901802985832766176221609612258877371620580060433101538328030305219918697643619814200930679612109885533801335348445023751670478437073055544724280684733298051599167660303645183146161497485358633681492129668802402065797789905550489547645118787266601929429724133167768465309665906113 dp = 905074498052346904643025132879518330691925174573054004621877253318682675055421970943552016695528560364834446303196939207056642927148093290374440210503657 c = 140423670976252696807533673586209400575664282100684119784203527124521188996403826597436883766041879067494280957410201958935737360380801845453829293997433414188838725751796261702622028587211560353362847191060306578510511380965162133472698713063592621028959167072781482562673683090590521214218071160287665180751

1

BUU-RSA3

c1 = 22322035275663237041646893770451933509324701913484303338076210603542612758956262869640822486470121149424485571361007421293675516338822195280313794991136048140918842471219840263536338886250492682739436410013436651161720725855484866690084788721349555662019879081501113222996123305533009325964377798892703161521852805956811219563883312896330156298621674684353919547558127920925706842808914762199011054955816534977675267395009575347820387073483928425066536361482774892370969520740304287456555508933372782327506569010772537497541764311429052216291198932092617792645253901478910801592878203564861118912045464959832566051361 n = 22708078815885011462462049064339185898712439277226831073457888403129378547350292420267016551819052430779004755846649044001024141485283286483130702616057274698473611149508798869706347501931583117632710700787228016480127677393649929530416598686027354216422565934459015161927613607902831542857977859612596282353679327773303727004407262197231586324599181983572622404590354084541788062262164510140605868122410388090174420147752408554129789760902300898046273909007852818474030770699647647363015102118956737673941354217692696044969695308506436573142565573487583507037356944848039864382339216266670673567488871508925311154801 e1 = 11187289 c2 = 18702010045187015556548691642394982835669262147230212731309938675226458555210425972429418449273410535387985931036711854265623905066805665751803269106880746769003478900791099590239513925449748814075904017471585572848473556490565450062664706449128415834787961947266259789785962922238701134079720414228414066193071495304612341052987455615930023536823801499269773357186087452747500840640419365011554421183037505653461286732740983702740822671148045619497667184586123657285604061875653909567822328914065337797733444640351518775487649819978262363617265797982843179630888729407238496650987720428708217115257989007867331698397 e2 = 9647291

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import gmpy2
c1=22322035275663237041646893770451933509324701913484303338076210603542612758956262869640822486470121149424485571361007421293675516338822195280313794991136048140918842471219840263536338886250492682739436410013436651161720725855484866690084788721349555662019879081501113222996123305533009325964377798892703161521852805956811219563883312896330156298621674684353919547558127920925706842808914762199011054955816534977675267395009575347820387073483928425066536361482774892370969520740304287456555508933372782327506569010772537497541764311429052216291198932092617792645253901478910801592878203564861118912045464959832566051361
n=22708078815885011462462049064339185898712439277226831073457888403129378547350292420267016551819052430779004755846649044001024141485283286483130702616057274698473611149508798869706347501931583117632710700787228016480127677393649929530416598686027354216422565934459015161927613607902831542857977859612596282353679327773303727004407262197231586324599181983572622404590354084541788062262164510140605868122410388090174420147752408554129789760902300898046273909007852818474030770699647647363015102118956737673941354217692696044969695308506436573142565573487583507037356944848039864382339216266670673567488871508925311154801
e1=11187289
c2=18702010045187015556548691642394982835669262147230212731309938675226458555210425972429418449273410535387985931036711854265623905066805665751803269106880746769003478900791099590239513925449748814075904017471585572848473556490565450062664706449128415834787961947266259789785962922238701134079720414228414066193071495304612341052987455615930023536823801499269773357186087452747500840640419365011554421183037505653461286732740983702740822671148045619497667184586123657285604061875653909567822328914065337797733444640351518775487649819978262363617265797982843179630888729407238496650987720428708217115257989007867331698397
e2=9647291

# 扩展欧几里得算法求解 x 和 y
g, x, y = gmpy2.gcdext(e1, e2)

# 检查 e1 和 e2 是否互质
if g != 1:
raise ValueError("e1 and e2 are not coprime, cannot apply common modulus attack")

# 如果 x 是负数,计算 c1 的模逆
if x < 0:
c1 = gmpy2.invert(c1, n)
x = -x

# 如果 y 是负数,计算 c2 的模逆
if y < 0:
c2 = gmpy2.invert(c2, n)
y = -y

# 计算 m
m = (pow(c1, x, n) * pow(c2, y, n)) % n

print(m)
#13040004482819947212936436796507286940525898188874967465457845309271472287032383337801279101

10进制到16进制在线转换工具将m转为16进制得到,666c61677b34396439313037376131616263623134663161396435343663383062653965667d
再用16进制到ASCII字符串在线转换工具得到 flag{49d91077a1abcb14f1a9d546c80be9ef}

PS:

扩展欧几里得算法

对称加密算法

Rabbit算法

Rabbit算法是一个高效的对称流密码,生成一系列伪随机比特流,明文和这些比特流按位执行异或(XOR)操作,完成加密过程。Rabbit的设计理念是通过复杂的非线性反馈机制生成伪随机数流(称为密钥流),这些密钥流与明文进行XOR来实现加密。

Rabbit在线加解密

示例:BUU-Rabbit

密文

U2FsdGVkX1/+ydnDPowGbjjJXhZxm2MP2AgI
根据Rabbit在线网站解密得到明文

Cute_Rabbit

编码与序列化

Quoted-printable编码

Quoted-Printable 是一种编码方法,常用于电子邮件传输中,将二进制数据或非ASCII字符编码成纯ASCII格式。这种编码方式保证数据在传输时不会因为不同平台或传输协议的差异而出现问题,尤其是在电子邮件中处理非ASCII字符时特别有用。

Quoted-Printable 编码规则:

  1. ASCII可打印字符(值在33到126之间,除去=号)的字节保持原样。
  2. 特殊字符(例如ASCII控制字符,值小于33,或非ASCII字符,值大于126)会被编码成=后跟随字符的十六进制表示(大写)。
    • 例如,空格的ASCII码是32,用Quoted-Printable编码表示为 =20
    • 等号 = 本身在Quoted-Printable编码中用 =3D 表示。
  3. 换行符:行末的换行符被编码为 CRLF (即回车+换行,\r\n),不会被编码成Quoted-Printable格式。
  4. 行长度限制:编码后的每一行最多不超过76个字符。如果一行超出了76个字符,使用 = 作为软换行符,将长行分成多行。

示例:BUU-Quoted-printable

密文

=E9=82=A3=E4=BD=A0=E4=B9=9F=E5=BE=88=E6=A3=92=E5=93=A6

根据在线Quoted-printable编解码网站,解码后得到明文

那你也很棒哦

Base编码

base64 特征符号 + / =

哈希算法

在 CTF 中,常见的哈希算法有 MD5SHA 系列(SHA-1、SHA-256、SHA-512)bcryptPBKDF2 等,

MD5算法

BUU-MD5

密文e00cf25ad42683b3df678c61f42c6bda

经过MD5在线加解密查询后得到明文admin1,即flag{admin1}

BUU-Alice与Bob

1
2
密码学历史中,有两位知名的杰出人物,Alice和Bob。他们的爱情经过置换和轮加密也难以混淆,即使是没有身份认证也可以知根知底。就像在数学王国中的素数一样,孤傲又热情。下面是一个大整数:98554799767,请分解为两个素数,分解后,小的放前面,大的放后面,合成一个新的数字,进行md5的32位小写哈希,提交答案。 
注意:得到的 flag 请包上 flag{} 提交

首先利用在线RSA大素数分解将大整数分解为两个素数101999·966233,合成新的数字101999966233,然后利用在线MD5加解密加密后得到32位小写哈希d450209323a847c8d01c6be47c81811a,即flag{d450209323a847c8d01c6be47c81811a}

BUU-丢失的MD5

题目给出md5.py文件如下

1
2
3
4
5
6
7
8
9
import hashlib   
for i in range(32,127):
for j in range(32,127):
for k in range(32,127):
m=hashlib.md5()
m.update('TASC'+chr(i)+'O3RJMV'+chr(j)+'WDJKX'+chr(k)+'ZM')
des=m.hexdigest()
if 'e9032' in des and 'da' in des and '911513' in des:
print des

运行时发现报错

File "<stdin>", line 8 print des ^^^^^^^^^ SyntaxError: Missing parentheses in call to 'print'. Did you mean print(...)?

发现print写法缺括号,补充为print(des)

修改后运行时仍然出错

Traceback (most recent call last): File "<stdin>", line 5, in <module> TypeError: Strings must be encoded before hashing

即 在进行哈希运算前必须对字符串进行编码,编码后代码如下

1
2
3
4
5
6
7
8
9
import hashlib   
for i in range(32,127):
for j in range(32,127):
for k in range(32,127):
m=hashlib.md5()
m.update('TASC'+chr(i)+'O3RJMV'+chr(j)+'WDJKX'+chr(k)+'ZM').encode())
des=m.hexdigest()
if 'e9032' in des and 'da' in des and '911513' in des:
print (des)

运行上述代码后得到e9032994dabac08080091151380478a2,即flag{e9032994dabac08080091151380478a2}

BUU-Windows系统密码

pass.hash文件

1
2
3
4
Administrator:500:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
ctf:1002:06af9108f2e1fecf144e2e8adef09efd:a7fcb22a88038f35a8f39d503e7f0062:::
Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
SUPPORT_388945a0:1001:aad3b435b51404eeaad3b435b51404ee:bef14eee40dffbc345eeb3f58e290d56:::

根据提示,CTF用户的密码应该就是flag。

利用MD5在线加解密查询解密 MD5、 SHA1、MySQL、NTLM、SHA256、SHA512将CTF用户的密码解密得到

06af9108f2e1fecf144e2e8adef09efd:good-luck
a7fcb22a88038f35a8f39d503e7f0062:good-luck

所以flag{good-luck}

BUU-权限获得第一步

你猜这是什么东西,记得破解后把其中的密码给我。答案为非常规形式。 注意:得到的 flag 请包上 flag{} 提交

Administrator:500:806EDC27AA52E314AAD3B435B51404EE:F4AD50F57683D4260DFD48AA351A17A8:::

使用

解密 MD5、 SHA1、MySQL、NTLM、SHA256、SHA512将Administrator的密码解密得到

806edc27aa52e314aad3b435b51404ee:3617656 f4ad50f57683d4260dfd48aa351a17a8:3617656

即,flag{3617656}

BUU-else

BUU-异性相吸

最近出现了一个奇葩观点,说性别都不一样,怎么能谈恋爱?为了证明这个观点错误,请大家证明异性是相吸的。 注意:得到的 flag 请包上 flag{} 提交

给出了两个文件:密文.txt和key.txt

其中内容分别为

ἇ̀Ј唒ဃ塔屋䩘卖剄䐃堂ن䝔嘅均ቄ䩝ᬔ

asadsasdasdasdasdasdasdasdasdasdqwesqf

根据题目提示“”证明异性是相吸的,于是考虑可能是异或。而异或是二进制0,1之间进行运算,于是将密文和key转化为二进制再异或

由于异或得出的结果是二进制值,不太像flag的形式,于是将结果先转为16进制,然后再转为ASCII字符,得到了flag。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
import base64

def xor_encrypt_decrypt(ciphertext, key):
# 将密文和密钥转换为字节
cipher_bytes = ciphertext.encode('utf-8')
key_bytes = key.encode('utf-8')

# 初始化结果数组
result = []

# 对密文的每个字节和密钥的字节进行异或
for i in range(len(cipher_bytes)):
result.append(cipher_bytes[i] ^ key_bytes[i % len(key_bytes)])

# 将结果转换为字节类型
return bytes(result)

# 文件路径
key_file_path = '异性相吸/key.txt'
ciphertext_file_path = '异性相吸/密文.txt'

# 从文件中读取密钥和密文
with open(key_file_path, 'r', encoding='utf-8') as key_file:
key = key_file.read().strip() # 去掉首尾空格

with open(ciphertext_file_path, 'r', encoding='utf-8') as ciphertext_file:
ciphertext = ciphertext_file.read().strip() # 去掉首尾空格

# 执行 XOR 操作
encrypted = xor_encrypt_decrypt(ciphertext, key)

# 转换为十六进制
encrypted_hex = encrypted.hex()
print("XOR后的十六进制结果:", encrypted_hex)

# 转换为ASCII字符
try:
encrypted_ascii = encrypted.decode('ascii')
print("XOR后的ASCII结果:", encrypted_ascii)
except UnicodeDecodeError:
print("XOR结果无法转换为纯ASCII字符。结果可能包含不可显示的字符。")

# XOR后的十六进制结果: 666c61677b65613162633039383839393232373662376639356235346137343335653839657d
# XOR后的ASCII结果: flag{ea1bc0988992276b7f95b54a7435e89e}