[GXYCTF2019]CheckIn
打开题目所提供的文件,发现内容有点像base64解密文件,解密后得到
看到解码出来的结果既有数字又有字母符号,这让我想到了rot,
ROT5、ROT13、ROT18、ROT47 编码是一种简单的码元位置顺序替换暗码。此类编码具有可逆性,可以自我解密,主要用于应对快速浏览,或者是机器的读取,而不让其理解其意。
ROT5 是 rotate by 5 places 的简写,意思是旋转5个位置,其它皆同。下面分别说说它们的编码方式:
ROT5:只对数字进行编码,用当前数字往前数的第5个数字替换当前数字,例如当前为0,编码后变成5,当前为1,编码后变成6,以此类推顺序循环。
ROT13:只对字母进行编码,用当前字母往前数的第13个字母替换当前字母,例如当前为A,编码后变成N,当前为B,编码后变成O,以此类推顺序循环。
ROT18:这是一个异类,本来没有,它是将ROT5和ROT13组合在一起,为了好称呼,将其命名为ROT18。
ROT47:对数字、字母、常用符号进行编码,按照它们的ASCII值进行位置替换,用当前字符ASCII值往前数的第47位对应字符替换当前字符,例如当前为小写字母z,编码后变成大写字母K,当前为数字0,编码后变成符号_。用于ROT47编码的字符其ASCII值范围是33-126,具体可参考ASCII编码。
这个跟rot47有点像,于是rot47解码(https://www.qqxiuzi.cn/bianma/ROT5-13-18-47.php)得到
即可提交flag.
[AFCTF2018]Morse
打开题目,发现是一段摩斯密码,进行解密,得到一串十六进制数,将其进行字符转换即可得到flag.
[BJDCTF2020]signin
打开题目,内容是16进制数,于是进行字符转换,得到flag.
[AFCTF2018]Single
文件中有密文,还有.c文件,查看代码,发现数组arr是打乱顺序的,无法逆向,也不能爆破,于是直接将密文中的内容进行词频分析
[ACTF新生赛2020]crypto-classic0
打开文件发现需要密码,于是爆破,得到密码为19990306
输入打开文件是一个.c文件,对代码进行稍微的修改
得到flag{my_naive_encrytion}
[MRCTF2020]keyboard
文件是这样的
刚看到这个时并没有什么思路,后来百度看了一下解析,思路一下就通了,就是手机中九键英文格,根据提供的信息,有几个数字,就代表着是九键格中每个格子的英文的第几个。最后得到flag:flag{mobilephone}
[MRCTF2020]天干地支+甲子
,有题目可以知道此题目是一个天干地支60轮回,下载文件,提示了:
得到得字符串用MRCTF{}包裹
一天Eki收到了一封来自Sndav的信,但是他有点迷希望您来解决一下
甲戌
甲寅
甲寅
癸卯
己酉
甲寅
辛丑
找出他们对应的数字,如图:
写代码:
|
得到flag
[WUSTCTF2020]佛说:只能四天
打开题目有几个文件,看了一下,没有丝毫思路,只有去看看大佬的Writeup,突然茅塞顿开,
先要对文件的题目进行新约佛论禅解码新约佛论禅
然后再进行社会主义核心价值观编码核心价值观
查看解码的内容,发现最后有一段提示doyouknowfence,查阅了一下,发现是栅栏密码,于是在进行栅栏解密
[BJDCTF 2nd]rsa1
在虚拟机上nc 题目提供的信息
打开后看见题目提供了两个公式
p*p+q*q=数值和p-q=数值 以及c 和e
很显然是一个求m得题。首先我们得先解出q和p,解出后后面的步骤就简单了。写了求解代码
flag{b6d27a35-7ef8-49ef-9a4a-c5f365b34976} |
有关于python中z3的详细介绍,建议去z3了解,讲得很通俗易懂
[MRCTF2020]vigenere
是一个维吉尼亚题,下载文件后打开,发现是一堆乱序的单词,还提供了一个py文件,看了py文件,发现写不出代码,只得到网上找在线解密工具,功夫不负有心人,也是找到了vigenere解密,在不知道密钥的前提下,猜测一下密钥的大概范围,解密,在文章的最后也得到了flag
[GWCTF 2019]BabyRSA
文件提供的内容为提个txt文本文件,内容如下:
N=636585149594574746909030160182690866222909256464847291783000651837227921337237899651287943597773270944384034858925295744880727101606841413640006527614873110651410155893776548737823152943797884729130149758279127430044739254000426610922834573094957082589539445610828279428814524313491262061930512829074466232633130599104490893572093943832740301809630847541592548921200288222432789208650949937638303429456468889100192613859073752923812454212239908948930178355331390933536771065791817643978763045030833712326162883810638120029378337092938662174119747687899484603628344079493556601422498405360731958162719296160584042671057160241284852522913676264596201906163 m1=90009974341452243216986938028371257528604943208941176518717463554774967878152694586469377765296113165659498726012712288670458884373971419842750929287658640266219686646956929872115782173093979742958745121671928568709468526098715927189829600497283118051641107305128852697032053368115181216069626606165503465125725204875578701237789292966211824002761481815276666236869005129138862782476859103086726091860497614883282949955023222414333243193268564781621699870412557822404381213804026685831221430728290755597819259339616650158674713248841654338515199405532003173732520457813901170264713085107077001478083341339002069870585378257051150217511755761491021553239 m2=487443985757405173426628188375657117604235507936967522993257972108872283698305238454465723214226871414276788912058186197039821242912736742824080627680971802511206914394672159240206910735850651999316100014691067295708138639363203596244693995562780286637116394738250774129759021080197323724805414668042318806010652814405078769738548913675466181551005527065309515364950610137206393257148357659666687091662749848560225453826362271704292692847596339533229088038820532086109421158575841077601268713175097874083536249006018948789413238783922845633494023608865256071962856581229890043896939025613600564283391329331452199062858930374565991634191495137939574539546 |
还提供了一个加密.py脚本;因此我们可以根据题目提供的信息分析其解题思路。
import hashlib flag = 'GWHT{******}' assert(len(flag) == 38) half = len(flag) / 2 flag1 = flag[:half] secret_num = getPrime(1024) * bytes_to_long(secret) p = sympy.nextprime(secret_num) N = p * q e = 0x10001 F1 = bytes_to_long(flag1) c1 = F1 + F2 m1 = pow(c1, e, N) output = open('secret', 'w') |
代码加密过程说明了flag的字符长度为38位,将flag分为左右两部分,脚本提到了nextprime,指的是下一个质数,说明p,q是两个相邻的质数,那么可以对N进行开根号,有q=sympy.nextprime(p),可知q是p 的下一个质数。再可根据两个表达式求解c1,c2.对c1,c2进行加密即可得m1,m2。代码清楚了,就很清楚思路了,要求出F1,F2首先就得先求出c1,c2,而求解c1,c2的关键是求解p,q.前面已经介绍了该如何求得q,p后面的步骤就可想而知了。
|
得flag:GWHT{f709e0e2cfe7e530ca8972959a1033b2}
[WUSTCTF2020]babyrsa
打开题目,给我们提供的内容为c,n,e
可行而知这是要求m,即解密
要求m首先得求出d,而要求得d得先求出p和q,由于题目提供的n不是很大,可以用大数分解(http://www.factordb.com/)直接求出p和q
脚本如下:
|
[BJDCTF2020]easyrsa
提供的信息为一个脚本,如下:
from Crypto.Util.number import getPrime,bytes_to_long p=getPrime(1024) ''' |
思路:
根据代码可以知道几个已知信息
n=p*q
z=p^2+q^2
难点就是要把z的这个公式推导出来,不熟悉的,百度搜索查找到
Fraction(a,b)=a/b;
Derivative(f(x),x):这是用来求导的
同时又知道acrtan和arth的导函数分别为(1/(1+x^2))、(1/(1-x^2))
所以,很容易推导出z=p*p+q*q
然后我们根据n=p*q
联系上面两个公式,推导出p和q
首先设两个参数a,b
其中a=p^2+q^2+2*p*q=z+2*n
b=p^2+q^2-2*p*q=z-2*n
然后将a,b开平方,
p=(sqrt(a)+sqrt(b))//2
q=(sqrt(b)-sqrt(a))//2
后面就很容易了
phi=(p-1)*(q-1)
已知了e
我们可以求得d
ed=1 mod phi
m=pow(c,d,n)
根据以上思路可写出py脚本:
from Crypto.Util.number import * from sympy import Derivative from fractions import Fraction from gmpy2 import * c=mpz(7922547866857761459807491502654216283012776177789511549350672958101810281348402284098310147796549430689253803510994877420135537268549410652654479620858691324110367182025648788407041599943091386227543182157746202947099572389676084392706406084307657000104665696654409155006313203957292885743791715198781974205578654792123191584957665293208390453748369182333152809882312453359706147808198922916762773721726681588977103877454119043744889164529383188077499194932909643918696646876907327364751380953182517883134591810800848971719184808713694342985458103006676013451912221080252735948993692674899399826084848622145815461035) z=mpz(32115748677623209667471622872185275070257924766015020072805267359839059393284316595882933372289732127274076434587519333300142473010344694803885168557548801202495933226215437763329280242113556524498457559562872900811602056944423967403777623306961880757613246328729616643032628964072931272085866928045973799374711846825157781056965164178505232524245809179235607571567174228822561697888645968559343608375331988097157145264357626738141646556353500994924115875748198318036296898604097000938272195903056733565880150540275369239637793975923329598716003350308259321436752579291000355560431542229699759955141152914708362494482) n=mpz(15310745161336895413406690009324766200789179248896951942047235448901612351128459309145825547569298479821101249094161867207686537607047447968708758990950136380924747359052570549594098569970632854351825950729752563502284849263730127586382522703959893392329333760927637353052250274195821469023401443841395096410231843592101426591882573405934188675124326997277775238287928403743324297705151732524641213516306585297722190780088180705070359469719869343939106529204798285957516860774384001892777525916167743272419958572055332232056095979448155082465977781482598371994798871917514767508394730447974770329967681767625495394441) pqplus=iroot(z+2*n,2)[0] pqminus=iroot(z-2*n,2)[0] p=(pqminus+pqplus)//2 q=(pqplus-pqminus)//2 # p=getPrime(1024) # q=getPrime(1024) e=65537 phi=(p-1)*(q-1) d=invert(e,phi) m=pow(c,d,n) #z=Fraction(1,Derivative(arctan(p),p))-Fraction(1,Derivative(arth(q),q)) flag=long_to_bytes(m) print flag |
持续更新中