记点东西……
太长不看: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}{d}{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:]))