0x01 MD5
题目:
e00cf25ad42683b3df678c61f42c6bda
做法:
去网站跑字典,得到原文为admin1
flag{admin1}
0x02 Url编码
题目:
%66%6c%61%67%7b%61%6e%64%20%31%3d%31%7d
做法:
用工具把16进制转换成文本,即可得到flag
flag{and 1=1}
0x03 看我回旋踢
题目:
synt{5pq1004q-86n5-46q8-o720-oro5on0417r1}
做法:
观察格式觉得很像flag的格式,对比发现f和s,l和y差的位数均为13,尝试脚本解码,得到flag
flag{5cd1004d-86a5-46d8-b720-beb5ba0417e1}
#include<stdio.h>
#include<string.h>
int main() {
char a[50]="synt{5pq1004q-86n5-46q8-o720-oro5on0417r1}";
for(int i=0;i<strlen(a);i++)
if(a[i]>='a'&&a[i]<='z')
a[i]=a[i]-13;
printf("%s",a);
}
0x04 一眼就解密
题目:
ZmxhZ3tUSEVfRkxBR19PRl9USElTX1NUUklOR30=
做法:
直接Base64解密,得到flag
flag{THE_FLAG_OF_THIS_STRING}
0x05 摩丝
题目:
.. .-.. --- ...- . -.-- --- ..-
做法:
进行摩斯电码转换得到ILOVEYOU
flag{ILOVEYOU}
0x06 BJDCTF-签到
题目:
QkpEe1czbGMwbWVfVDBfQkpEQ1RGfQ==
做法:
直接base64解密,得到BJD{W3lc0me_T0_BJDCTF}
flag{W3lc0me_T0_BJDCTF}
0x07 password
题目:
姓名:张三
生日:19900315
key格式为key{xxxxxxxxxx}
做法:
直接缩写,感觉智商不够用了。。
flag{zs19900315}
0x08 变异凯撒
题目:
加密密文:afZ_r9VYfScOeO_UL^RWUc
格式:flag{ }
做法:
根据给出的格式判断前四位的值对应flag
,算出第一位偏移了5位,第二位偏移了6位,第三位偏移了7位,所以开始写脚本,得到flag
flag{Caesar_variation}
#include<stdio.h>
#include<string.h>
int main() {
int k=5;
char a[30]="afZ_r9VYfScOeO_UL^RWUc";
for(int i=0;i<strlen(a);i++){
a[i]=a[i]+k;
k++;
}
printf("%s",a);
return 0;
}
0x09 Quoted-printable
题目:
=E9=82=A3=E4=BD=A0=E4=B9=9F=E5=BE=88=E6=A3=92=E5=93=A6
做法:
在网站选择UTF-8进行解码,得到那你也很棒哦
flag{那你也很棒哦}
0x0A Rabbit
题目:
U2FsdGVkX1/+ydnDPowGbjjJXhZxm2MP2AgI
做法:
根据题目提示为Rabbit加密,到网站解密即可得到Cute_Rabbit
,
尝试其他Rabbit加密发现均是U2FsdGVkX1
开头,以后遇到类似的可以去试试
flag{Cute_Rabbit}
0x0B RSA
题目:
在一次RSA密钥对生成中,假设p=473398607161,q=4511491,e=17,求解出d作为flag提交
做法: 首先了解下RSA加密的原理:
由此得出脚本,解得d=125631357777427553
flag{125631357777427553}
p = 473398607161
q = 4511491
e = 17
phi = (p-1)*(q-1)
k = 0
# de=1+phi*k,i为正数,'//'除法向上取整
while True:
if((phi*k+1)%e == 0):
break;
k+=1
d = (phi*k+1)//e
print(d)
import gmpy2
p = 473398607161
q = 4511491
e = 17
phi = (p-1)*(q-1)
d = gmpy2.invert(e,phi)
print(d)
0x0C 篱笆墙的影子
题目:
felhaagv{ewtehtehfilnakgw}
做法:
看到熟悉的flag{}
,然后发现相隔1位,觉得是栅栏密码,一共26个字符,分成2组,进行栅栏解码得到flag
flag{wethinkwehavetheflag}
e="felhaagv{ewtehtehfilnakgw}"elen=len(e) #计算字符长field=[]for i in range(2,elen): if(elen%i==0): field.append(i)for f in field: b=elen//f #用字长除以上面计出能除的数字 result={x:'' for x in range(b)} for i in range(elen): a=i%b; result.update({a:result[a]+e[i]}) #字符串断,update新数据 d='' for i in range(b): d=d+result[i] print('分为'+str(f)+'栏时,解密结果为: '+d+'\n')
0x0D 丢失的md5
题目:
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
做法:
运行下py脚本即可得到e9032994dabac08080091151380478a2
,无脑题
flag{e9032994dabac08080091151380478a2}
0x0E Alice与Bob
题目:
下面是一个大整数:98554799767,请分解为两个素数,
分解后,小的放前面,大的放后面,合成一个新的数字,
进行md5的32位小写哈希,提交答案。
做法:
用py脚本分解得到101999×966233
,即101999966233
,
md5转换后得到d450209323a847c8d01c6be47c81811a
flag{d450209323a847c8d01c6be47c81811a}
n = 98554799767
l = []
while n > 1:
for i in range(2, n+1):
if n % i == 0:
n = n // i
l.append(str(i))
break
print ("×".join(l))
0x0F 老文盲了
题目:
罼雧締眔擴灝淛匶襫黼瀬鎶軄鶛驕鳓哵眔鞹鰝
做法:
看到这...没心态,觉得是UTF-8中文的乱码,没试出来,仔细看了下擴灝
,是不是括号
谐音,结合题目怀疑是认字有关的,
我没文化,就去网站查了下中文拼音,是bì jí dì dà kuò hào zhè jiù shì fǔ lài gē zhí jiē jiāo lè bā dà kuò hào
,
换成中文bjd{这就是flag直接交了吧}
,不对,换了好多个都不行,最后来了个思路bjd{淛匶襫黼瀬鎶軄鶛驕鳓哵}
,成功了,我人傻了,我没文化。
flag{淛匶襫黼瀬鎶軄鶛驕鳓哵}
0x10 rsarsa
题目:
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
做法:
首先了解下RSA加密的原理:
由此得出脚本,解得m=5577446633554466577768879988
import gmpy2
p = gmpy2.mpz(9648423029010515676590551740010426534945737639235739800643989352039852507298491399561035009163427050370107570733633350911691280297777160200625281665378483)
q = gmpy2.mpz(11874843837980297032092405848653656852760910154543380907650040190704283358909208578251063047732443992230647903887510065547947313543299303261986053486569407)
c = gmpy2.mpz(83208298995174604174773590298203639360540024871256126892889661345742403314929861939100492666605647316646576486526217457006376842280869728581726746401583705899941768214138742259689334840735633553053887641847651173776251820293087212885670180367406807406765923638973161375817392737747832762751690104423869019034)
#mpz(x)初始化大整数
e = 65537
n=p*q
phi = (p-1)*(q-1)
d = gmpy2.invert(e,phi)
m = pow(c,d,n)
#pow(x,y,z) x^y%z
print(m)
0x11 Windows系统密码
题目:
Administrator:500:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
ctf:1002:06af9108f2e1fecf144e2e8adef09efd:a7fcb22a88038f35a8f39d503e7f0062:::
Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
SUPPORT_388945a0:1001:aad3b435b51404eeaad3b435b51404ee:bef14eee40dffbc345eeb3f58e290d56:::
做法:
根据题目搜了到一篇Windows密码的原理,
存储的密码hash是NTLM类型的,存储在第三个字段中,即a7fcb22a88038f35a8f39d503e7f0062
,去网站跑字典,得到原文为good-luck
flag{good-luck}
0x12 大帝的密码武器
题目:
公元前一百年,在罗马出生了一位对世界影响巨大的人物,他生前是罗马三巨头之一。他率先使用了一种简单的加密函,因此这种加密方法以他的名字命名。
密文`FRPHEVGL`被解开后可以获得一个有意义的单词,你可以用这个相同的加密向量加密ComeChina,作为答案进行提交。
做法:
纯字母和罗马伟大人物,判断是凯撒密码,当偏移量为13时,用脚本解得SECURITY
,刚好是13位,所以加密和解密脚本都一样,
加密ComeChina
得到PbzrPuvan
flag{PbzrPuvan}
#include<stdio.h>
#include<string.h>
int main() {
char a[10]="ComeChina";int move=13;
for(int i=0;i<strlen(a);i++){
if(a[i]<='Z'){
a[i]=a[i]+move;
if(a[i]>'Z')
a[i]=a[i]-26;
}else{
a[i]=a[i]+move;
if(a[i]>'z')
a[i]=a[i]-26;
}}
printf("%s",a);
}
0x13 传统知识+古典密码
题目:
小明某一天收到一封密信,信中写了几个不同的年份
辛卯,癸巳,丙戌,辛未,庚辰,癸酉,己卯,癸巳。
信的背面还写有“+甲子”,请解出这段密文。
key值:CTF{XXX}
做法:
查了下辛卯,是干支的一种,排28位,加上+甲子
,就是88,对应ASCII码是字母X
,写脚本得出字符串XZSDMFLZ
,当成flag提交发现不对,
纯英文的应该是凯撒密码,得,试了N次,没做出来,看别人题解是先栅栏得到XMZFSLDZ
,再凯撒ROT21得到SHUANGYU
,这就是flag
flag{SHUANGYU}
a=[28,30,23,8,17,10,16,30]
for i in a:
print(chr(i+60),end='')
0x14 cat_flag
题目:
文件链接
做法:
一打开就傻眼了。。得,80个格子。。把吃饭团的作为0,吃鸡腿的作为1,得到01000010010010100100010001111011010011010010000101100001001100000111111001111101
二进制转字符串得到BJD{M!a0~}
flag{M!a0~}
0x15 燕言燕语-y1ng
题目:
小燕子,穿花衣,年年春天来这里,我问燕子你为啥来,燕子说:
79616E7A69205A4A517B78696C7A765F6971737375686F635F73757A6A677D20
做法:
直接16进制转字符串得到yanzi ZJQ{xilzv_iqssuhoc_suzjg}
,试了下发现不是flag,前面还有yanzi
,
搜了下发现是维吉尼亚密码,密钥是yanzi
,解密ZJQ{xilzv_iqssuhoc_suzjg}
得到BJD{yanzi_jiushige_shabi}
,提供一个网站
flag{yanzi_jiushige_shabi}
0x16 小学生的密码学
题目:
e(x)=11x+6(mod26)
密文:welcylk,flag为base64形式
做法:
经过查询,这个题目是考察仿射密码的解密,其中公式为:
加密函数:E(x) = (ax + b)(mod m),其中a与b互质,m是编码系统中字母的个数。
解密函数:D(x) = a^(-1)(x - b)(mod m),其中 a^(-1)是a在Zm群的乘法逆元。
因为y≡11x+6(mod26)
,11*k≡1(mod26)
,解得k=19
,即为a的乘法逆元。
所以x≡19(y-6)=19y-114≡19y+16(mod26)
,解得sorcery
,base64编码得到c29yY2VyeQ==
flag{c29yY2VyeQ==}
#include<stdio.h>
#include<string.h>
int main(int argc, char const *argv[]) {
char a[10]="welcylk";
int x;
for(int i=0;i<strlen(a);i++){
x=(19*(a[i]-97)+16)%26+97;
printf("%c",x);
}
return 0;
}
0x17 信息化时代的步伐
题目:
也许中国可以早早进入信息化时代,但是被清政府拒绝了。附件中是数十年后一位伟人说的话的密文。请翻译出明文(答案为一串中文)
606046152623600817831216121621196386
做法:
看提示查了一下发现这里考察中文电码,即4位数字代表一个中文字符,到网站解码即可。解得计算机要从娃娃抓起
。
flag{计算机要从娃娃抓起}
0x18 凯撒?替换?呵呵!
题目:
MTHJ{CUBCGXGUGXWREXIPOYAOEYFIGXWRXCHTKHFCOHCFDUCGTXZOHIXOEOWMEHZO}
flag为小写字母
做法:
0x19 信息化时代的步伐
题目:
做法: