好久没做题了,这里记录一下做题的过程,积累一下经验~
ps:做题过程中,有些题目参考了某些大佬的wp,望包含~~
Death_Chain
题目如下,经查找发现是夏多密码~:
直接查表:
夏多密码规则:
最下面四个图表示方向,1表示向上,2表示顺时针转动90度,其他同理
而且要注意所有的变换都要以原图为准,而不是根据上一次变换而变换
解得flag为:flag{FLAGISHELPMEOUTPLEASE}
先有什么
打开得到题目:
看着键盘画圈圈,发现每个圈中间都有一个字母
连起来就是flag,得到flag:key{venusectf}
检查符号
题目如下:
看着题目估摸着就是莫斯电码,把句号替换成空格,把o替换成点,把0替换成杠
得到莫斯密码,使用莫斯解码在线工具进行解码
得到flag:key{welcometovenusctf}
德军密码
题目描述:
二战时盟军截获德军一段密码,密文为:0000011000000000101010110111001011000101100000111001100100111100111001(密钥:helloworld),你可能会解出一个keyxxxxx的答案,请在y后面加{,结尾加},答案的格式是key{xxxxx},所以答案是
根据描述可得知是二战时德军使用过的一种密码,利用了二进制的表示法来替代字母,也被称为费娜姆密码,题目所给出的二进制串的长度为70,刚好是秘钥长度的7倍,猜测是一次一密,解密方法:密文每7个一组,与密钥进行异或处理
编写脚本:
str = "0000011000000000101010110111001011000101100000111001100100111100111001"
key = "helloworld"
flag = ""
for i in range(0,int(len(str)/7)):
x = str[i*7:(i+1)*7]
n = int(x,2)
m = ord(key[i])
flag += chr(n^m)
print(flag)
得到:
得到flag:key{[yahkr]}
密钥生成
题目如下:
求RSA的d,直接使用脚本:
p=473398607161
q=4511491
e=17
def rsa_get_key(e, euler):
k = 1
while True:
if (((euler * k) + 1) % e) == 0:
return (euler * k + 1)
k += 1
print(rsa_get_key(e,(p-1)*(q-1)))
得到:
get flag:key{125631357777427553}
规则很公平
题目如下:
暗示最公平的游戏,fair,八九不离十是playfair加密~
加密解密规则就不细说了,看这里——palyfair密码
按照规则来进行解密(纯手工~):
由于编码的规则,不足会补上X,所以X要去掉
得到flag:key{VENUSISAFAIRCOMPANY}
数学小问题
按照题意好像是仿射密码,但是题目中有数字,不知道如何解~ 菜~
目前未解决~
此处应写
打开下载的文件得到一串:
_____*((__//__+___+______-____%____)**((___%(___-_))+________+(___%___+_____+_______%__+______-(______//(_____%___)))))+__*(((________/__)+___%__+_______-(________//____))**(_*(_____+_____)+_______+_________%___))+________*(((_________//__+________%__)+(_______-_))**((___+_______)+_________-(______//__)))+_______*((___+_________-(______//___-_______%__%_))**(_____+_____+_____))+__*(__+_________-(___//___-_________%_____%__))**(_________-____+_______)+(___+_______)**(________%___%__+_____+______)+(_____-__)*((____//____-_____%____%_)+_________)**(_____-(_______//_______+_________%___)+______)+(_____+(_________%_______)*__+_)**_________+_______*(((_________%_______)*__+_______-(________//________))**_______)+(________/__)*(((____-_+_______)*(______+____))**___)+___*((__+_________-_)**_____)+___*(((___+_______-______/___+__-_________%_____%__)*(___-_+________/__+_________%_____))**__)+(_//_)*(((________%___%__+_____+_____)%______)+_______-_)**___+_____*((______/(_____%___))+_______)*((_________%_______)*__+_____+_)+___//___+_________+_________/___
应该是要我们运算出结果吧~
下划线应该是数字,,,,,暴力可能要暴力一年,,,,
看了一下,,,下划线有长有短,有1个的,也有9个的~
直接设置下划线为变量~
直接编写脚本(python3的除会有小数,导致结果不正确,所以使用python2):
_ = 1
__ = 2
___ = 3
____ = 4
_____ = 5
______ = 6
_______ = 7
________ = 8
_________ = 9
a = _____*((__//__+___+______-____%____)**((___%(___-_))+________+(___%___+_____+_______%__+______-(______//(_____%___)))))+__*(((________/__)+___%__+_______-(________//____))**(_*(_____+_____)+_______+_________%___))+________*(((_________//__+________%__)+(_______-_))**((___+_______)+_________-(______//__)))+_______*((___+_________-(______//___-_______%__%_))**(_____+_____+_____))+__*(__+_________-(___//___-_________%_____%__))**(_________-____+_______)+(___+_______)**(________%___%__+_____+______)+(_____-__)*((____//____-_____%____%_)+_________)**(_____-(_______//_______+_________%___)+______)+(_____+(_________%_______)*__+_)**_________+_______*(((_________%_______)*__+_______-(________//________))**_______)+(________/__)*(((____-_+_______)*(______+____))**___)+___*((__+_________-_)**_____)+___*(((___+_______-______/___+__-_________%_____%__)*(___-_+________/__+_________%_____))**__)+(_//_)*(((________%___%__+_____+_____)%______)+_______-_)**___+_____*((______/(_____%___))+_______)*((_________%_______)*__+_____+_)+___//___+_________+_________/___
a = hex(a)
print a
得到一串16进制字符串,转为ASCII码:
得到:key{I_4m-k3y}
栅栏加密
题目如下:
根据提示,第一个数和第二个数换了位置,第三个数没动~
三个一组进行替换,然后从上往下,在从左往右链接起来,进行base64解密即可
至于为什么从上往下连接,,,,我只能说自己尝试出来的,,,,,
duJ
mZl
V2Y
uVW
dkx
XXs
N2e
D1V
V59
EXs
Z2d
7ZW
SlN
Vbr
9me
DNS
alF
GX9
F1
dmVudXNDVEZ7SV9DaGFuZ2VkX215X2ZlbmNlX1JlYWxseV9sdWNreSF9
解码可得:venusCTF{I_Changed_my_fence_Really_lucky!}
小明入侵
题目如下:
猜测是MD5加密!
直接使用脚本来爆破即可:
import hashlib
s = "a74be8e20b"
x = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
for i in x:
for j in x:
for k in x:
for l in x:
strs = "key{"+i+j+k+l+"}"
#rint(i,j,k,l)
c = hashlib.md5(strs.encode()).hexdigest()
if s in c:
print(strs)
break;
得到:
所以flag就是:key{BNdE}
RSA破解
下载文件,有两个文件~
看上去这道题就是和前不久buuctf上面的一道逆向题目差不多~
同理利用在线工具分析公钥:
然后利用yafu分解n:
利用上一次的解题脚本即可:
import hashlib
import gmpy2
import rsa
q = 286924040788547268861394901519826758027
p = 258631601377848992211685134376492365269
e = 65537
n = 74207624142945242263057035287110983967646020057307828709587969646701361764263
d = gmpy2.invert(e,(q-1)*(p-1))
print(d)
d = 23071769375111040425287244625328797615295772814180109366784249976498215494337
key = rsa.PrivateKey(n,e,d,p,q)
print(key)
with open("flag.enc","rb") as f:
print(rsa.decrypt(f.read(),key).decode())
得到:
flag:ISG{256bit_is_weak}
RSA分解
这道题目也不难吧~
直接打开题目:
给出了n和e,下面应该是密文~
直接分解n,n不大可以直接分解得到p和q,这样也就能够得到d了
由于数字不大,可以直接使用pow进行解密
脚本如下:
import gmpy2
n = 920139713
e = 19
p = 18443
q = 49891
d = int(gmpy2.invert(e,(q-1)*(p-1)))
a = [704796792,752211152,274704164,18414022,368270835,483295235,263072905,459788476,
483295235,459788476,663551792,475206804,459788476,428313374,475206804,459788476,425392137,
704796792,458265677,341524652,483295235,534149509,425392137,428313374,425392137,341524652,
458265677,263072905,483295235,828509797,341524652,425392137,475206804,428313374,483295235,
475206804,459788476,306220148]
for i in a:
print(chr(pow(i,d,n)),end="")
得到:
flag:flag{13212je2ue28fy71w8u87y31r78eu1e2}
只有密文
打开文件发现只有密文和n,应该是唯密文攻击~
好像这个是实验吧上面的一道题目~~西普CTF-唯密文攻击
原理还是n是两个质数相乘,所以如果找到他的最大公约数即相当于对n做了分解
找最大公约数时,最大的,其他都为1,所以选取这个为p:
然后q=n/p不过这里我使用的是python2计算的,因为python3的/会是小数,会对结果造成影响:
最后进行MD5加密,去前八位
解题过程脚本如下:
import re
import hashlib
#取出所有的数,记得把n的那一行去掉
with open('ciphertext.txt', 'r') as f:
content = f.readlines()
e = []
for line in content:
res = re.findall('^\d+', line)
if len(res) > 0:
e.append(int(res[0]))
n = 135176830582884945708175419898330054260341730432046991449072509302750602166218145078102928897914789996197402658592881347572949256377161172079344803330624352445165759925647345536051853372740246104804540179716136644319380454884518397455488002758429914465640804944658049262500561494830899678619427468784748988379
def gcd(m,n):
c=1
while(c!=0):
c=m%n
m=n
n=c
return m
for i in e:
print(gcd(i,n))
p = 13038371855775914836995578093728166671103633520203033965827703187246607207039273968425501296569317295959057439253867586769212037981452712871242668046329877
q = int (n / p)
q = 10367615840240242845371941453623373821227053765532752994306127876946421006862147600725324340607889088707606730457021312059130583835286311559997627141422127
m = hashlib.md5(str(q).encode()).hexdigest()
print(m[0:8])
得到:
提交正确:key{f49d7fe4}
算法问题
打开的到一个py文件,还有一个enc,py源码:
#!/usr/bin/python
flag = 'venuscryptoissimpletodecrypt'
hflag = flag.encode('hex')
iflag = int(hflag[2:], 16)
print iflag
def FAN(n, m):
i = 0
z = []
s = 0
while n > 0:
if n % 2 != 0:
z.append(2 - (n % 4))
else:
z.append(0)
n = (n - z[i])/2
i = i + 1
z = z[::-1]
l = len(z)
for i in range(0, l):
s += z[i] * m ** (l - 1 - i)
return s
i = 0
r = ''
while i < len(str(iflag)):
d = str(iflag)[i:i+2]
nf = FAN(int(d), 3)
r += str(nf)
i += 2
print r
直接运行一遍~
发现加密的密文和运行出来的结果一样的,果断提交,正确!
不过我还是选择分析一遍代码!!!(好像也是实验吧上面的一道题目~)
解密过程:利用FAN函数生成0~99的字典,然后查字典,连接起来
本来以为可以做的,结果源码生成FAN的结果有所发现:
你这叫我怎么判断???如何选择3位或者2位?完蛋,太菜,附上一半的脚本:
def FAN(n, m):
i = 0
z = []
s = 0
while n > 0:
if n % 2 != 0:
z.append(2 - (n % 4))
else:
z.append(0)
n = (n - z[i])/2
i = i + 1
z = z[::-1]
l = len(z)
for i in range(0, l):
s += z[i] * m ** (l - 1 - i)
return s
f = open("enc.txt","r").read().strip()
#生成字典
dir = {}
for i in range(0,100):
dir[FAN(i,3)] = i;
flag = ''
i = 0
while i < len(f):
for j in range(4,0,-1):
tmp = int(f[i:i+j])
if tmp in dir:
flag += '%02d'%dir[tmp]
i += j
print(tmp)
break
print(flag)
运行到27的时候会死循环,导致结果出不来~~
不过flag源码中给出了,就是:key{venuscryptoissimpletodecrypt}
大家来解密
暂未写出来~
貌似是什么AES解密吧,不太会~~菜
RSA专家
下载文件,题意已经说了给出了私钥和密文
直接使用openssl进行解密,openssl下载链接
使用命令:
openssl rsautl -decrypt -in hello.en -inkey test.key -out hello.de
-in指定被加密的文件,-inkey指定私钥文件,-out为解密后的文件。
我是在window下运行的:
得到:
提交:key{c42bcf773d54cf03}