BUUCTF平台Crytpo部分Writeup – 安全客,安全资讯平台 | xxxBUUCTF平台Crytpo部分Writeup – 安全客,安全资讯平台 – xxx
菜单

BUUCTF平台Crytpo部分Writeup – 安全客,安全资讯平台

九月 13, 2020 - 安全客

BUUCTF平台Crytpo部分Writeup - 安全客,安全资讯平台

 

[BJDCTF 2nd]rsa1

https://buuoj.cn/challenges#[BJDCTF 2nd]rsa1

首先拿到题目靶机。nc交互获取得到题目数据

BUUCTF平台Crytpo部分Writeup - 安全客,安全资讯平台

得到的条件有

明显是一个rsa加密。要去求解这个题目。因为求解rsa嘛。我们本质上肯定是想通过最基础的rsa解密去求解的。也就是我们要获取到私钥d以及公钥n。

这边我们通过去求解p和q的值。来求解rsa加密。

根据已知信息

假设 p^2+q^2=a p-q=b 其中a、b已知 即求解二元二次方程 

求解方程可以使用z3-solver进行求解
安装方法如下

找到官网

https://pypi.org/project/z3-solver/4.8.8.0/#files

下载对应系统的第三方库文件

例如我是windows系统,我下载的就是

z3_solver-4.8.8.0-py2.py3-none-win_amd64.whl

然后pip安装这个z3-solver库

pip install z3_solver-4.8.8.0-py2.py3-none-win_amd64.whl 

然后求解出p和q的值进行一个基础的rsa解密就好了。

 

EasyProgram

https://buuoj.cn/challenges#EasyProgram

拿到题目下载附件,得到两个文件

用python读入字节流,判断长度为38.长度为38我们知道flag{}加上中间32位md5值就是一个标准的flag.也就先判断file.txt存放的是flag的密文

一个加密算法,大概是类似伪代码之类的。也比较容易看懂

get buf unsign s[256] get buf t[256] we have key:whoami we have flag:???????????????????????????????? for i:0 to 256     set s[i]:i for i:0 to 256     set t[i]:key[(i)mod(key.lenth)] for i:0 to 256     set j:(j+s[i]+t[i])mod(256)         swap:s[i],s[j] for m:0 to 38     set i:(i + 1)mod(256)     set j:(j + S[i])mod(256)     swap:s[i],s[j]     set x:(s[i] + (s[j]mod(256))mod(256))     set flag[m]:flag[m]^s[x] fprint flagx to file 

简单的把代码理一下,改成python的实现

key="whoami" flag="flag{test_test_test_test_test_test_te}" s=[] t=[] flag_enc="" for i in range(256):     s.append(i) for i in range(256):     t.append(ord(key[i%len(key)])) j=0 for i in range(256):     j=(j+s[i]+t[i])%256     tmp=s[i]     s[i]=s[j]     s[j]=tmp i=0 j=0 for m in range(38):     i=(i+1)%256     j=(j+s[i])%256     tmp=s[i]     s[i]=s[j]     s[j]=tmp     x=(s[i]+s[j]%256)%256     flag_enc+=chr(ord(flag[m])^s[x]) print(flag_enc) 

简单分析一下,就是一个最简单的流密码,可以把前面的操作看作生成了一个密钥流。这个密钥流明显是固定的(也就是说和加密的明文无关)。那就很简单,异或解密就可以了。

 

[AFCTF2018]可怜的RSA

https://buuoj.cn/challenges#[AFCTF2018]可怜的RSA

就明显是拿到两个附件,一个是RSA加密的密钥文件,还有一个是flag加密后的密文的文件。

这边的话一种就是常规的用openssl,个人不太喜欢用。python能解决的问题我一般就python解决了。这边用到python的Crypto库,是做CTF密码学非常常用的一个库。

pip install pycrypto 

安装好这个Crypto库
然后导入Crypto.PublicKey.RSA

用RSA模块的import_key函数将我们的publickey读入,拿到RSA加密的公钥n和e的具体参数

from Crypto.PublicKey import RSA f=open("public.key","r") key=RSA.import_key(f.read()) f.close() e=key.e n=key.n 

然后发现n可以分解,直接在线网站http://factordb.com/把n给分解了,得到公钥n的两个因子。
然后就是常规的RSA求解私钥

这边因为flag.enc是RSA的PKCS1_OAEP加密得来的。所以我们这边也是给生成一个私钥文件。

在做到这边的时候,如何导出一个私钥文件。找了一下百度上的方法。都是先generate后给参数分别赋值的。但是我发现我并不行,试了一下python3和python2下的Crypto库都得到一个报错

Exception has occurred: AttributeError can't set attribute 

也就是现在无法通过这么直接赋值了。
这种情况的话,可以去看下python调用的Crypto库里面的RSA模块的一个底层的实现。

发现有一个construct函数,传入一个rsa_components参数,是一个元组型的数据,也就是tuple类型的,分别是(n,e,d,p,q)

phi=(p-1)*(q-1) d=gmpy2.invert(e,phi) rsa_components=(n,e,int(d),p,q) arsa=RSA.construct(rsa_components) arsa.exportKey() 

然后导出的私钥,对加密后的密文,使用PKCS1_OAEP模块进行解密即可。

 

[AFCTF2018]BASE

https://buuoj.cn/challenges#[AFCTF2018]BASE

拿到附件是一个flag加密后的文本,其实是flag经过很多次base系列编码后的一个内容。文件有20+MB,文本编辑器发现是一行编码后的内容。

这题主要是三种编码,base64/base32/base16。base16也就是16进制。

就疯狂解码就行了。主要是考察一个脚本的编写吧,也只能这么理解。。

 

[WUSTCTF2020]情书

https://buuoj.cn/challenges#[WUSTCTF2020]情书

拿到附件发现说明里面是RSA加密

并且给了密钥,密文。直接写脚本解就完事了。

接出来的内容为字母表的索引,找到对应的字母即可

 

[NPUCTF2020]Classical Cipher

https://buuoj.cn/challenges#[NPUCTF2020]Classical Cipher

flag.zip为加密的zip文件,zip密码为key.txt中

因为这边有一组明密文的对应关系,即key→pvb,古典密码学思想直接词频分析。

使用词频分析网站:https://www.quipqiup.com/

得到结果:the_key_is_atrash

尝试用这个去解密发现密码错误。

BUUCTF平台Crytpo部分Writeup - 安全客,安全资讯平台

然后仔细分析一下这个词频分析结果。发现有atbash,这个词的话就比较熟悉,古典密码里面经典的单表替换密码。

其实压缩包密码为the_key_is_atbash。主要是因为词频分析的话atrash更符合表达。

直接atbash解密即可

BUUCTF平台Crytpo部分Writeup - 安全客,安全资讯平台

解开压缩包拿到图片

BUUCTF平台Crytpo部分Writeup - 安全客,安全资讯平台

猪圈密码的话是比较常见的一种编码了。可以百度一下,这边要注意一点,这个猪圈密码和CTFwiki上面给出的那个表不同。对应关系参照的是这个表:

BUUCTF平台Crytpo部分Writeup - 安全客,安全资讯平台

然后还有一些动物啥的,其实是象形文字。。。怎么说呢,勉勉强强算是理解成一种编码吧。这边对应的编码表也是给大家找来了。

BUUCTF平台Crytpo部分Writeup - 安全客,安全资讯平台

这边对应下两张表去解出明文即可。

 

[网鼎杯 2020 青龙组]you_raise_me_up

https://buuoj.cn/challenges#[网鼎杯 2020 青龙组]you_raise_me_up

附件就是一个加密脚本,然后输出的话也是直接注释在了脚本里面。

其实乍一看你会发现他和RSA加密很像,最后的加密过程为。

pip install z3_solver-4.8.8.0-py2.py3-none-win_amd64.whl 

3

我们知道RSA加密就是令明文为m,取公钥e和n,密文c=pow(m,e,n)
这边的一个明显区别为,可以理解为flag明文作为RSA加密里面的公钥e进行的求解。

这个在密码学里面是基于离散对数的一种加密,我们在求解明文的时候,也就相当于是求解基于同余运算和原根的一种对数运算。

求解这种问题的话我们用python的sympy模块的discrete_log函数进行求解就可以了。discrete_log(n,c,m)

 

[ACTF新生赛2020]crypto-aes

https://buuoj.cn/challenges#[ACTF新生赛2020]crypto-aes

分析附件,发现aes.py是一个简单的aes cbc模式的加密脚本。

pip install z3_solver-4.8.8.0-py2.py3-none-win_amd64.whl 

5

很显然的是,key和iv为两个随机比特流。但是特点很明显。
其中key是长度为两个字节的比特流重复了16次。iv就是一个长度为16字节的比特流

故这边,key的长度为32字节,iv的长度为16字节

然后给了我们key和iv异或的输出结果

这边易得到一个结论,key的低16字节与iv的16字节异或,而key的高16字节就保留了,可以看作高16字节的每一位都是与0异或,而与0异或结果就是它本身。

BUUCTF平台Crytpo部分Writeup - 安全客,安全资讯平台

这边我们将output文件中得到的key与iv异或结果的10进制值,转换成16进制值。我们知道16进制的每两位表示的是一个字节。这边可以看到输出结果的高位都是c981的一个重复。即可得key中重复的两字节的16进制分别是c9和81,如此我们也就得到了key,再异或得到iv进行aes基础解密即可。

 

[INSHack2017]rsa16m

https://buuoj.cn/challenges#[INSHack2017]rsa16m

附件rsa_16m是一个7+MB的文件,里面主要的一个数据为RSA加密体系中的n,e,c。

可以发现的是n极大,e虽然也挺大的,为0x10001。但是这边明文flag的e次方还是小于n的。故这一题直接用rsa里面的小明文攻击即可。

直接对密文c开e次方根

 

[XNUCA2018]Warmup

https://buuoj.cn/challenges#[XNUCA2018]Warmup

简单分析一下Buggy_Server.py脚本,是一个模拟发送消息的脚本,使用的是rsa加密,通过传入user将flag消息进行rsa加密发送给user,并抓取所有消息的一个流量。

直接对流量包进行一个分析,追踪一下TCP流,可以发现

BUUCTF平台Crytpo部分Writeup - 安全客,安全资讯平台

题目给出的流量包的内容,即发送给user的rsa加密数据。

这边发现,发送给Alice和Carol这两个用户,使用的公钥n是一样的。那就是一个rsa里面经典的共模攻击。

 

[b01lers2020]safety_in_numbers

https://buuoj.cn/challenges#[b01lers2020]safety_in_numbers

这边的话enc.py里面要注意一个点,他从int转成bytes和bytes转int都是用的小端模式也就是byteorder = ‘little’,这个和我们正常的一个转换刚好相反的。

然后可以发现是pubkey.pem极大,有1.6MB,这边如果是使用RSA.importKey是无法取出他的公钥n,e的。因为根本无法导入。但是我们其实知道公钥文件的格式,

e其实就在base64编码的公钥文件的尾部

pip install z3_solver-4.8.8.0-py2.py3-none-win_amd64.whl 

9

BUUCTF平台Crytpo部分Writeup - 安全客,安全资讯平台

得到结果如下

明显最后的16进制值为0x10001,这也是rsa中最常用的一个公钥e。

因为n极大,这题也是直接小明文攻击求解。

 

[AFCTF2018]MyOwnCBC

https://buuoj.cn/challenges#[AFCTF2018]MyOwnCBC

那解密也很简单,因为key其实就是每组加密后的密文嘛,直接AES ECB模式下解密即可。

 

[RoarCTF2019]RSA

https://buuoj.cn/challenges#[RoarCTF2019]RSA

题面如下:

import z3 import gmpy2 from Crypto.Util.number import * #公钥e e=11630623 #p^2+q^2 p2q2=159091823893455582874061921154612415267326476512949054956396980727282756099500423604620855106680518280081561541640137584218141965305223222299378169087637728170419037951685924289388185840842033127708318792414241966337535836497572877344724131756911624967860755193905135911797719211253029463146921655068409851682 #p-q p_q=-1028057512734526688756255253926193308887656904740633132866508165158161555923213681694346079000723418169221377228338798941679856716917764591264729224439880 #密文c c=c=16828607056351898528593346827961041518302251064718691085202163294074947863618526294699466675783765349214251854122505153854940088340991317516413847467861967618764774324129650766830916741676747137720500142976165361634620558308099053963312274170652756789297267286419176164695159543581037737967947118601658126996 #使用z3对二元二次方程进行求解 s=z3.Solver() #定义两个变量 p,q=z3.Ints("p q") #添加方程 s.add(p*p+q*q==p2q2) s.add(p-q==p_q) s.add(p>0) arr=[] #校验是否有解 if s.check()==z3.sat:   arr=s.model() print(arr) #得到p,q q = 9418055170543903468662169278295577389409276234772590476185014016803075309886254123445652979884992724665244226628125328356664293030046148360676450649936611 p = 8389997657809376779905914024369384080521619330031957343318505851644913753963040441751306900884269306496022849399786529414984436313128383769411721425496731 #简单验证一下 assert(p*p+q*q==p2q2) assert(p-q==p_q) #rsa基础解密 n=p*q phi=(p-1)*(q-1) d=gmpy2.invert(e,phi) m=pow(c,d,n) flag=long_to_bytes(m) print(flag) 

3

这一题我们发现n直接可以分解。
这一点我也很费解。。因为RoarCTF当时也有参与出题和测题。明明不应该出现这个问题。这个factordb的网站有收录就很离谱。

BUUCTF平台Crytpo部分Writeup - 安全客,安全资讯平台

这边介绍一下预期解。

我们首先看到

import z3 import gmpy2 from Crypto.Util.number import * #公钥e e=11630623 #p^2+q^2 p2q2=159091823893455582874061921154612415267326476512949054956396980727282756099500423604620855106680518280081561541640137584218141965305223222299378169087637728170419037951685924289388185840842033127708318792414241966337535836497572877344724131756911624967860755193905135911797719211253029463146921655068409851682 #p-q p_q=-1028057512734526688756255253926193308887656904740633132866508165158161555923213681694346079000723418169221377228338798941679856716917764591264729224439880 #密文c c=c=16828607056351898528593346827961041518302251064718691085202163294074947863618526294699466675783765349214251854122505153854940088340991317516413847467861967618764774324129650766830916741676747137720500142976165361634620558308099053963312274170652756789297267286419176164695159543581037737967947118601658126996 #使用z3对二元二次方程进行求解 s=z3.Solver() #定义两个变量 p,q=z3.Ints("p q") #添加方程 s.add(p*p+q*q==p2q2) s.add(p-q==p_q) s.add(p>0) arr=[] #校验是否有解 if s.check()==z3.sat:   arr=s.model() print(arr) #得到p,q q = 9418055170543903468662169278295577389409276234772590476185014016803075309886254123445652979884992724665244226628125328356664293030046148360676450649936611 p = 8389997657809376779905914024369384080521619330031957343318505851644913753963040441751306900884269306496022849399786529414984436313128383769411721425496731 #简单验证一下 assert(p*p+q*q==p2q2) assert(p-q==p_q) #rsa基础解密 n=p*q phi=(p-1)*(q-1) d=gmpy2.invert(e,phi) m=pow(c,d,n) flag=long_to_bytes(m) print(flag) 

4

这边可以发现,其实这个方程里面最大的一项是(((y%x)5)%(x%y))2019
这边之前底数大于等于2,那么这一项直接就大于A了。所以这一项必然是0或者1

其次就是y316了。发现当y为84的时候y316就已经大于A了。所以得到y肯定是小于84的

然后最后一项的结果肯定也很小。所以这边基本就确定了y为83了。然后爆破一下x,得到x为2

到这里我们就得到了x*y的一个值。然后我们知道p和q共有一个大因子z,虽然最后是取了一个next_prime,但是我们可以先得到一个大概的值

得到一个z的大概值

import z3 import gmpy2 from Crypto.Util.number import * #公钥e e=11630623 #p^2+q^2 p2q2=159091823893455582874061921154612415267326476512949054956396980727282756099500423604620855106680518280081561541640137584218141965305223222299378169087637728170419037951685924289388185840842033127708318792414241966337535836497572877344724131756911624967860755193905135911797719211253029463146921655068409851682 #p-q p_q=-1028057512734526688756255253926193308887656904740633132866508165158161555923213681694346079000723418169221377228338798941679856716917764591264729224439880 #密文c c=c=16828607056351898528593346827961041518302251064718691085202163294074947863618526294699466675783765349214251854122505153854940088340991317516413847467861967618764774324129650766830916741676747137720500142976165361634620558308099053963312274170652756789297267286419176164695159543581037737967947118601658126996 #使用z3对二元二次方程进行求解 s=z3.Solver() #定义两个变量 p,q=z3.Ints("p q") #添加方程 s.add(p*p+q*q==p2q2) s.add(p-q==p_q) s.add(p>0) arr=[] #校验是否有解 if s.check()==z3.sat:   arr=s.model() print(arr) #得到p,q q = 9418055170543903468662169278295577389409276234772590476185014016803075309886254123445652979884992724665244226628125328356664293030046148360676450649936611 p = 8389997657809376779905914024369384080521619330031957343318505851644913753963040441751306900884269306496022849399786529414984436313128383769411721425496731 #简单验证一下 assert(p*p+q*q==p2q2) assert(p-q==p_q) #rsa基础解密 n=p*q phi=(p-1)*(q-1) d=gmpy2.invert(e,phi) m=pow(c,d,n) flag=long_to_bytes(m) print(flag) 

5

然后写个二分法去求解一下pq的值

import z3 import gmpy2 from Crypto.Util.number import * #公钥e e=11630623 #p^2+q^2 p2q2=159091823893455582874061921154612415267326476512949054956396980727282756099500423604620855106680518280081561541640137584218141965305223222299378169087637728170419037951685924289388185840842033127708318792414241966337535836497572877344724131756911624967860755193905135911797719211253029463146921655068409851682 #p-q p_q=-1028057512734526688756255253926193308887656904740633132866508165158161555923213681694346079000723418169221377228338798941679856716917764591264729224439880 #密文c c=c=16828607056351898528593346827961041518302251064718691085202163294074947863618526294699466675783765349214251854122505153854940088340991317516413847467861967618764774324129650766830916741676747137720500142976165361634620558308099053963312274170652756789297267286419176164695159543581037737967947118601658126996 #使用z3对二元二次方程进行求解 s=z3.Solver() #定义两个变量 p,q=z3.Ints("p q") #添加方程 s.add(p*p+q*q==p2q2) s.add(p-q==p_q) s.add(p>0) arr=[] #校验是否有解 if s.check()==z3.sat:   arr=s.model() print(arr) #得到p,q q = 9418055170543903468662169278295577389409276234772590476185014016803075309886254123445652979884992724665244226628125328356664293030046148360676450649936611 p = 8389997657809376779905914024369384080521619330031957343318505851644913753963040441751306900884269306496022849399786529414984436313128383769411721425496731 #简单验证一下 assert(p*p+q*q==p2q2) assert(p-q==p_q) #rsa基础解密 n=p*q phi=(p-1)*(q-1) d=gmpy2.invert(e,phi) m=pow(c,d,n) flag=long_to_bytes(m) print(flag) 

6

然后基础的RSA解密即可

 

[AFCTF2018]One Secret, Two encryption

https://buuoj.cn/challenges#[AFCTF2018]One Secret, Two encryption

给了一份题面

import z3 import gmpy2 from Crypto.Util.number import * #公钥e e=11630623 #p^2+q^2 p2q2=159091823893455582874061921154612415267326476512949054956396980727282756099500423604620855106680518280081561541640137584218141965305223222299378169087637728170419037951685924289388185840842033127708318792414241966337535836497572877344724131756911624967860755193905135911797719211253029463146921655068409851682 #p-q p_q=-1028057512734526688756255253926193308887656904740633132866508165158161555923213681694346079000723418169221377228338798941679856716917764591264729224439880 #密文c c=c=16828607056351898528593346827961041518302251064718691085202163294074947863618526294699466675783765349214251854122505153854940088340991317516413847467861967618764774324129650766830916741676747137720500142976165361634620558308099053963312274170652756789297267286419176164695159543581037737967947118601658126996 #使用z3对二元二次方程进行求解 s=z3.Solver() #定义两个变量 p,q=z3.Ints("p q") #添加方程 s.add(p*p+q*q==p2q2) s.add(p-q==p_q) s.add(p>0) arr=[] #校验是否有解 if s.check()==z3.sat:   arr=s.model() print(arr) #得到p,q q = 9418055170543903468662169278295577389409276234772590476185014016803075309886254123445652979884992724665244226628125328356664293030046148360676450649936611 p = 8389997657809376779905914024369384080521619330031957343318505851644913753963040441751306900884269306496022849399786529414984436313128383769411721425496731 #简单验证一下 assert(p*p+q*q==p2q2) assert(p-q==p_q) #rsa基础解密 n=p*q phi=(p-1)*(q-1) d=gmpy2.invert(e,phi) m=pow(c,d,n) flag=long_to_bytes(m) print(flag) 

8

这边首先把两份公钥文件的n,e取出来看了一下

import z3 import gmpy2 from Crypto.Util.number import * #公钥e e=11630623 #p^2+q^2 p2q2=159091823893455582874061921154612415267326476512949054956396980727282756099500423604620855106680518280081561541640137584218141965305223222299378169087637728170419037951685924289388185840842033127708318792414241966337535836497572877344724131756911624967860755193905135911797719211253029463146921655068409851682 #p-q p_q=-1028057512734526688756255253926193308887656904740633132866508165158161555923213681694346079000723418169221377228338798941679856716917764591264729224439880 #密文c c=c=16828607056351898528593346827961041518302251064718691085202163294074947863618526294699466675783765349214251854122505153854940088340991317516413847467861967618764774324129650766830916741676747137720500142976165361634620558308099053963312274170652756789297267286419176164695159543581037737967947118601658126996 #使用z3对二元二次方程进行求解 s=z3.Solver() #定义两个变量 p,q=z3.Ints("p q") #添加方程 s.add(p*p+q*q==p2q2) s.add(p-q==p_q) s.add(p>0) arr=[] #校验是否有解 if s.check()==z3.sat:   arr=s.model() print(arr) #得到p,q q = 9418055170543903468662169278295577389409276234772590476185014016803075309886254123445652979884992724665244226628125328356664293030046148360676450649936611 p = 8389997657809376779905914024369384080521619330031957343318505851644913753963040441751306900884269306496022849399786529414984436313128383769411721425496731 #简单验证一下 assert(p*p+q*q==p2q2) assert(p-q==p_q) #rsa基础解密 n=p*q phi=(p-1)*(q-1) d=gmpy2.invert(e,phi) m=pow(c,d,n) flag=long_to_bytes(m) print(flag) 

9

测试发现n1 n2有公约数。这边也是印证了题面给的懒得生成素数,所以共用了其中一个素数。这边直接gcd求解公约数即可。
然后分解出p q进行一个基础的RSA解密

 

[INSHack2019]Yet Another RSA Challenge – Part 1

https://buuoj.cn/challenges#[INSHack2019]Yet Another RSA Challenge – Part 1

题面很清晰,就是一个RSA加密,然后给了公钥n的其中有一个因子p,但是p是16进制表示的,最后输出的时候把9F替换成了FC。那么我们在给的output.txt文件中得到p的时候,其中的FC的位置就有可能为9F,亦有可能为FC。这边写个脚本爆破一下求解即可。

 

[GUET-CTF2019]NO SOS

https://buuoj.cn/challenges#[GUET-CTF2019]NO SOS

首先发现一个很类似摩斯电码的东西。但是题目也写了no sos,所以应该不是莫斯电码。并且也发现没有间隔。与之类似的有可能是2进制的表示或者培根密码。这边将.转为A将—转为B后发现位数刚好为5的倍数。

BUUCTF平台Crytpo部分Writeup - 安全客,安全资讯平台

培根密码解密得到flag

 

[UTCTF2020]basic-crypto

https://buuoj.cn/challenges#[UTCTF2020]basic-crypto

这题附件里面表示的就很明显,每一组都是8位二进制。直接转ascii字符即可。

 

[ACTF新生赛2020]crypto-rsa3

https://buuoj.cn/challenges#[ACTF新生赛2020]crypto-rsa3

可以发现就是最基础的RSA加密,其中p q为相邻的素数。直接yafu分解即可。

BUUCTF平台Crytpo部分Writeup - 安全客,安全资讯平台

然后基础RSA解密即可

题解exp如下:

get buf unsign s[256] get buf t[256] we have key:whoami we have flag:???????????????????????????????? for i:0 to 256     set s[i]:i for i:0 to 256     set t[i]:key[(i)mod(key.lenth)] for i:0 to 256     set j:(j+s[i]+t[i])mod(256)         swap:s[i],s[j] for m:0 to 38     set i:(i + 1)mod(256)     set j:(j + S[i])mod(256)     swap:s[i],s[j]     set x:(s[i] + (s[j]mod(256))mod(256))     set flag[m]:flag[m]^s[x] fprint flagx to file 

3

 

[MRCTF2020]babyRSA

https://buuoj.cn/challenges#[MRCTF2020]babyRSA

题目脚本比较长,一步一步分析。

get buf unsign s[256] get buf t[256] we have key:whoami we have flag:???????????????????????????????? for i:0 to 256     set s[i]:i for i:0 to 256     set t[i]:key[(i)mod(key.lenth)] for i:0 to 256     set j:(j+s[i]+t[i])mod(256)         swap:s[i],s[j] for m:0 to 38     set i:(i + 1)mod(256)     set j:(j + S[i])mod(256)     swap:s[i],s[j]     set x:(s[i] + (s[j]mod(256))mod(256))     set flag[m]:flag[m]^s[x] fprint flagx to file 

4

首先,在主函数里面可以看到。其实这就是一个RSA加密。无非是_P和_Q都是带入了两个函数里面求解的。

get buf unsign s[256] get buf t[256] we have key:whoami we have flag:???????????????????????????????? for i:0 to 256     set s[i]:i for i:0 to 256     set t[i]:key[(i)mod(key.lenth)] for i:0 to 256     set j:(j+s[i]+t[i])mod(256)         swap:s[i],s[j] for m:0 to 38     set i:(i + 1)mod(256)     set j:(j + S[i])mod(256)     swap:s[i],s[j]     set x:(s[i] + (s[j]mod(256))mod(256))     set flag[m]:flag[m]^s[x] fprint flagx to file 

5

_Q这个参数的话可以看到我们已知Q_1、Q_2、sub_Q就可以直接求解。

get buf unsign s[256] get buf t[256] we have key:whoami we have flag:???????????????????????????????? for i:0 to 256     set s[i]:i for i:0 to 256     set t[i]:key[(i)mod(key.lenth)] for i:0 to 256     set j:(j+s[i]+t[i])mod(256)         swap:s[i],s[j] for m:0 to 38     set i:(i + 1)mod(256)     set j:(j + S[i])mod(256)     swap:s[i],s[j]     set x:(s[i] + (s[j]mod(256))mod(256))     set flag[m]:flag[m]^s[x] fprint flagx to file 

6

然后看到gen_p()这个函数

get buf unsign s[256] get buf t[256] we have key:whoami we have flag:???????????????????????????????? for i:0 to 256     set s[i]:i for i:0 to 256     set t[i]:key[(i)mod(key.lenth)] for i:0 to 256     set j:(j+s[i]+t[i])mod(256)         swap:s[i],s[j] for m:0 to 38     set i:(i + 1)mod(256)     set j:(j + S[i])mod(256)     swap:s[i],s[j]     set x:(s[i] + (s[j]mod(256))mod(256))     set flag[m]:flag[m]^s[x] fprint flagx to file 

7

这边我们要求解p,其实就相当于求解一个RSA。n是由17个连续的质数作为因子的。然后我们得到了其中的第十个也就是下标为9的因子。那么我们通过sympy.prevprime和sympy.nextprime去求解得到所有的质数进行RSA基础解密得到p,然后取p的下一个质数作为_P即可。

 

[WUSTCTF2020]dp_leaking_1s_very_d@angerous

题意很明显,是dp泄露。

get buf unsign s[256] get buf t[256] we have key:whoami we have flag:???????????????????????????????? for i:0 to 256     set s[i]:i for i:0 to 256     set t[i]:key[(i)mod(key.lenth)] for i:0 to 256     set j:(j+s[i]+t[i])mod(256)         swap:s[i],s[j] for m:0 to 38     set i:(i + 1)mod(256)     set j:(j + S[i])mod(256)     swap:s[i],s[j]     set x:(s[i] + (s[j]mod(256))mod(256))     set flag[m]:flag[m]^s[x] fprint flagx to file 

9

这种参数是为了让解密的时候更快速产生的


Notice: Undefined variable: canUpdate in /var/www/html/wordpress/wp-content/plugins/wp-autopost-pro/wp-autopost-function.php on line 51