記録は作業の証

鉄道とコンピュータ

picoCTF Write-up ARMssembly 0

問題文

https://play.picoctf.org/practice/challenge/160

What integer does this program print with arguments 4134207980 and 950176538? File: chall.S Flag format: picoCTF{XXXXXXXX} -> (hex, lowercase, no 0x, and 32 bits. ex. 5614267 would be picoCTF{0055aabb})

考えたこと

AArch64のアセンブリプログラムを読み、実行結果が何であるかを問うもの。

最初は、アルゴリズムを理解する必要があると考え律儀に読んでいた。

そうしているうちに、ふと、実行環境を用意して実行すればいいだけなのではないかと気がついた。

解答

AArch64のGCCQEMUを用意して実行する。

$ aarch64-linux-gnu-gcc chall.S
$ qemu-aarch64-static -L /usr/aarch64-linux-gnu/ ./a.out 4134207980 950176538

picoCTF Write-up keygenme-py

問題文

https://play.picoctf.org/practice/challenge/121

keygenme-trial.py

考えたこと

Pythonスクリプトを読み解くことで解くようだ。読み解くことで次のことがわかる。

  • フラグに関連する文字列が格納された変数群がある。
    • key_part_static1_trial
    • key_part_dynamic1_trial
    • key_part_static2_trial
    • key_full_template_trial
  • check_key という関数という関数があり、ユーザが入力した文字列 user_keybUsername_trial をSHA256でハッシュ化したものと比較している。
  • decrypt_full_version という関数で、暗号化された文字列 full_versionuser_key を使って復号している。
  • 復号できたコードを実行し、「フルバージョン」に移行する。

bUsername_trialFREEMAN という文字列である。復号鍵は、 FREEMAN をSHA256でハッシュ値を計算し、その16進数表現での一部の文字を取りだして並べかえたもののようだ。

解答

Racketで計算してみる。

gist1a3f6e96013dd25b4b3c5175f3206c0c

picoCTF Write-up caesar

問題文

https://play.picoctf.org/practice/challenge/64

Decrypt this message.

考えたこと

ヒントにはシーザー暗号のことが書かれていたので、これで復号すればよさそう。

問題は鍵がわからないことである。アルファベットだけで26通り試す必要がある。

CyberChefで頑張ってもよいが、プログラムで解いてみることにした。

解答

Racketで無駄に細かく実装してしまった。

gist78f1bc506514bd2cdeea83ce8c67827d

picoCTF Write-up Easy1

問題文

The one time pad can be cryptographically secure, but not when you know the key. Can you solve this? We've given you the encrypted flag, key, and a table to help UFJKXQZQUNB with the key of SOLVECRYPTO. Can you use this table to solve it?.

考えたこと

table.txt というファイルがあり、アルファベットの表のようなものがある。 どこかで見覚えがあったので、次の本で調べてみると、どうやらウィジュネル暗号というものらしい。

鍵の文字の列を見て、次に平文の文字の行を見て、交差するところの文字が暗号文の文字になるらしい。

解答

表を生成して、手作業でやるのと同じ要領をプログラムとして実装してみた。

gista314157a89293838cb7e584d9148e7a9

picoCTF Write-up The Numbers

問題文

https://play.picoctf.org/practice/challenge/68

The numbers... what do they mean?

考えたこと

リンクはPNG画像を指している。画像ビューアで開くと、数列が書かれている。

{や}があることから、フラグそのものの可能性がある。

色々考えたすえ、ASCIIコード表を眺めてみると、どうやら画像の数字は文字A(0x41)からの距離らしいことがわかった。

解答

Racketで復号してみる。

gistbd3dce884232c346bb074bda2fb99440

picoCTF Write-up Transformation

問題文

https://play.picoctf.org/practice/challenge/104

I wonder what this really is... enc ''.join([chr((ord(flag[i]) << 8) + ord(flag[i + 1])) for i in range(0, len(flag), 2)])

考えたこと

encというファイルには、文字化けする謎のバイナリデータが書かれている。 問題には以下のようなコード片があるが、これが暗号化に使われたコードだろう。

''.join([chr((ord(flag[i]) << 8) + ord(flag[i + 1])) for i in range(0, len(flag), 2)])

このコードのアルゴリズムは、要約すると次のようなものになる。

  • 平文を2文字ずつに区切り、Unicodeの1文字に無理矢理まとめる。
  • まとめかたは、2文字をそれぞれコードポイントに変換し、平文の先頭側を8ビット左シフトして、後尾側とビットORするもの。

ということは、逆の操作を実装すれば復号できるはず。

解答

Racketを使って復号してみることにした。

gist81fcbf8dd6172c81d919c0d37ab23a64