🛡️

setodaNote CTF Exhibition Writeup (Crypto)

2024/10/17に公開

Crypto - base64

組織に入ったばかりの新人からチャットが来ました。ですが普通の文字列ではなく暗号文になっているようです。どうやら新人は暇なようです。

以下の文字列を解読して、フラグを獲得してください。

ZmxhZ3tJdCdzX2NhbGxlZF9iYXNlNjQhfQ==

問題タイトルにある通り、CyberChefでBase64デコードします。

正答:flag{It's_called_base64!}

Crypto - ROT13

組織でも指折りの経験豊富なベテランからチャットが来ました。ですが普通の文字列ではなく暗号文になっているようです。どうやらこのベテランも暇なようです。

以下の文字列を解読して、フラグを獲得してください。

synt{Rira_lbh_Oehghf?}

問題タイトルになっているROT13とは各アルファベットを13文字後のアルファベットに変換する暗号です。
アルファベットは26文字なので、ROT13の暗号化と復号の処理方法は同一です。
CyberChefで復号します。

正答:flag{Even_you_Brutus?}

Crypto - pui_pui

組織の局長からチャットが来ました。ですが普通の文字列ではなく暗号文になっているようです。どうやらこの組織には暇人しかいないようです。

以下の文字列を変換して、フラグを獲得してください。

\x41\x3a\x44\x6f\x20\x79\x6f\x75\x20\x6b\x6e\x6f\x77\x20\x4d\x6f\x6c\x63\x61\x72\x3f\x0a\x0a\x42\x3a\x4f\x66\x20\x63\x6f\x75\x72\x73\x65\x21\x20\x49\x20\x6c\x6f\x76\x65\x20\x74\x68\x65\x20\x73\x63\x65\x6e\x65\x20\x77\x68\x65\x72\x65\x20\x68\x65\x20\x73\x69\x6e\x6b\x73\x20\x69\x6e\x74\x6f\x20\x74\x68\x65\x20\x62\x6c\x61\x73\x74\x20\x66\x75\x72\x6e\x61\x63\x65\x20\x77\x68\x69\x6c\x65\x20\x67\x69\x76\x69\x6e\x67\x20\x74\x68\x65\x20\x74\x68\x75\x6d\x62\x73\x20\x75\x70\x2e\x0a\x0a\x41\x3a\x2e\x2e\x2e\x20\x57\x68\x61\x74\x3f\x0a\x0a\x42\x3a\x62\x74\x77\x2c\x20\x74\x68\x65\x20\x66\x6c\x61\x67\x20\x69\x73\x20\x66\x6c\x61\x67\x7b\x48\x61\x76\x65\x5f\x79\x6f\x75\x5f\x65\x76\x65\x72\x5f\x68\x65\x61\x72\x64\x5f\x6f\x66\x5f\x48\x65\x78\x64\x75\x6d\x70\x3f\x7d\x2e\x0a

16進数表記になっているので、CyberChefで変換します。

正答:flag{Have_you_ever_heard_of_Hexdump?}

Crypto - tkys_secret_service

分担が一区切りし拠点に立ち寄っていた後輩から、あなたが3か月前に送ってきたチャットが結局なんだったのか解けないでいると話しかけられました。そういえば暇だったから意味もなく秘匿回線で内偵中の後輩に暗号文を送っていたことを思い出します。

以下の文字列を解析してフラグを入手してください。

Gur cevgrsgbvh vp Pvhgevyyrq Hhsynmmbpbrq Vhpvezngbvh (PHV) ermbqrhg bh hvhprqreny mlmgrzm nhq vetnhbfngbvhm bm vp cnenzvahg bzcvegnhsr gv prqreny ntrhsbrm nhq snh qbersgyl bzcnsg gur nobybgl vp gur prqreny tvirehzrhg gv massrmmpayyl svhqasg bgm rmmrhgbny zbmmbvhm nhq pahsgbvhm. Gubm caoybsngbvh cevibqrm ntrhsbrm jbgu ersvzzrhqrq mrsaebgl erdaberzrhgm pve cevgrsgbht gur svhpbqrhgbnybgl vp PHV jurh gur bhpvezngbvh bm ermbqrhg bh hvhprqreny mlmgrzm nhq vetnhbfngbvhm; jurh gur hvhprqreny vetnhbfngbvh bm hvg svyyrsgbht ve znbhgnbhbht bhpvezngbvh vh orunyp vp n prqreny ntrhsl ve ambht ve vcrengbht n mlmgrz vh orunyp vp nh ntrhsl; nhq jurer gurer ner hv mcrsbpbs mnprtaneqbht erdaberzrhgm pve cevgrsgbht gur svhpbqrhgbnybgl vp Synt bm pynt{cabcab_sne_vp_zvy} PHV cermseborq ol gur naguvebfbht ynj, ertayngbvh, ve tvirehzrhgjbqr cvybsl pve gur PHV sngrtvel ybmgrq bh gur PHV Ertbmgel. Gur erdaberzrhgm nccyl gv nyy svzcvhrhgm vp hvhprqreny mlmgrzm nhq vetnhbfngbvhm gung cevsrmm, mgver, nhq/ve genhmzbg PHV, ve gung cevibqr cevgrsgbvh pve masu svzcvhrhgm. Gur mrsaebgl erdaberzrhgm ner bhgrhqrq pve amr ol prqreny ntrhsbrm bh svhgensgany irubsyrm ve vgure nterrzrhgm rmgnoybmurq orgjrrh guvmr ntrhsbrm nhq hvhprqreny vetnhbfngbvhm.

CyberChefにてROT13変換してみると以下のようになります。

The priteftoiu ic Ciutrilled Uuflazzocoed Iucirmatoiu (CUI) rezodeut ou uiucederal zyztemz aud irgauosatoiuz oz ic paraminut ompirtaufe ti cederal ageufoez aud fau doreftly ompaft the aboloty ic the cederal giverumeut ti znffezzcnlly fiudnft otz ezzeutoal mozzoiuz aud cnuftoiuz. Thoz pnblofatoiu privodez ageufoez woth refimmeuded zefnroty reqnoremeutz cir priteftoug the fiucodeutoaloty ic CUI wheu the oucirmatoiu oz rezodeut ou uiucederal zyztemz aud irgauosatoiuz; wheu the uiucederal irgauosatoiu oz uit filleftoug ir maoutaououg oucirmatoiu iu behalc ic a cederal ageufy ir nzoug ir iperatoug a zyztem iu behalc ic au ageufy; aud where there are ui zpefocof zacegnardoug reqnoremeutz cir priteftoug the fiucodeutoaloty ic Flag oz clag{pnopno_far_ic_mil} CUI prezfrobed by the anthirosoug law, regnlatoiu, ir giverumeutwode pilofy cir the CUI fategiry lozted ou the CUI Regoztry. The reqnoremeutz apply ti all fimpiueutz ic uiucederal zyztemz aud irgauosatoiuz that prifezz, ztire, aud/ir trauzmot CUI, ir that privode priteftoiu cir znfh fimpiueutz. The zefnroty reqnoremeutz are outeuded cir nze by cederal ageufoez ou fiutraftnal vehoflez ir ither agreemeutz eztablozhed betweeu thize ageufoez aud uiucederal irgauosatoiuz.

何だか惜しい感じがします。
ここで、Flag oz clagに着目します。
ozisclagflagになるはずです。
ただ、単純に変換してしまうとClag is flagとなってしまうので、大文字はそのままにしておいたほうがよさそうです。
このように地道に考えていくと、ROT13変換後に

  • 小文字cと小文字f
  • 小文字fと小文字c
  • 小文字iと小文字o
  • 小文字nと小文字u
  • 小文字sと小文字z

を入れ替えれば読めそうということが分かります。

decode.py
# アルファベット対応表
alphabet_map = {
    "c": "f", "f": "c", "i": "o", "o": "i", "n": "u", "u": "n", "s": "z", "z": "s"
}

# ROT13変換後の文章
ciphertext = "The priteftoiu ic Ciutrilled Uuflazzocoed Iucirmatoiu (CUI) rezodeut ou uiucederal zyztemz aud irgauosatoiuz oz ic paraminut ompirtaufe ti cederal ageufoez aud fau doreftly ompaft the aboloty ic the cederal giverumeut ti znffezzcnlly fiudnft otz ezzeutoal mozzoiuz aud cnuftoiuz. Thoz pnblofatoiu privodez ageufoez woth refimmeuded zefnroty reqnoremeutz cir priteftoug the fiucodeutoaloty ic CUI wheu the oucirmatoiu oz rezodeut ou uiucederal zyztemz aud irgauosatoiuz; wheu the uiucederal irgauosatoiu oz uit filleftoug ir maoutaououg oucirmatoiu iu behalc ic a cederal ageufy ir nzoug ir iperatoug a zyztem iu behalc ic au ageufy; aud where there are ui zpefocof zacegnardoug reqnoremeutz cir priteftoug the fiucodeutoaloty ic Flag oz clag{pnopno_far_ic_mil} CUI prezfrobed by the anthirosoug law, regnlatoiu, ir giverumeutwode pilofy cir the CUI fategiry lozted ou the CUI Regoztry. The reqnoremeutz apply ti all fimpiueutz ic uiucederal zyztemz aud irgauosatoiuz that prifezz, ztire, aud/ir trauzmot CUI, ir that privode priteftoiu cir znfh fimpiueutz. The zefnroty reqnoremeutz are outeuded cir nze by cederal ageufoez ou fiutraftnal vehoflez ir ither agreemeutz eztablozhed betweeu thize ageufoez aud uiucederal irgauosatoiuz."

# 小文字のみ変換
for c in ciphertext:
    if c in alphabet_map:
        print(alphabet_map[c], end="")
    else:
        print(c, end="")
$ python decode.py
The protection of Controlled Unclassified Information (CUI) resident in nonfederal systems and organizations is of paramount importance to federal agencies and can directly impact the ability of the federal government to successfully conduct its essential missions and functions. This publication provides agencies with recommended security requirements for protecting the confidentiality of CUI when the information is resident in nonfederal systems and organizations; when the nonfederal organization is not collecting or maintaining information on behalf of a federal agency or using or operating a system on behalf of an agency; and where there are no specific safeguarding requirements for protecting the confidentiality of Flag is flag{puipui_car_of_mol} CUI prescribed by the authorizing law, regulation, or governmentwide policy for the CUI category listed in the CUI Registry. The requirements apply to all components of nonfederal systems and organizations that process, store, and/or transmit CUI, or that provide protection for such components. The security requirements are intended for use by federal agencies in contractual vehicles or other agreements established between those agencies and nonfederal organizations.
$

正答:flag{puipui_car_of_mol}

ちなみに、以下のWebサイトに暗号文を入力すれば換字式として自動で解析してくれるそうです[1](ただし、大文字と小文字の変換方法を同一にしているので完全に復号できるわけではなさそうです)。

https://quipqiup.com/

Crypto - lets_bake

あなたはシェフ帽の人物からレシピを受け取りました。どうやら組織からの秘密のメッセージのようです。レシピを解読し、秘密のメッセージを入手してください。

Input:
NzRmNDRiMWE0Y2M2ZGNiNzc3NTMyNTcwZjk0MTE4NTMyNTcxZjE1YTE1NTJkY2M0

Recipe:
RnJvbV9CYXNlNjQoJ0EtWmEtejAtOSsvPScsdHJ1ZSkN]b2[sRnJvbV9IZXgoJ05vbmUnKQ0=]b2[sRm9yaygnJScsJ18nLGZhbHNlKQ0=]b2[sUkM0KHsnb3B0aW9uJzonVVRGOCcsJ3N0cmluZyc6J2NoZWYnfSwnTGF0aW4xJywnTGF0aW4xJyk=

「bake」「シェフ」「レシピ」という単語からCyberChefを指していると推測できます。
]b2[sで区切ってそれぞれBase64デコードします。

  • RnJvbV9CYXNlNjQoJ0EtWmEtejAtOSsvPScsdHJ1ZSkNFrom_Base64('A-Za-z0-9+/=',true)
  • RnJvbV9IZXgoJ05vbmUnKQ0=From_Hex('None')
  • Rm9yaygnJScsJ18nLGZhbHNlKQ0=Fork('%','_',false)
  • UkM0KHsnb3B0aW9uJzonVVRGOCcsJ3N0cmluZyc6J2NoZWYnfSwnTGF0aW4xJywnTGF0aW4xJyk=RC4({'option':'UTF8','string':'chef'},'Latin1','Latin1')

あとはCyberChefにてInputを上記4つのRecipeで変換するだけです。

正答:flag{hello_baked_cipher}

Crypto - vul_rsa_01

あなたは組織の定期研修に参加しています。教官から RSA 暗号の禁止事項くらいは覚えておくようにと課題が出題されました。どうやら暗号文 c を解くことができればそれだけ早く帰れるようです。

以下の RSA 暗号を解読してフラグを入手してください。

c: 39119617768257067256541748412833564043113729163757164299687579984124653789492591457335

n: 13373801376856352919495636794117610920860037770702465464324474778341963699665011787021257

e: 65537

RsaCtfToolを利用して復号します。

https://github.com/RsaCtfTool/RsaCtfTool

$ ./RsaCtfTool.py --decrypt 39119617768257067256541748412833564043113729163757164299687579984124653789492591457335 -n 13373801376856352919495636794117610920860037770702465464324474778341963699665011787021257 -e 65537 
private argument is not set, the private key will not be displayed, even if recovered.                                                                    
['/tmp/tmpxkt9n97c']

[*] Testing key /tmp/tmpxkt9n97c.
attack initialized...
attack initialized...
[*] Performing rapid7primes attack on /tmp/tmpxkt9n97c.
[+] loading prime list file data/fbcc4333b5f183fc.pkl.bz2...
loading pickle data/fbcc4333b5f183fc.pkl.bz2...
100%|█████████████████████████████| 21048/21048 [00:00<00:00, 3699212.68it/s]
[+] loading prime list file data/ea229f977fb51000.pkl.bz2...
loading pickle data/ea229f977fb51000.pkl.bz2...
100%|█████████████████████████████| 61174/61174 [00:00<00:00, 3614497.77it/s]
[+] Time elapsed: 0.2363 sec.
[*] Performing lucas_gcd attack on /tmp/tmpxkt9n97c.
100%|████████████████████████████████| 9999/9999 [00:00<00:00, 315623.93it/s]
[+] Time elapsed: 0.0325 sec.
[*] Performing mersenne_primes attack on /tmp/tmpxkt9n97c.
 24%|████████▍                           | 12/51 [00:00<00:00, 412554.49it/s]
[+] Time elapsed: 0.0007 sec.
[*] Performing pastctfprimes attack on /tmp/tmpxkt9n97c.
[+] loading prime list file data/visa_emv.txt...
100%|███████████████████████████████████████| 2/2 [00:00<00:00, 99864.38it/s]
[+] loading prime list file data/pastctfprimes.txt...
100%|█████████████████████████████████| 121/121 [00:00<00:00, 1547288.98it/s]
[+] loading prime list file data/ti_rsa_signing_keys.txt...
100%|███████████████████████████████████| 34/34 [00:00<00:00, 1332769.50it/s]
[+] Time elapsed: 0.0045 sec.
[*] Performing nonRSA attack on /tmp/tmpxkt9n97c.
[+] Time elapsed: 0.0024 sec.
[*] Performing fibonacci_gcd attack on /tmp/tmpxkt9n97c.
100%|████████████████████████████████| 9999/9999 [00:00<00:00, 325908.21it/s]
[+] Time elapsed: 0.0314 sec.
[*] Performing smallq attack on /tmp/tmpxkt9n97c.
[+] Time elapsed: 0.1345 sec.
[*] Performing factordb attack on /tmp/tmpxkt9n97c.
[*] Attack success with factordb method !
[+] Total time elapsed min,max,avg: 0.0007/0.2363/0.0632 sec.                                                                                                                                                 
                                                                                                                                                                                                              
Results for /tmp/tmpxkt9n97c:                                                                                                                                                                                 
                                                                                                                                                                                                              
Decrypted data :                                                                                                                                                                                              
HEX : 0x0000000000666c61677b7765616b5f7273615f63616e5f62655f646563727970746564217d                                                                                                                            
INT (big endian) : 46327402297761911070944293204953074319567693047395802794186233938451290661245                                                                                                              
INT (little endian) : 62230274487105820292772638823612604590748807093488833479858991971752061223012822008463360                                                                                               
utf-8 : flag{weak_rsa_can_be_decrypted!}                                                                                                                                                                      
STR : b'\x00\x00\x00\x00\x00flag{weak_rsa_can_be_decrypted!}'                                                                                                                                                 
$

正答:flag{weak_rsa_can_be_decrypted!}

ちなみに、RsaCtfToolの実行結果にAttack success with factordb method !とある通り、今回はnの値が小さ過ぎて容易に素因数分解できてしまうことが原因です[2]
FactorDBによると、
13373801376856352919495636794117610920860037770702465464324474778341963699665011787021257 = 3058517013146002381763962882964790715736519 * 4372642466716249946441875327733923056149624303
です。

https://factordb.com/index.php?query=13373801376856352919495636794117610920860037770702465464324474778341963699665011787021257

Crypto - vul_rsa_02

あなたは引き続き組織の定期研修に参加しています。教官は昨日と同じ人物です。「早く帰れると言ったな。あれは嘘だ」昨日の信じられない光景が脳裏に蘇ります。RSA 暗号の禁止事項くらいは覚えておくようにと再び RSA 暗号の課題が出題されました。もはや誰も信じていませんがどうやら暗号文 c を解くことができればそれだけ早く帰れるようです。

以下の RSA 暗号を解読してフラグを入手してください。

c: 227982950403746746755552239763357058548502617805036635512868420433061892121830106966643649614593055827188324989309580260616202575703840597661315505385258421941843741681

n: 314346410651148884346780415550080886403387714336281086088147022485674797846237037974025946383115524274834695323732173639559408484919557273975110018517586435379414584423

e: 66936921908603214280018123951718024245768729741801173248810116559480507532472797061229726239246069153844944427944092809221289396952390359710880636835981794334459051137

RsaCtfToolを利用して復号します。

https://github.com/RsaCtfTool/RsaCtfTool

$ ./RsaCtfTool.py --decrypt 227982950403746746755552239763357058548502617805036635512868420433061892121830106966643649614593055827188324989309580260616202575703840597661315505385258421941843741681 -n 314346410651148884346780415550080886403387714336281086088147022485674797846237037974025946383115524274834695323732173639559408484919557273975110018517586435379414584423 -e 66936921908603214280018123951718024245768729741801173248810116559480507532472797061229726239246069153844944427944092809221289396952390359710880636835981794334459051137
private argument is not set, the private key will not be displayed, even if recovered.
['/tmp/tmpk04d77m_']

[*] Testing key /tmp/tmpk04d77m_.
attack initialized...
attack initialized...
[*] Performing rapid7primes attack on /tmp/tmpk04d77m_.
[+] loading prime list file data/fbcc4333b5f183fc.pkl.bz2...
loading pickle data/fbcc4333b5f183fc.pkl.bz2...
100%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 21048/21048 [00:00<00:00, 2645937.68it/s]
[+] loading prime list file data/ea229f977fb51000.pkl.bz2...
loading pickle data/ea229f977fb51000.pkl.bz2...
100%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 61174/61174 [00:00<00:00, 3065866.33it/s]
[+] Time elapsed: 0.2275 sec.
[*] Performing lucas_gcd attack on /tmp/tmpk04d77m_.
100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 9999/9999 [00:00<00:00, 203485.87it/s]
[+] Time elapsed: 0.0499 sec.
[*] Performing mersenne_primes attack on /tmp/tmpk04d77m_.
 25%|██████████████████████████████████████████                                                                                                                           | 13/51 [00:00<00:00, 336579.95it/s]
[+] Time elapsed: 0.0012 sec.
[*] Performing pastctfprimes attack on /tmp/tmpk04d77m_.
[+] loading prime list file data/visa_emv.txt...
100%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 2/2 [00:00<00:00, 83886.08it/s]
[+] loading prime list file data/pastctfprimes.txt...
100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 121/121 [00:00<00:00, 952177.83it/s]
[+] loading prime list file data/ti_rsa_signing_keys.txt...
100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 34/34 [00:00<00:00, 874885.50it/s]
[+] Time elapsed: 0.0031 sec.
[*] Performing nonRSA attack on /tmp/tmpk04d77m_.
[+] Time elapsed: 0.0007 sec.
[*] Performing fibonacci_gcd attack on /tmp/tmpk04d77m_.
100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 9999/9999 [00:00<00:00, 196920.03it/s]
[+] Time elapsed: 0.0515 sec.
[*] Performing smallq attack on /tmp/tmpk04d77m_.
[+] Time elapsed: 0.1334 sec.
[*] Performing factordb attack on /tmp/tmpk04d77m_.
[!] Composite not in factordb, couldn't factorize...
[+] Time elapsed: 1.6856 sec.
[*] Performing system_primes_gcd attack on /tmp/tmpk04d77m_.
100%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 7007/7007 [00:00<00:00, 1565352.23it/s]
[+] Time elapsed: 0.0228 sec.
[*] Performing lattice attack on /tmp/tmpk04d77m_.
[!] simple lattice attack is for partial keys only...
[+] Time elapsed: 0.0004 sec.
[*] Performing z3_solver attack on /tmp/tmpk04d77m_.
[!] Timeout.
[+] Time elapsed: 60.0906 sec.
[*] Performing factor_2PN attack on /tmp/tmpk04d77m_.
[+] Time elapsed: 0.0004 sec.
[*] Performing qicheng attack on /tmp/tmpk04d77m_.
Can't load qicheng because sage binary is not installed
[*] Performing pollard_p_1 attack on /tmp/tmpk04d77m_.
 40%|██████████████████████████████████████████████████████████████████▏                                                                                                    | 395/997 [00:59<01:26,  6.93it/s][!] Timeout.                                                                                                                                                                                                  
 40%|██████████████████████████████████████████████████████████████████▏                                                                                                    | 395/997 [01:00<01:31,  6.58it/s]
[+] Time elapsed: 60.0112 sec.
[*] Performing lehmer attack on /tmp/tmpk04d77m_.
[!] Timeout.
[+] Time elapsed: 60.0062 sec.
[*] Performing SQUFOF attack on /tmp/tmpk04d77m_.
[+] Time elapsed: 0.0003 sec.
[*] Performing lehman attack on /tmp/tmpk04d77m_.
[!] Timeout.
[+] Time elapsed: 60.0065 sec.
[*] Performing carmichael attack on /tmp/tmpk04d77m_.
[!] Timeout.
[+] Time elapsed: 60.0169 sec.
[*] Performing partial_q attack on /tmp/tmpk04d77m_.
[!] partial_q attack is only for partial private keys not pubkeys...
[+] Time elapsed: 0.0004 sec.
[*] Performing cube_root attack on /tmp/tmpk04d77m_.
[+] Time elapsed: 0.0005 sec.
[*] Performing primorial_pm1_gcd attack on /tmp/tmpk04d77m_.
100%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 10000/10000 [00:00<00:00, 30065.92it/s]
[+] Time elapsed: 0.3335 sec.
[*] Performing hart attack on /tmp/tmpk04d77m_.
[!] Timeout.
[+] Time elapsed: 60.0087 sec.
[*] Performing partial_d attack on /tmp/tmpk04d77m_.
[!] partial_d attack is only for partial private keys not pubkeys...
[!] partial_d internal error...
[+] Time elapsed: 0.0004 sec.
[*] Performing classical_shor attack on /tmp/tmpk04d77m_.
[!] Timeout.
[+] Time elapsed: 60.0085 sec.
[*] Performing pollard_strassen attack on /tmp/tmpk04d77m_.
[!] Timeout.
[+] Time elapsed: 60.0063 sec.
[*] Performing qs attack on /tmp/tmpk04d77m_.
Can't load qs because sage binary is not installed
[*] Performing fermat attack on /tmp/tmpk04d77m_.
[!] Timeout.
[+] Time elapsed: 60.0369 sec.
[*] Performing small_crt_exp attack on /tmp/tmpk04d77m_.
Can't load small_crt_exp because sage binary is not installed
[*] Performing factorial_pm1_gcd attack on /tmp/tmpk04d77m_.
100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 29998/29998 [00:03<00:00, 8308.64it/s]
[+] Time elapsed: 3.6118 sec.
[*] Performing wiener attack on /tmp/tmpk04d77m_.
 26%|██████████████████████████████████████████▍                                                                                                                         | 88/340 [00:00<00:00, 579432.89it/s]
[*] Attack success with wiener method !
[+] Total time elapsed min,max,avg: 0.0003/60.0906/21.0121 sec.

Results for /tmp/tmpk04d77m_:

Decrypted data :
HEX : 0x00026d79a6fba2741958ce82462855a96ec4dc1623133cfc341579920befc02eb7b9e0a3bbb87200666c61677b3139375f4d69636861656c5f4a5f5769656e65725f3637337d
INT (big endian) : 139798168458800312619727954564053595602272620374704334322644822890230408773803390124016933159608289280352695220195070051973287657162728356081272992926853175686148989
INT (little endian) : 1845704400959999148955767357764584773879807573417556934806144078363531192151775289329637546633081241953731286516885596747340023540455177925029084293276584228646671942144
utf-16 : Ȁ祭ﮦ璢堙苎⡆꥕쑮ᛜጣﰼᔴ鉹⻀릷ꏠ뢻r汦条ㅻ㜹䵟捩慨汥䩟坟敩敮彲㜶紳
STR : b'\x00\x02my\xa6\xfb\xa2t\x19X\xce\x82F(U\xa9n\xc4\xdc\x16#\x13<\xfc4\x15y\x92\x0b\xef\xc0.\xb7\xb9\xe0\xa3\xbb\xb8r\x00flag{197_Michael_J_Wiener_673}'

PKCS#1.5 padding decoded!
HEX : 0x00666c61677b3139375f4d69636861656c5f4a5f5769656e65725f3637337d
INT (big endian) : 706900059474686336852767718893877117199802992904014444218503062523163517
INT (little endian) : 221209360684179364205953033846940580466842595312699842973305914087229384192
utf-8 : flag{197_Michael_J_Wiener_673}
STR : b'\x00flag{197_Michael_J_Wiener_673}'
$

正答:flag{197_Michael_J_Wiener_673}

ちなみに、RsaCtfToolの実行結果にAttack success with wiener method !とある通り、今回はeの値が大き過ぎてWiener's Attackが成功してしまいます[3]

Crypto - WEARECIA

家に帰ると黒い封筒が郵便受けに入っていました。封筒の中身は英字が羅列されたメモが一枚。青銅色の紙に白いインクで書かれており右下には同じインクで WEARECIA と記載されています。どうやら暗号文のようです。暗号文を解析してメッセージを受け取る必要がありそうです。

以下の暗号文を解読し、隠されたメッセージを見つけてください。フラグは得られたメッセージを flag{} で囲んで回答してください。

EMUFPHZLRFAXYUSDJKZLDKRNSHGNFIVJYQTQUXQBQVYUVLLTREVJYQTMKYRDMFDRCDNKFRHHMKVLLTGBMFDUTMALDUMKYQTGLWLWCM

「CIA 暗号」で検索すると、アメリカの彫刻作品「クリプトス」がヒットします。

https://ja.wikipedia.org/wiki/クリプトス

ヴィジュネル暗号2種類と転置式暗号を採用しているようですが、一旦1種類目のヴィジュネル暗号を試してみます。

vigenere.py
# 換字表
vigenere_table = [
    "KRYPTOSABCDEFGHIJLMNQUVWXZ",
    "RYPTOSABCDEFGHIJLMNQUVWXZK",
    "YPTOSABCDEFGHIJLMNQUVWXZKR",
    "PTOSABCDEFGHIJLMNQUVWXZKRY",
    "TOSABCDEFGHIJLMNQUVWXZKRYP",
    "OSABCDEFGHIJLMNQUVWXZKRYPT",
    "SABCDEFGHIJLMNQUVWXZKRYPTO",
    "ABCDEFGHIJLMNQUVWXZKRYPTOS",
    "BCDEFGHIJLMNQUVWXZKRYPTOSA",
    "CDEFGHIJLMNQUVWXZKRYPTOSAB",
    "DEFGHIJLMNQUVWXZKRYPTOSABC",
    "EFGHIJLMNQUVWXZKRYPTOSABCD",
    "FGHIJLMNQUVWXZKRYPTOSABCDE",
    "GHIJLMNQUVWXZKRYPTOSABCDEF",
    "HIJLMNQUVWXZKRYPTOSABCDEFG",
    "IJLMNQUVWXZKRYPTOSABCDEFGH",
    "JLMNQUVWXZKRYPTOSABCDEFGHI",
    "LMNQUVWXZKRYPTOSABCDEFGHIJ",
    "MNQUVWXZKRYPTOSABCDEFGHIJL",
    "NQUVWXZKRYPTOSABCDEFGHIJLM",
    "QUVWXZKRYPTOSABCDEFGHIJLMN",
    "UVWXZKRYPTOSABCDEFGHIJLMNQ",
    "VWXZKRYPTOSABCDEFGHIJLMNQU",
    "WXZKRYPTOSABCDEFGHIJLMNQUV",
    "XZKRYPTOSABCDEFGHIJLMNQUVW",
    "ZKRYPTOSABCDEFGHIJLMNQUVWX"
]

# 暗号文
ciphertext = "EMUFPHZLRFAXYUSDJKZLDKRNSHGNFIVJYQTQUXQBQVYUVLLTREVJYQTMKYRDMFDRCDNKFRHHMKVLLTGBMFDUTMALDUMKYQTGLWLWCM"

# 鍵
key = "PALIMPSEST"

# 復号関数
def decrypt(vigenere_table, ciphertext, key):
    plaintext = ""
    key_length = len(key)
    for i, c in enumerate(ciphertext):
        # 鍵に対応する行を取得
        row_no = vigenere_table[0].index(key[i % key_length])
        row = vigenere_table[row_no]
        # 暗号文の文字が当該行のどの位置にあるか取得
        column_no = row.index(c)
        # 復号
        plaintext += vigenere_table[0][column_no]
    return plaintext

# メイン処理
if __name__ == "__main__":
    plaintext = decrypt(vigenere_table, ciphertext, key)
    print(plaintext)
$ python vigenere.py
BETWEENSUBTLESHADINGANDTHEABSENCEOFLIGHTLIESTHENUANCEOFIQLUSIONFLAGISWEARETHENATIONSFIRSTLINEOFDEFENSE
$

読みやすくすると以下のようになります。

BETWEEN SUBTLE SHADING AND THE ABSENCE OF LIGHT LIES THE NUANCE OF IQLUSION. FLAG IS WEARE THE NATIONS FIRST LINE OF DEFENSE.

正答:flag{WEARETHENATIONSFIRSTLINEOFDEFENSE}

脚注
  1. https://takahoyo.hatenablog.com/entry/2021/09/09/235412#tkys_secret_service-120pts-226solves ↩︎

  2. https://www.slideshare.net/slideshow/rsa-n-ssmjp/72368516#8 ↩︎

  3. https://www.slideshare.net/slideshow/rsa-n-ssmjp/72368516#14 ↩︎

Discussion