CTF真题|强网先锋辅助"

admin 2026-10-22 08:11:47 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

cover_image

CTF真题|强网先锋辅助

原创

安全先锋
安全先锋

网安淬锋研习社

2026年6月2日 15:15
山西

在小说阅读器读本章

去阅读

题目描述:

下载题目附件后,得到一段python代码(附件不带注释,下面注释为后期添加):

flag=open(\"flag\",\"rb\").read()  // 只读模式读取内容
from Crypto.Util.number import getPrime,bytes_to_long                   // 导入两个工具函数 getPrime()和bytes_to_long()p=getPrime(1024)           //getPrime()生成指定位数的大素数q=getPrime(1024)e=65537n=p*qm=bytes_to_long(flag)   //未知明文flag,bytes_to_long()把字符串转换成超大整数c=pow(m,e,n)             //加密公式c=m^e mod nprint c,e,n
p=getPrime(1024)             //关键漏洞:p重新生成,但是q未变,e未变e=65537n=p*q                         //两次计算n共用了一个qm=bytes_to_long(\"1\"*32)       //已知明文32个1c=pow(m,e,n)print c,e,n
'''output:              //输出中包含密文+公钥(e,n)2482083893746618248544426737023750400124543452082436334398504986023501710639402060949106693279462896968839029712099336235976221571564642900240827774719199533124053953157919850838214021934907480633441577316263853011232518392904983028052155862154264401108124968404098823946691811798952747194237290581323868666637357604693015079007555594974245559555518819140844020498487432684946922741232053249894575417796067090655122702306134848220257943297645461477488086804856018323986796999103385565540496534422406390355987976815450744535949785073009043007159496929187184338592859040917546122343981520508220332785862546608841127597 65537 149670300599751149502953998741850470537365878801279905420357652014257793424306625177650632587846858681070667894757471802447113526464697767329385446415838423137918729863575044621849240752274334986314232891879883514756667851908542103895875949754560649846119904611266843010862415329152673116751641902134742453110196236548659378516535328709654234745553482398580215515896501696024394238411606987933381152042381400857386808833134335740602436000285006008246243584734030595975938914121793991658136225129012633802995610196247414887793670193897757865472920653528850072242395817769758923853644464461856429391372875199459748077273829060039572042737496679186881067950328956133163629908872348108160129550437697677150599483923925798224328175594483217938833520220087230303470138525970468915511111320396185482564783975435346354440035776909781158407636044986403819840648379609630039348895415045723208843631191252142600667607807479954194447237061080618370787672720344741413537975922184859333432197766580150534457001196765621678659952108010596273244230812327182786329760844037149719587269632133595149294067490955644893402708720284179715002149224068928828656515326446881791228638008572889331511945042911372915003805505412099102954073299010951896955362470 65537 14624662628725820618622370803948630854094687814338334827462870357582795291844925274690253604919535785934208081825425541536057550227048399837243392490762167733083030368221240764693694321150104306044125934201699430146970466657410999261630825931178731857267599750324918610790098952520113593130245010530961350592735239454337631927669542026935873535964487595433984902529960726655481696404006628917922241666148082741874033756970724357470539589848548704573091633917869387239324447730587545472564561496724882799495186768858324490838169123077051890332313671220385830444331578674338014080959653201802476516237464651809255679979'''

一定要理解以上代码,然后进行解题

解题思路:

在上述代码中存在致命缺陷,两次加密共用q,利用gcd(n1,n2)=q公式求解出q,因为n=p\*q,p=n/q,从而得到了p和q,根据RSA算法,求出私钥,再对flag密文进行解密,得到flag明文。

解题代码:

import libnum        //把大整数转化为字符串(取得flag)import gmpy2        // 处理超大数运算t1 = '2482083893746618248544426737023750400124543452082436334398504986023501710639402060949106693279462896968839029712099336235976221571564642900240827774719199533124053953157919850838214021934907480633441577316263853011232518392904983028052155862154264401108124968404098823946691811798952747194237290581323868666637357604693015079007555594974245559555518819140844020498487432684946922741232053249894575417796067090655122702306134848220257943297645461477488086804856018323986796999103385565540496534422406390355987976815450744535949785073009043007159496929187184338592859040917546122343981520508220332785862546608841127597 65537 14967030059975114950295399874185047053736587880127990542035765201425779342430662517765063258784685868107066789475747180244711352646469776732938544641583842313791872986357504462184924075227433498631423289187988351475666785190854210389587594975456064984611990461126684301086241532915267311675164190213474245311019623654865937851653532870965423474555348239858021551589650169602439423841160698793338115204238140085738680883313433574060243600028500600824624358473403059597593891412179399165813622512901263380299561019624741488779367019389775786547292065352885007224239581776975892385364446446185642939137287519945974807727't2 = '3829060039572042737496679186881067950328956133163629908872348108160129550437697677150599483923925798224328175594483217938833520220087230303470138525970468915511111320396185482564783975435346354440035776909781158407636044986403819840648379609630039348895415045723208843631191252142600667607807479954194447237061080618370787672720344741413537975922184859333432197766580150534457001196765621678659952108010596273244230812327182786329760844037149719587269632133595149294067490955644893402708720284179715002149224068928828656515326446881791228638008572889331511945042911372915003805505412099102954073299010951896955362470 65537 14624662628725820618622370803948630854094687814338334827462870357582795291844925274690253604919535785934208081825425541536057550227048399837243392490762167733083030368221240764693694321150104306044125934201699430146970466657410999261630825931178731857267599750324918610790098952520113593130245010530961350592735239454337631927669542026935873535964487595433984902529960726655481696404006628917922241666148082741874033756970724357470539589848548704573091633917869387239324447730587545472564561496724882799495186768858324490838169123077051890332313671220385830444331578674338014080959653201802476516237464651809255679979'
// split(' ')是将t1,t2按空格将长串数字切成三段r1 = t1.split(' ')r2 = t2.split(' ')
e = 65537         c1 = r1[0]           //c1表示flag的密文c2 = r2[0]           //c2表示32个1的密文n1 = r1[2]           //n1表示第一个公钥模数n2 = r2[2]           //n2表示第二个公钥模数n1 = gmpy2.mpz(n1)    //把n1转换成整数n2 = gmpy2.mpz(n2)q = gmpy2.gcd(n1, n2)    //求出qp1 = n1 // q              //求出p1,p2p2 = n2 // qeuler1 = (p1 - 1) * (q - 1)euler2 = (p2 - 1) * (q - 1)  // 求出欧拉函数d1 = gmpy2.invert(e, euler1)   //已知所有条件,求私钥dm = pow(int(c1), d1, n1)  //进行解密 m=c^d mod n1r = libnum.n2s(int(m))   //将大整数还原为字符串得到flagprint(r)
-------------flag{i_am_very_sad_233333333333}----------------------

知识点总结:

  • RSA加解密过程:

1、随机选取两个不相等的大素数p、q

2、计算模数n=p\*q,并且求出欧拉函数φ(n)=(p−1)(q−1)

3、选取公钥指数e,要满足:

1<e<φ(n),    gcd(e,φ(n))=1。

公钥即为(e,n)

4、求解私钥 d:

d 是 e 在模 φ(n) 下的乘法逆元:e⋅d≡1(modφ(n))即:ed=k⋅φ(n)+1        ,k为整数。私钥即为(d,p,q,φ(n))

5、加密运算(明文→密文)

6、解密密运算(密文→明文)

其中c为密文,m为明文

  • RSA安全本质:

攻击者想要拿到私钥d,必须求φ(n),必须分解n=p⋅q。大数乘积n在现代算力下无法快速质因数分解;一旦n被分解(共用素因子、小素数、小指数等漏洞),RSA 直接被破解。

  • 小例子:

  • 代码中的bytes\_to\_long()和gmpy2.mpz()

在加密时,需要将flag明文字符串转化为整数来进行加密,使用了bytes\_to\_long()函数实现。而在解题代码中,将密文字符串使用gmpy2.mpz()转化为了大整数进行解密。要注意两个函数的区别,bytes\_to\_long实现的是编码转换,是将字节转换为数字,是将字符的ASCII码拼在一起,只接受字节;gmpy2.mpz()是将字符串数字转换为真正的整数。以下用更直观的例子来区分两者:

n1 = \"123456789\"      # 这是 字符串!内容是数字n1 = gmpy2.mpz(n1)    # 正确 → 转成数字 12345678

n1 = \"123456789\"n1 = bytes_to_long(n1)print(n1)               //报错--------------------------------------------------n2 = b\"123456789\"        //b''代表字节n2 = bytes_to_long(n2)print(n2)               //正常运行输出为907507751940624169017,将字节转化为数字

CTF真题|强网先锋辅助" 网络安全文章

CTF真题|强网先锋辅助"

该文档分析一道CTF强网先锋题目中的RSA加密漏洞:两次加密共用素数q导致n1和n2存在公因子,通过gcd(n1,n2)可分解模数获取私钥。解题过程展示如何利用gmpy2库计算q、p及欧拉函数,最终解密得到flag{i_am_very_sad_233333333333},并总结RSA加解密流程与素数重用风险。
梅涅劳斯定理(Menelaus)" 网络安全文章

梅涅劳斯定理(Menelaus)"

文档介绍梅涅劳斯定理的几何性质与应用背景,指出该定理虽未列入部分教材但可能出现在中考中。作者对比不同地区中考难度,推荐使用正弦定理进行简洁证明,强调定理的轮换对称性并澄清无需区分点位置。同时说明逆定理成立的条件及证明方法。
别扫整个内网了,用TTL追踪偷看子网结构更快" 网络安全文章

别扫整个内网了,用TTL追踪偷看子网结构更快"

本文介绍渗透测试中利用TTL追踪技术快速探测内网拓扑的方法。通过Screamer工具将探测目标从数万压缩至数百,结合ICMP、TCP、UDP多协议绕过过滤,一分钟内生成网络拓扑草图。实测显示该方法可缩减128倍扫描量,但存在网关预测偏差、严格过滤失效等局限性。
简单分析AKSK利用工具投毒事件" 网络安全文章

简单分析AKSK利用工具投毒事件"

文档分析了一起针对云安全工具的供应链投毒事件,攻击者在GitHub项目accesskey_tools中植入后门代码,通过仿冒依赖包窃取用户AK/SK密钥。关键发现包括攻击者自2023年8月起在多平台同步推广恶意项目,并存在第二个疑似投毒项目jumpserver_decrypto。建议安全从业者使用AI辅助代码审计,警惕第三方依赖风险。
评论:0   参与:  0