ctfshow摆烂杯
crypto
真就一段时间不做pwn,只会做密码了😢寒假一定好好学习pwn
有一说一虽然题目不难,但都还挺有意思
1.春哥VS曾哥

一开始还想简单了,以为直接取n=bignumber*x+y就行了,跑的时候发现有时可以有时不行,才发现这样赋值对(x,y)的大小有要求需要x>y才能通过
后面就具体写写式子计算计算就可以构造出x<y的n(等于的直接没想了反正概率不大)
m=y//x n=1/2(y+mx)
验证一下:
∵(m+1)x>y>mx
y≡1/2(y-mx) mod(n)
n≡1/2(y-mx) mod(x)
满足条件
代码如下:
from pwn import *
p=remote('pwn.challenge.ctf.show',28010)
for i in range(233):
p.recvuntil('(x, y) = (')
a=int(p.recvuntil(',')[:-1],10)
p.recvuntil(' ')
b=int(p.recvuntil(')')[:-1],10)
if(a>b):
n=pow(10,20)*a+b
p.sendlineafter('n = ',str(n))
else:
m=b//a
n=b//2+m*a//2
p.sendlineafter('n = ',str(n))
p.interactive()
2.比烂为主
from hashlib import sha256
from Crypto.Util.number import *
from secret import flag, x
never_gonna_give_you_up = getPrime(128)
never_gonna_let_you_down = getPrime(128)
never_gonna_run_around_and_desert_you = getPrime(101)
def sign(message, public_key, private_key, n):
p, q, g, y = public_key
x = private_key
k = pow(n * never_gonna_give_you_up + never_gonna_let_you_down, never_gonna_run_around_and_desert_you, q)
r = pow(g, k, p) % q
h = int(sha256(message).digest().hex(),16)
s = (h + x * r) * inverse(k, q) % q
return (r, s)
def verify(message, signature, public_key):
p, q, g, y = public_key
r, s = signature
r %= q
s %= q
assert (r != 0 and s != 0), "NAIVE!"
w = inverse(s,q)
h = int(sha256(message).digest().hex(),16)
u1 = (h * w) % q
u2 = (r * w) % q
v = ((pow(g,u1,p) * pow(y,u2,p)) % p) % q
return v == r
REAL_SHIT = b"I'm a lazy dog!"
BANNER = """
+-------------+
| * * * |
| * * * |
| * * * * |
| * ** ***** |
| * * |
| * * |
| * * |
| * ***** |
| * |
| * * |
| * * |
| * ******* |
+-------------+
赛事预告:
比赛名称:ctfshow 摆烂杯
题目范围:web pwn re misc crypto osint
题目难度:比烂为主
出题奖励:小份零食礼包
比赛奖励:No.1 巨型零食大礼包
比赛时间:2021年12月24日(周五) 18时整
比赛时长:48小时
比赛地址:https://ctf.show/challenges
投稿邮箱:ctfshow@163.com
"""
MENU = """
[S]ign a message
[V]erify a signature
[G]et flag
[Q]uit
"""
p = 5830410037749547775189245525168918395747363340469807269291718742183814993936817592735262715915879602282249783993968023975099219221323072938605595470459623163126514593995334867344581974290718516752259378064523160010731630848372096789829688620977534625418042717783152391320231563441611047615987945411947074380827751513951208800076656880887541345913934590496332433036743826067033700224359048313855854960843342719268606487143700859456518149623446870445628489881562349440391974416618715512757656830149401253698416423920563660593867251944686917357283228838292330248455750631794980962909862340357643390200563598481041665739
q = 89879135382578731346673843691182780491200282741605331154983882460848740288943
g = 3036574992920223772250338584313974966892939032538629708046720668444956071054307320204635708292091452534235575158505387612798672846101638873982278287387803438764912775944168478521204544925514050450544802147701711167722506267136001245250862233107197865899458167569355135488221182759479681328082327449364576899530469589987892834104390908886440362267402148929694884940168387414269571079309037803880592265516128051687209930799213552028072675347732311504313031872660559576780702919912483902285590354850230968523319609587926112057010327421097518688875811681494733985588983708383345905914523321763478009082916547027506887449
y = 1825339742796901157845239480003358145893636112094511961320205592521669110199034249225428796440245568576051889797537933524337634539711627544578147191029774138174397458079191481625614553664312018055538582991391573222810351262803931151231577005324571986636722469699945585083164013784423319189695442707353395949982699652598353850119461071539420862137096857945164274259294065006699885585311394740730361072189899926530358440241322938460800796822710277137842465412412084712930885209474457802901282885758112884074516660002811808647126713109949943348743131316285896353841289415789801440552082051529082422665008767987865894918
assert (p-1) % q == 0
assert pow(g, x, p) == y
public_key = (p,q,g,y)
private_key = x
used_k = []
def main():
try:
print(BANNER)
print("I... I, I like the REAL SHIT!")
print("U... U, U like the REAL SHIT!")
for i in range(5):
print(MENU)
choice = input(">>> ").upper()
if choice == 'S':
print("Because I'm very nice, I decide to give you an opportunity to pick the value of n.")
n = input("n = ")
if len(n) > 16:
print("Too long, too simple!")
return
n = bytes_to_long(n.encode("utf-8"))
if n == 0:
print("Sometimes naive!")
return
if n in used_k:
print("You always make big news!")
return
used_k.append(n)
message = input("message = ")
message = message.encode("utf-8")
if message == REAL_SHIT:
print("Never gonna give you up!")
return
signature = sign(message, public_key, private_key, n)
print("Here is your signature:")
print(signature)
elif choice == 'V':
message = input("message = ")
message = message.encode("utf-8")
r = int(input("r = "))
s = int(input("s = "))
signature = (r, s)
if verify(message, signature, public_key):
print("Verification AOLIGEI!")
else:
print("Verification GG!")
elif choice == 'G':
r = int(input("r = "))
s = int(input("s = "))
signature = (r, s)
if verify(REAL_SHIT, signature, public_key):
print("AOLIGEI! Here is you flag.")
print(flag)
break
elif choice == 'Q':
print("886!")
break
else:
raise ValueError
except:
print("Never gonna let you down!")
if __name__ == "__main__":
main()
经典DSA,构造重用k的情形把私钥解出来,再去计算对应的ban掉的字符串的签名
代码如下:
import string
import gmpy2
from Crypto.Util.number import *
from pwn import *
p = remote('pwn.challenge.ctf.show',28109)
c1 = 89879135382578731346673843691182780491200282741605331154983882460848740288944
c1 = str(long_to_bytes(c1).decode("utf-8"))
c2 = 1
c2 = str(long_to_bytes(c2).decode("utf-8"))
p1 = 5830410037749547775189245525168918395747363340469807269291718742183814993936817592735262715915879602282249783993968023975099219221323072938605595470459623163126514593995334867344581974290718516752259378064523160010731630848372096789829688620977534625418042717783152391320231563441611047615987945411947074380827751513951208800076656880887541345913934590496332433036743826067033700224359048313855854960843342719268606487143700859456518149623446870445628489881562349440391974416618715512757656830149401253698416423920563660593867251944686917357283228838292330248455750631794980962909862340357643390200563598481041665739
q = 89879135382578731346673843691182780491200282741605331154983882460848740288943
g = 3036574992920223772250338584313974966892939032538629708046720668444956071054307320204635708292091452534235575158505387612798672846101638873982278287387803438764912775944168478521204544925514050450544802147701711167722506267136001245250862233107197865899458167569355135488221182759479681328082327449364576899530469589987892834104390908886440362267402148929694884940168387414269571079309037803880592265516128051687209930799213552028072675347732311504313031872660559576780702919912483902285590354850230968523319609587926112057010327421097518688875811681494733985588983708383345905914523321763478009082916547027506887449
y = 1825339742796901157845239480003358145893636112094511961320205592521669110199034249225428796440245568576051889797537933524337634539711627544578147191029774138174397458079191481625614553664312018055538582991391573222810351262803931151231577005324571986636722469699945585083164013784423319189695442707353395949982699652598353850119461071539420862137096857945164274259294065006699885585311394740730361072189899926530358440241322938460800796822710277137842465412412084712930885209474457802901282885758112884074516660002811808647126713109949943348743131316285896353841289415789801440552082051529082422665008767987865894918
p.sendline('S')
p.sendline(c1)
p.sendline('hash')
p.recvuntil('Here is your signature:\n')
r1 = int(p.recvuntil(',')[1:-1])
p.recvuntil(' ')
s1 = int(p.recvuntil('\n')[:-2])
p.sendline('S')
p.sendline(c2)
p.sendline('hashhash')
p.recvuntil('Here is your signature:\n')
r2 = int(p.recvuntil(',')[1:-1])
p.recvuntil(' ')
s2 = int(p.recvuntil('\n')[:-2])
print(r1)
print(r2)
h1 = int(hashlib.sha256(b'hash').digest().hex(), 16)
h2 = int(hashlib.sha256(b'hashhash').digest().hex(), 16)
h3 = int(hashlib.sha256(b'I\'m a lazy dog!').digest().hex(), 16)
k = (h1 - h2) * gmpy2.invert(s1 - s2, q) % q
x = (s1 * k - h1) * gmpy2.invert(r1, q) % q
s3 = (h3 + x * r1) * gmpy2.invert(k, q) % q
p.sendline('G')
print(r1)
print(s3)
p.sendline(str(r1))
p.sendline(str(s3))
p.interactive()
3.easy-peasy
from Crypto.Util.number import *
from secret import flag
p = getPrime(1024)
q = getPrime(1024)
n = p * q
print(f'n = {n}')
l = len(flag)
assert(l == 86)
m = bytes_to_long(b'\x00' * (l - 1) + flag + b'\x00' * (l - 2))
e = 3
c = pow(m, e, n)
print(f'c = {c}')
# n = 23570098360097260908266914080954003513706885568390448463720576188146956287111601604870247233822682630020002051748117520481402155749832096007629686239669192722978473890311246293580246256300691145653885805730865515297134808702766299205253761028235483781919393575836334910012714628455073300114978717047912395404034141622115001451888302617428376998024080880564792294546406688814397757714979980790018933407614160131827023349206138480523080173634617167828920519758917549492886733519381497665596997617399404664611446202014908853898043742964782757859701755202188366852773164911994663079171498909577012208742001609095258401847
# c = 7802816471025387606454709075933309958303134972861203739854774032383575355964299097074709350633475519273512630813578801152996777689686451397201513854823239337669091889776200179028891111154423623765139235199507280104544068425347533121731521700106757148551520759776111224072064131087547685154285120156917449926992033491342535410929828988598182819897435365878832122138552492908774845437576910276499625679469289655841639181182040186931130789588869657335253479416209378458303531995734157105918063227453396477282662136225029972745246845372963076381252679409317314514131852117346576265346926741908194011319430767975281696400
由于不恰当的填充,能让我们知道m的二进制的后半段都为0,刚开始还以为是copper,但是发现已知部分长度好像不太够,最后发现直接把2的幂次求逆过去,估计一下明文的长度采取小e攻击即可
代码如下:
import gmpy2
n = 23570098360097260908266914080954003513706885568390448463720576188146956287111601604870247233822682630020002051748117520481402155749832096007629686239669192722978473890311246293580246256300691145653885805730865515297134808702766299205253761028235483781919393575836334910012714628455073300114978717047912395404034141622115001451888302617428376998024080880564792294546406688814397757714979980790018933407614160131827023349206138480523080173634617167828920519758917549492886733519381497665596997617399404664611446202014908853898043742964782757859701755202188366852773164911994663079171498909577012208742001609095258401847
c = 7802816471025387606454709075933309958303134972861203739854774032383575355964299097074709350633475519273512630813578801152996777689686451397201513854823239337669091889776200179028891111154423623765139235199507280104544068425347533121731521700106757148551520759776111224072064131087547685154285120156917449926992033491342535410929828988598182819897435365878832122138552492908774845437576910276499625679469289655841639181182040186931130789588869657335253479416209378458303531995734157105918063227453396477282662136225029972745246845372963076381252679409317314514131852117346576265346926741908194011319430767975281696400
t=gmpy2.invert(pow(2,672),n)
c=c*(pow(t,3))%n
print(c)
for i in range(100000):
cc=c+i*n
m,s=gmpy2.iroot(cc,3)
if s:
print(m)
4.你不知道的事
from Crypto.Util.number import*
from secret import p, q, r, m_list
e = 0x10001
n = p*q
nn = pow(p + q, 2)
with open("output.txt", "w") as f:
tuple(map(lambda x: f.write(f'{x}\n'), (n, (nn - q * (2*p + q)) * r, [pow(r*bytes_to_long(msg), e, n) for msg in m_list])))
给的hint数据具有因子p,考虑gcd,把n分解
import gmpy2
from Crypto.Util.number import *
n=642321897439852685136114094329225357403485266064369951573143597574972249492010561586975309010619005030857254147656704415048902513398495116577735277746284756397168789363879247747419737775626343957311631175816848221967532779196564949886327531920700814697581923469247058182040587909447919059467806221807217164415295519007296577709934817033330279493956030579621209851219361098432526580018741974886805660892843212318036850371785423712298495842124719039607188853829699189965851465465832010550155432405329008609117016349023364059244226343423
a=544990532447497346357227795883291542795180814539222862420868194456144743160809083734188997812223688174632440584348654782488161904928775161007723095950090086580587751017920298422852884922926329573152650268413476868466610950367213381559016624062008593449017761564714454951646288925756790724932856494246483898480494731565222727492736165486924013920585483975147951797625581365303570518802255167557524890229810846039943891040632253458890340184538983806025155047673114815361252257476118181774795611226848486558592230139834990459063304888426731107003827212286784406959860320072752297487099255253591589093432440029326904734774007666383252873753326726220711150117186507010273577509657019417162894857405361327431290542128187221650180606442341916052158705994430015359348165101059419031697594580414352887217312743
c=[517361369061191612095061433048853735757658713769953949119712274303391557756676805382502609561620314290381260377708393426493032142023205489665983388775102117651819417086293108022344587857193992671586285767041228942092069756372351309260240713433063251171528687315785467600569134391410614067025063853394326295042995279042371938043135591791130778148481929925652025774790725854969829898135196295367011619693182512204382043448085388379494784543060984844383987523655567587329411666538211662849619965180443646008913550563658701035845898425865, 290214599216130969105100298935399150265035769129863808055639641154175065508442768844236623892083268255236277536788954518501359506195751845926243720440116759645052552564690464176971797228906946968161549240590390233454936239147173737172135165890335165502408736474803218411928428414279936373906942202760282520554406848547097807274588428581600972609662280192344655645435735392125961554535562309684661658877844405249362948974145142581203702944950622911872741432301472203650234248547000091912004680868019966201625582439110681482140680741992, 287886351979584597856336246312318426120087374770547056944901223613327506164511300491275458417694805799713038288816340484461885231617876948646454015900939148261171906070117876879704510879695868327467359620010672807323471325772046619886303597605964364825620342049864437478587090441676550683303437518332712181138359710982104890388207975463263769287223799111492598858878085697925205410643060425511596355940638457216498677721549527475302124571828693679929267049644094958780227445980468732903818885329696970632352772212432417005304707734399, 584865998064548442947740238124835156840172660066837739700702851626008157684591593437854418641017102050230509865343958647520201974977827538309304523618301706312445289363875368867284318012514250166835881141013263975955092326919802124303475437523885814773135482926856406683339787571855767666814932806970397253450830673252129490711767307418274411150174309222059442121899154013456116435186588154158846890029952640478628175731001909555942505090277018707924775725712817189745265278654561594024098007250561250070060520100195481332438986282834, 1406228594150305681128738647139639170949675063921533916549992217815278773726344011641209507482686123641220837487680045947626803827504459913212465218024922172903805028474566271443564364120765180960291774203445016478913845199187401276955350800042748684048854338897632665688497760823663952038845303361975983904413903394271123957395681466713717064814323202747726182819199787059516731582860009676004087606197132127647345140661960206238574705257749886327481105990906467023159582545650305977524426659111880225274989258331764687548243967570, 178425481604611144426562924134385324177152076443436835953066175380150208793209486562055540909624161610243811514679938467496885097980319091129288976894264428719020468613333621374342680374549116836045256803989317070775586195855198095885018509733840909227345621876951939363134014753655691598354650565747078134508396399362239014167890917538383939879902681101416788710195205010602955935734716519747383973392302412496858425980064974421909221373409168150917305853495608283959737496910308935328413804762519269364375616146001174036254889401438, 72691206109021161426487250670769962831596110177135658481445164652716292449737478841582665825506745949849347286460609308816456744230874681656905274793716668946199522578783904665881875164769035719718160835278794759081725318675522885877373088154201517003525055000916464265104711258387512479678710731002454092554150780845370032934244335295448646734275682625410092189414656485092656358111102146973688492118913514005247560357345009567542776098650940005154157565043746915908846841511178395432903399554827990105287403513010391543588376714688, 314909917298012330145761854548497167169525365883044695205162316663477033137054569146481031134148443778309183906018204097518153512615373853353305740633839127322278277321037451271550086914766297290641410055588518400979574476701262013117027986383474488288810876675737791438639962053665834813242230305468362554922962496837303502122453237932101211229100834684987314563079337898169140971959435736238177012317644560261431943573444458587734239749698442686994054423430406038352588593584283582806817590808239424693846111395716845750166004097044, 323865723837091315068725365528581876477381957733863482023233546798413037906629574030571053043342948654343608407152403701764074421116497416961314262507530890025623237734304101285975396573169182219142970147158947240718492890373258490348045067331864503744631729815327220936544989920192422952493860640439301625077243573482069970421684406282262358321069123579846884851719065821017021837117542573013079157243016841741826416935839729517361799674779436611137728688580207028562949181011674243471130019817778623259618626458470229572213687510828, 308486026700719504970693721726264147094895402136861377602368920654103719399861003606695902901569943384012087783254581392656943313977704065978871910306915255483925286118675713102673212994364628012976320276370913437838458978866536483909009039451597437444410067273274218531885599667642718536206669418625451411281689939172644326887584648220197123974322959447430826306934812094605695845034816146905820653039783231128262453988089026517857427096858074086638028313976823297571191225621647851058450974229787925030352314774403271916667973266640, 136812817040978547000926812791379974869395065395117594484118602824664189485257555084823069933263631502781914506508243582943014692442000088225588946514343924869693259741853408005821163879065608099835199139481123772307840838296419487785000100056167711562117359632155523808659142117405854036543869471779512945714959167109505611664842746250923416692471597878435017654715589812791142828185827935214052996635542196950744115244094767463699592241502640203685303940149426509324251114791882576086673832179825145417788768312753011718527325602340]
e=65537
p=gmpy2.gcd(n,a)
q=n//p
r=a//pow(p,2)
phi=(p-1)*(q-1)
d=gmpy2.invert(e,phi)
for i in range(len(c)):
m=pow(c[i],d,n)//r
print(long_to_bytes(m))
print(long_to_bytes(p))
print(long_to_bytes(q))

浙公网安备 33010602011771号