点击蓝字,关注我们
日期:2024年12月16号
作者:jgk01
介绍:泰山杯一道c组密码题。
0x00 前言
分享一道泰山杯c
组的密码题,场内出了前半段,后半段当时没想到,结束以后复盘题目的时候做出来了,分享一下做题思路。
0x01 题目
题目脚本:
import gmpy2
from Crypto.Util.number import *
from secret import flag
flag = long_to_bytes(flag1) + long_to_bytes(flag2)
p1 = getPrime(1024)
q1 = getPrime(1024)
p2 = getPrime(512)
q2 = getPrime(512)
n1 = p1 * q1
n2 = p2 * q2
e = 65537
hint = pow(1024*p1 - 197*q1, n1-p1-q1, n1)
c1 = pow(flag1,e,n1)
c2 = pow(flag2,p2,n2)
c3 = pow(flag2,q2,n2)
print(n1)
print(c1)
print(hint)
print(n2)
print(c2)
print(c3)
"9993095174491861722136903748298297709412902279302520139233078581728955341092359812576382945917721030218891721862866727091533422540383093057822489980507850401035624139838801700503555063600665154749088425482688189748265222941861354594269322865779044794362726063016847670325638897242582767816160447735248702211385253328830024633364023243711204481171987244862131950207806849919784142585009984248253708502464629068311983990934631001376844711337084543784145584247535612255122616680834143198711074949565393352718402194083696074632410955065738514371934182994346662524587105003492788531230255604154146997461875549449435352613
6491645795573717294817971718119197425888563460820052740042921250836387737541767330028774831922632421591644289695852367880360345021855890270818764603553059175778082898940349441767306666270179299410995824536010640225877826068254687357489965894361406719928580541539474658009461746707109054905195663038248896454574912330193397108400150873415269829088168747464920289541648618753195863950514346080764233087980073988745755744014193366652973830004993794412657941051163712910568005366724882942741839047940165371669483394624453374613262475711525946466493513267914409465206131976599259672108557387739801639544073866274784356977
7529903766593789743203875105811805590623403238134744358069916057185419385329205467611860033764294674989772542073704729511422796271394307069883815525621236738350503410660419587759413356127716975834456703488074104519089921283629702825586315080664842218066710642563785449929868455613767740965885508578869787571827611317007683871913598070468433776708525736366268459334720410018972959397204686070137997198646315659212528936425343257899533854439580019931764644057337591761642720389438391799239426602950793694656030045650827200916728845532896403874871702260897080640969380062568182811783431664452646773160530412795171867089
48896533771865940172408482269495841213573804280667769321916763781170714489171413360830436903902514764894457203162974796537361136022041750488725760741233431888006422130065207427205955432477233464492319581924197421892619323245763188452030765972686031120042342088391557818361164377353080215440224398615708457979
27761925140718394623677431041293505328490905505559515102893219919578636302158822719530123006546241820313512673447588589579358875282500865927759284093905467144664009117201326815763043390222260499908901633928587645583844675618927963145554745146887296951205970215420052456076089002696712924617638209737744510870
43715978264074536089998502714696599120075311927007160736414403690767258228182302094211457982694002328282904586924034286237416150152638683498883249396452385100627664897623012777387817004904719999424014002347489403727189155676320600693899241470529282521488819279690007581921187455397776348749923718168574660987"
题目很明显是把flag
分成了两段,所以是要解两个题。
0x02 第一段求解
第一段比较简单,给了hint
,我们可以发现这个:
开方以后我们两式相加得到2048
倍的p1
,这样p1
和q1
就出来了,然后得到flag1
。
import gmpy2
from Crypto.Util.number import *
n1=9993095174491861722136903748298297709412902279302520139233078581728955341092359812576382945917721030218891721862866727091533422540383093057822489980507850401035624139838801700503555063600665154749088425482688189748265222941861354594269322865779044794362726063016847670325638897242582767816160447735248702211385253328830024633364023243711204481171987244862131950207806849919784142585009984248253708502464629068311983990934631001376844711337084543784145584247535612255122616680834143198711074949565393352718402194083696074632410955065738514371934182994346662524587105003492788531230255604154146997461875549449435352613
c1=6491645795573717294817971718119197425888563460820052740042921250836387737541767330028774831922632421591644289695852367880360345021855890270818764603553059175778082898940349441767306666270179299410995824536010640225877826068254687357489965894361406719928580541539474658009461746707109054905195663038248896454574912330193397108400150873415269829088168747464920289541648618753195863950514346080764233087980073988745755744014193366652973830004993794412657941051163712910568005366724882942741839047940165371669483394624453374613262475711525946466493513267914409465206131976599259672108557387739801639544073866274784356977
hint=7529903766593789743203875105811805590623403238134744358069916057185419385329205467611860033764294674989772542073704729511422796271394307069883815525621236738350503410660419587759413356127716975834456703488074104519089921283629702825586315080664842218066710642563785449929868455613767740965885508578869787571827611317007683871913598070468433776708525736366268459334720410018972959397204686070137997198646315659212528936425343257899533854439580019931764644057337591761642720389438391799239426602950793694656030045650827200916728845532896403874871702260897080640969380062568182811783431664452646773160530412795171867089
n2=48896533771865940172408482269495841213573804280667769321916763781170714489171413360830436903902514764894457203162974796537361136022041750488725760741233431888006422130065207427205955432477233464492319581924197421892619323245763188452030765972686031120042342088391557818361164377353080215440224398615708457979
c2=27761925140718394623677431041293505328490905505559515102893219919578636302158822719530123006546241820313512673447588589579358875282500865927759284093905467144664009117201326815763043390222260499908901633928587645583844675618927963145554745146887296951205970215420052456076089002696712924617638209737744510870
c3=43715978264074536089998502714696599120075311927007160736414403690767258228182302094211457982694002328282904586924034286237416150152638683498883249396452385100627664897623012777387817004904719999424014002347489403727189155676320600693899241470529282521488819279690007581921187455397776348749923718168574660987
e = 65537
m1=gmpy2.invert(hint,n1)
sub=m1
qiuhe=sub**2+((4*1024*197)*n1)
qiuhe2=gmpy2.iroot(qiuhe, 2)[0]
p=(m1+qiuhe2)//2048
q=n1//p
d = gmpy2.invert(e,(p-1)*(q-1))
flag1 = pow(c1,d,n1)
print(long_to_bytes(int(flag1)))
0x03 第二段求解
然后再来处理flag2
,这里需要用到coppersmith
解flag2
。
我们的已知条件是:
两式相乘:
利用flag1
的长度来确定一下flag2
的长度,最后总结代码:
import gmpy2
from Crypto.Util.number import *
n1=9993095174491861722136903748298297709412902279302520139233078581728955341092359812576382945917721030218891721862866727091533422540383093057822489980507850401035624139838801700503555063600665154749088425482688189748265222941861354594269322865779044794362726063016847670325638897242582767816160447735248702211385253328830024633364023243711204481171987244862131950207806849919784142585009984248253708502464629068311983990934631001376844711337084543784145584247535612255122616680834143198711074949565393352718402194083696074632410955065738514371934182994346662524587105003492788531230255604154146997461875549449435352613
c1=6491645795573717294817971718119197425888563460820052740042921250836387737541767330028774831922632421591644289695852367880360345021855890270818764603553059175778082898940349441767306666270179299410995824536010640225877826068254687357489965894361406719928580541539474658009461746707109054905195663038248896454574912330193397108400150873415269829088168747464920289541648618753195863950514346080764233087980073988745755744014193366652973830004993794412657941051163712910568005366724882942741839047940165371669483394624453374613262475711525946466493513267914409465206131976599259672108557387739801639544073866274784356977
hint=7529903766593789743203875105811805590623403238134744358069916057185419385329205467611860033764294674989772542073704729511422796271394307069883815525621236738350503410660419587759413356127716975834456703488074104519089921283629702825586315080664842218066710642563785449929868455613767740965885508578869787571827611317007683871913598070468433776708525736366268459334720410018972959397204686070137997198646315659212528936425343257899533854439580019931764644057337591761642720389438391799239426602950793694656030045650827200916728845532896403874871702260897080640969380062568182811783431664452646773160530412795171867089
n2=48896533771865940172408482269495841213573804280667769321916763781170714489171413360830436903902514764894457203162974796537361136022041750488725760741233431888006422130065207427205955432477233464492319581924197421892619323245763188452030765972686031120042342088391557818361164377353080215440224398615708457979
c2=27761925140718394623677431041293505328490905505559515102893219919578636302158822719530123006546241820313512673447588589579358875282500865927759284093905467144664009117201326815763043390222260499908901633928587645583844675618927963145554745146887296951205970215420052456076089002696712924617638209737744510870
c3=43715978264074536089998502714696599120075311927007160736414403690767258228182302094211457982694002328282904586924034286237416150152638683498883249396452385100627664897623012777387817004904719999424014002347489403727189155676320600693899241470529282521488819279690007581921187455397776348749923718168574660987
e = 65537
m1=gmpy2.invert(hint,n1)
sub=m1
qiuhe=sub**2+((4*1024*197)*n1)
qiuhe2=gmpy2.iroot(qiuhe, 2)[0]
p=(m1+qiuhe2)//2048
q=n1//p
d = gmpy2.invert(e,(p-1)*(q-1))
flag1 = pow(c1,d,n1)
print(long_to_bytes(int(flag1)))
flag1=long_to_bytes(int(flag1))
n = n2
P = c2
Q = c3
PR.<m> = PolynomialRing(Zmod(n))
f = P*Q-m^2-m*(P-m+Q-m)
f = f.monic()
m = f.small_roots(X=2^(len(flag1)*2*8), beta=0.7)
print(m)
m=148183572893420514528542102387605309781817285502077
flag2 = long_to_bytes(int(m))
print(flag1+flag2)
0x04 后记
时间不是很足,还有做其他方向题目所以没时间看全部的题,等有时间再做做剩下的题。
免责声明:本文仅供安全研究与讨论之用,严禁用于非法用途,违者后果自负。
点此亲启
原文始发于微信公众号(宸极实验室):『CTF』一道题目赛后分享
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论