記點東西……
太長不看:rar5真加密破解 = rar2john + hashcat
三行情詩
提示三行情詩但是圖片很明顯是兩行,根據圖片寬高搜索對應hex,進行一個高度的改:
同時由于套了010的jpg模板,看到末尾有rar文件,binwalk -e
分離得到2EDC.rar
。
更改圖片高度后看到提示
比賽的時候緊張地進行了一個百度并焦慮地強行寫了一下,寫得很爛,爛到看不下去的程度(
import itertools
l='qazwsxQAZWSX'
l=list(l)
for a,b,c,d,e,f in itertools.product(l, repeat=6):
a=f"{a}{b}{c}jng5lq1{e}{f}"
with open('1.txt','a') as f:
f.write(a+'\n')
根本沒做條件限制,因而開始了緩慢而痛苦的生成(……)期間去搞別的題了,回來APCHPR擼了一把報錯,發現是rar5,又開始四處找工具,找到一篇:https://www.freesion.com/article/15821308867/
遂打開kali,這時小破筆記本因為還同時開著IDA瀏覽器spyder等等亂七八糟的東西,已經進入卡爆狀態(
拖進去執行
rar2john 2EDC.rar >hash.txt
刪掉不用的部分,留下
執行
hashcat -a 0 -m 13000 hash.txt 1.txt
直接黑屏(笑)后來比賽結束第二天復現了下,跑出來了……
$rar5$16$fdedaa2ca61fc54faaeac72a566a79b0$15$b848f1949dfce38205ee4acbabeb1b49$8$3c950745a82c85b2:QzaSXw
解壓即得flag。
古典密碼
一個真的很好用且啥都有的解密網站:
http://rumkin.com/tools/cipher/playfair.php
rrrsssaaa
沒做出來留個檔,先放題目:
p = getPrime(512)
q = getPrime(128)
r = getPrime(512)
a = p**3 + q**4
n = p * q * r
e = 65537
m = bytes_to_long(flag)
c = powmod(m,e,n)
print('a =', a)
print('n =', n)
print('c =', c)
'''
a = 1001757897913772351510420195662626456337522550684606727483773096673299029784598925879489541145425035208954548434364407129536623872359866140502945055841821765538135618785958230881698432164666106480484384998915283051445946164568339012311071022667483689786104241205203770248137327154122271358173278768580995401804353335810303663245624828137303106291342454008598042561788843169528260839797410662782024780465758566251328065946252974178694612662193108827812380093012592
n = 19743856964263732842999962921764407899550835757434895392940479421960735302959163991849377985049404173836251900687827441599500422841626517558622567745437335569126719161072741233680254267603047267283814233895186061759120509099394028737117210315668037567644106922178370110286156290354552013641623466808054072066874721501635305497521532247446583415341
c = 11573369450591319755076158585550356804136715495771905025393681593171072453674223539740220735995000501270745453812328856003963738281166754397539243769043057759237596024541470868109828449256053991918612982581009998827964614610819962346527488888094333196535012014776795315145414671509148454534127080694322513052946539505422338224596999797852421340273
'''
隊友:rsa能做嗎
我:我看看……救命,我一天中不能夠看太多的數學題
↑就是這樣思路完全跑偏,試圖用p**3 + q**4
和p * q * r
湊出p+q
和pq
,果然到最后都沒做出來(。后來比賽結束問了下以前搞密碼的隊友,答曰試試gmpy2的iroot……
我:我不理解,但大受震撼
p = gmpy2.iroot(a,3)[0]
q = gmpy2.iroot(a-p**3,4)[0]
r = n//p//q
phi = (p-1)*(q-1)*(r-1)
d = gmpy2.invert(e, phi)
m = gmpy2.powmod(c, d, n)
SETCTF - mostly common
20211108:懶得新開一篇,又是rsa,堆一起好了
from Crypto.Util.number import bytes_to_long, getPrime
f = open('flag.txt', 'rb')
flag = f.read()
f.close()
m = bytes_to_long(flag)
p = getPrime(512)
q = getPrime(512)
n = p * q
e1 = 65536
e2 = 270270
c1 = pow(m, e1, n)
c2 = pow(m, e2, n)
f = open('message.txt', 'w')
f.write('n=' + str(n) + '\n')
f.write('c1=' + str(c1) + '\n')
f.write('c2=' + str(c2) + '\n')
f.close()
n=122031686138696619599914690767764286094562842112088225311503826014006886039069083192974599712685027825111684852235230039182216245029714786480541087105081895339251403738703369399551593882931896392500832061070414483233029067117410952499655482160104027730462740497347212752269589526267504100262707367020244613503
c1=39449016403735405892343507200740098477581039605979603484774347714381635211925585924812727991400278031892391996192354880233130336052873275920425836986816735715003772614138146640312241166362203750473990403841789871473337067450727600486330723461100602952736232306602481565348834811292749547240619400084712149673
c2=43941404835820273964142098782061043522125350280729366116311943171108689108114444447295511969090107129530187119024651382804933594308335681000311125969011096172605146903018110328309963467134604392943061014968838406604211996322468276744714063735786505249416708394394169324315945145477883438003569372460172268277
顯然是共模攻擊的簡單變種,gcd(65536,270270)==2
,所以計算出的結果為m^2
,用iroot
開方即可得到m
import gmpy2
import binascii
n = 122031686138696619599914690767764286094562842112088225311503826014006886039069083192974599712685027825111684852235230039182216245029714786480541087105081895339251403738703369399551593882931896392500832061070414483233029067117410952499655482160104027730462740497347212752269589526267504100262707367020244613503
e1 = 65536//2
e2 = 270270//2
c1=39449016403735405892343507200740098477581039605979603484774347714381635211925585924812727991400278031892391996192354880233130336052873275920425836986816735715003772614138146640312241166362203750473990403841789871473337067450727600486330723461100602952736232306602481565348834811292749547240619400084712149673
c2=43941404835820273964142098782061043522125350280729366116311943171108689108114444447295511969090107129530187119024651382804933594308335681000311125969011096172605146903018110328309963467134604392943061014968838406604211996322468276744714063735786505249416708394394169324315945145477883438003569372460172268277
s = gmpy2.gcdext(e1,e2)
m1 = gmpy2.powmod(c1,s[1],n)
m2 = gmpy2.powmod(c2,s[2],n)
m = (m1*m2)%n
m = gmpy2.iroot(m,2)[0]
print(binascii.unhexlify(hex(m)[2:]))