Attack All Around

今やCTFと競プロばかりだが、トビタテ生のアメリカ留学やTOEFL奮闘記

DeconstruCT.F 2021 Cryptography writeup

初めて全部の問題を紹介できる記事になったと思います。



Writeup


RSA-1


I have a lot of big numbers. Here, have a few!
ファイル:big_numbers.txt

nが小さいので素因数分解可能です。いつものように復号して終わりです。

from Crypto.Util.number import *


p,q = 4655885807254867892895911581,5051525354555657585960616263
phi = (p-1)*(q-1)
d = inverse(e,phi)
m = pow(c,d,n)
print(long_to_bytes(m))


dsc{t00_much_m4th_8898}



RSA-2


Hey I heard you have a supercomputer at home. This is taking too long to compute on my computer. Could you take a look on yours? I'm sure its a lot more precise than mine is, and faster too!
ファイル:supercomputer_food

e=3 と小さいのとnに比べてcがかなり小さいので、Low public exponent attackを考えます。gmpy2で調べたらcの3乗根が存在したので予想通りです。

import gmpy2
from Crypto.Util.number import *
e = 3
c = (中略)
n = (中略) 
m,ch = gmpy2.iroot(c,e)
print(long_to_bytes(int(m)))


dsc{t0-m355-w1th-m4th-t4k35-4-l0t-0f-sp1n3}



RSA-3


Alright, this is the big leagues. You have someone's Public Key. This isn't unusual, if you want to send someone an encrypted message, you have to have thier public key. Your job is to evaluate this public key, and obtain the value of the secret exponent or decryption exponent (The value of "d" in an RSA encryption).
Wrap the number that you find with dsc{}!
ファイル:mykey.pub

苦手な公開鍵ファイル形式です。値を得るにはどうしたらいいか調べるのに時間がかかり、やっと見つけました。

$ openssl rsa -noout -text -inform PEM -in mykey.pub -pubin
RSA Public-Key: (2049 bit)
Modulus:
    01:fb:7e:02:ec:6b:a1:1d:b8:4b:1e:eb:3d:a2:a0:
    9f:1d:1e:4d:d9:ee:96:96:75:db:f8:c3:f9:a8:26:
    d8:f5:f6:e3:a1:69:a0:56:a2:93:46:ef:19:bf:cd:
    4a:8e:39:50:e7:7d:68:73:cc:78:b5:fd:07:e2:4c:
    ae:3e:39:e0:00:8d:14:8d:67:44:70:d9:cd:5b:2e:
    c4:ae:72:73:77:05:bc:8c:6a:d9:4a:98:fb:05:97:
    bd:7a:83:dd:a3:79:75:ea:59:d3:0d:00:b1:4e:79:
    bf:d5:81:7e:72:b0:35:12:4e:f0:21:01:b9:4b:47:
    e0:b9:31:9e:6e:2c:0b:5f:bf:6a:54:57:02:46:f0:
    9c:71:24:0a:86:2b:89:89:98:ca:d0:c3:ab:59:89:
    67:9b:c3:b9:d7:cb:70:d1:95:2e:68:58:60:b4:56:
    81:27:24:c8:d3:86:8d:e6:84:d9:17:78:32:b8:f0:
    d9:f0:c0:93:a7:bc:18:a0:9e:02:bd:c3:8d:95:4a:
    68:6c:0a:92:67:5f:d5:22:a0:f1:95:83:36:62:8e:
    a1:d7:4d:70:1b:35:bf:8e:e7:2c:83:ef:0d:a7:e5:
    7e:e2:f1:d7:69:22:e9:cf:a0:ce:84:0e:d3:64:80:
    28:cf:32:fe:e0:8e:52:7c:bd:25:cf:37:d7:49:00:
    7c:09
Exponent:
    01:1e:f0:5c:01:b3:6f:f6:fe:c8:fd:98:9e:68:a8:
    d9:c4:47:25:23:90:17:8c:0f:e2:81:07:16:e2:cc:
    fb:b8:73:f2:b7:4f:f9:69:7e:53:18:49:2b:7d:13:
    ac:f6:b7:a7:23:0e:c9:4e:45:de:a3:db:80:ae:e6:
    c4:21:ca:78:ee:0e:37:e3:a7:60:e6:2d:2d:9b:16:
    d4:cc:5f:cf:cf:3d:c9:24:6a:b2:82:68:5b:56:72:
    25:30:ff:77:23:09:b6:55:43:8c:b9:34:9f:7c:ad:
    35:35:d9:b2:ca:c0:bb:c7:2d:0e:b9:d1:db:f8:6b:
    73:52:fe:34:1f:6a:dc:4d:ee:95:a8:fb:95:d2:95:
    58:e6:a8:af:9e:33:de:04:a9:79:4d:5b:31:af:06:
    f2:55:77:63:fb:58:63:87:6a:70:73:67:d4:65:8d:
    4b:65:40:21:c9:ba:f1:2b:ff:5d:d8:b7:19:7a:27:
    54:2b:c2:16:57:dd:b3:80:4f:c0:61:b3:43:b1:bc:
    2b:b8:b4:7d:d6:23:bd:0d:31:07:f7:dc:f4:38:88:
    cc:8f:fc:67:22:46:3f:91:bf:23:e6:50:9d:20:84:
    ec:53:c5:71:01:dc:e4:c7:4e:48:21:ae:78:b7:aa:
    36:fb:6b:d7:29:87:d0:81:2c:23:79:74:41:cb:08:
    20:95

eが大きいので、Wiener's Attackです。問題文より、秘密鍵の値がflagになるようです。


dsc{63933136978362426184143019464489956595164295762618713567671020 219205380524818295685880471894474718733401405378107694338783830291 64089236876209147584435733}



The Conspiracy


There was once a sailor who travelled to many countries. He was a quirky old man. He said many many things, and most of what he said never made sense to anyone. He considered himself ahead of his time, and said that the people of his time were unworthy of his wisdom. Soon he was lost to the ages, but his diary wasn't. Are you worthy of decoding his wisdom?
ファイル:diary.txt

diary.txtの中身はいかにもbase64です。復号するとこのようになりました。

dsc{(-18.05572729282756, 178.45700143131674),(19.028282857505392, 103.14426071207107),(42.536705991266146, 1.4930344612276933),(38.5893697217354, 68.81632523058967),_,(50.851518948206795, 4.360180853581986),(7.671863538453386, 36.83726095698952),_,(38.619506740587035, 34.85512642711004),(47.42806157123545, 18.998421101903602),(30.19387158353921, 31.12496611612573),_,(-0.23177559426111558, -78.5033963083949),(-12.85446936733455, 132.79262433883298),(44.424231252577435, 24.350241166279226),(24.8195647413923, 120.97236754005058),(18.584456974403487, -72.31812189614772)}

座標の形をしているので、google mapで調べます。Fiji, Laos, Andorra, ... と続くので座標が示す国名の頭文字を繋げるとflagになりそうです。次はGかと思ったら、Tajikistanでびっくりしましたが…。

あとは、小文字指定を教えてほしかった。


dcs{flat_be_the_earth}



Code Decode


Around 5 years ago, I made this killer program that encodes the string into a cyphertext. The unique feature of this program is that for the same exact plaintext, it generates a different cyphertext every time you run the program. Yesterday I was nosing around in some old stuff and found an encrypted message!
2njlgkma2bv1i0v}22lv19vuo19va2bvl2{-5x
Sadly I realized the I lost the decryption program. I have the encryption program though. Do you think you can help me out and decrypt this message for me?
ファイル:cypher.txt, encrypter.py, encrypted_text.txt

encrypter.pyのcreate_encryption関数を見ると、平文を別の文字に変えているようです。その対応表はcypher.txtに書かれています。どの対応表を使っているかはキー(?)のようなもので区別され、暗号文の先頭3文字と残りは最後に書かれています。

暗号文より、キーは"2nj-5x"であることが分かります。あとは、対応表通りに元に戻せばOKです。

def create_encryption(character_key):
    charstring = "abcdefghijklmnopqrstuvwxyz1234567890 _+{}-,.:"
    final_encryption = {}
    for i, j in zip(charstring, character_key):
        final_encryption[i] = j
    return final_encryption

dic = {(中略)}

enc = "2njlgkma2bv1i0v}22lv19vuo19va2bvl2{-5x"
for k,v in dic.items():
        #print(k,v)
        if k[:3] == enc[:3]:
                print(k,v)
                final_encryption = create_encryption(v)
                ct = enc[3:-3]
                print(final_encryption)
                for c in ct:
                        for a,b in final_encryption.items():
                                if c == b: print(a,end="")
                print()


dsc{y0u_4r3_g00d_4t_wh4t_y0u_d0}



Stars and Shapes


This might be a difficult question, but I'm sure you can do it with your eyes closed.
ファイル:stars_and_shapes.gif

gifファイルを分解します。IrfanViewやオンラインツールなど使ってください。

GIF画像を分解する方法5選。分解可能なソフトとWebサイトを紹介 | Offers Magazine


f:id:partender810:20211007212114p:plain
分解結果


一枚の画像とflagの1文字が対応してそうです。なんだこの図形が書かれたりなかったり…。問題文を読むと、目を閉じれば解ける…?


点字だ!


下の2つだけが付いている点字は、"_"(アンダースコア)ではなく"-"(ハイフン)であるのに気付くのに時間がかかり、何度もincorrectを出してしまいました。


dsc{d0-y0u-th1nk-h3-s4w-us7132}



Doe, a deer


Mark, a very gifted musician, is suddenly missing after his music class. He is said to have been upset after turning in his assignment. He had worked very hard on it, it was his first original. Here, you can see his work. I'm sure you can find him, he wouldn't have gone far.
ファイル:Doe_a_deer.pdf, tune_700.mp3

この問題は解けませんでした…。


pdfにあるのは、mp3の音源の楽譜でしょう。楽譜が暗号文になる暗号化方式があったような…。

google先生が、solfa cipherだと教えてくれました。

Solfa Cipher Secrets

ただdecoderの使い方が分からずタイムアップ。Solfa Cipher: の欄に <音階><数字> を入れればいいのでしょうが、音階はともかく数字が分からない。数字は何拍子目かに該当するのでしょうが、よくわからない…。



まず、Solfa keyはこのようにします。

f:id:partender810:20211007213408p:plain

次に、音符の形で何拍子目かを特定できます。形によって音を長くする短くするは分かっていたのですが、五線譜のどこに黒丸があるか音階にしか注目していませんでした…。

二分音符は長さ4つ分、四分音符は長さ2つ分、八分音符は長さ1つ分、音符の右に小さい点がある場合は長さ+1です。

f:id:partender810:20211007213859p:plain
左から順に、四分音符、四分音符(点付き)、八分音符、二分音符

このマークは2つ分待て、という意味です。

f:id:partender810:20211007220511p:plain
四分休符というらしい

ここで、音階は日本の「ドレミファソラシ」が「D, R, M, F, S, L, T」になり、数字の部分は1~4の中で何拍子目にその音が始まるかが入ります。

なので、最初は"R1"となり、二分音符なので4つ伸ばすと1→2→3→4→1と1に戻るので、次は"M1"となります。その次は2つ分伸ばすので"F3"となります。これを続けて全ての音符を復号させます。

f:id:partender810:20211007221949p:plain
復号結果

これで出てきた文字をdsc{}で括ればいいのかと思ったら、もう一ひねりありました。

tune_700.mp3をstringsコマンド叩いて見ると、最後の行にgoogle driveのURLが載っているのでアクセスします。そうすると、PDFがダウンロードされますがパスワードがかかっています。solfa cipherでの平文をぶち込むと開くことができ、そこにflagがありました。


dsc{b3tt3r-b3-h0m3-f0r-d1nn3r}