ksnctf-2 Easy Cipher WriteUp
お久しぶりです。duckです。
最近は忙しかったりAtcoderにはまっていたりして全然更新してません。
(メンバーはほかにもいるはずなんだけどどこ行った)
今日は常設ctfやってみたので、久しぶりにWriteUp書きます。
中身はこんな感じ。
ぶっちゃけ2秒でシーザー暗号だとわかりますが、せっかくなので今回はシーザー暗号解読プログラムを作ってみましょう。
ネット上に落ちてるものは大文字と小文字を勝手に変換したり、rot13以外だった場合に探すのが面倒だったりするので
・大文字小文字を区別する
・指定文字列とマッチした結果のみ出力する
ようにceaser.pyを書いてみました。
python3 ceaser.py 暗号文のファイルパス 出力するファイルパス 探したい文字列(変換後)
のように使います。
例を挙げたほうが早いですね。
./ceaser.txtの中身が
gmbh jt evdl.
のとき
python3 ceaser.py ./crypto.txt ./ans.txt flag
をすると
./ans.txtに
flag is duck.
が書かれます。すごい。
これを使えば冒頭のシーザー暗号も簡単に復元できますね(フツーにrot13だった...)
ぜひお試しいただければと思います。
ずいぶん前に書いたので忘れてた仕様
・二つ以上のrotにmatchすると出力ファイルに追記する
コード:
CTFcode/ceaser.py at master · duck-falcon/CTFcode · GitHub
gitとか知らんがなという人とか今すぐコピペして使いたい人とかに以下全文コピーも掲載
(gitのほうはたまに更新するのでできればgitみて)
なんで文字コード使わなかったんだろう?覚えてない。
import copy import sys args = sys.argv #右回り変換 def ceaser(filepath,n,filew = "ceaser.txt",match = ""): alist = ["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"] Alist = ["A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"] temp = ["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"] Temp = ["A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"] i = n for v in alist: temp[i % 26] = v i += 1 i = n for V in Alist: Temp[i % 26] = V i += 1 with open(filepath) as f: contents = f.read() dict = {} Dict = {} i = 0 for v in alist: dict[v] = temp[i] i = i + 1 i = 0 for V in Alist: Dict[V] = Temp[i] i = i + 1 contents = contents.translate(contents.maketrans(dict)) contents = contents.translate(contents.maketrans(Dict)) if match in contents: with open(filew, mode='a') as F: F.write(contents) print("write success: " + str(n) + "rot ") else:print("no match") a = len(args) if a == 4: for i in range(26): ceaser(args[1],i,args[2],args[3]) else: print("please: <input_file_path> <output_file_path> <match_str>")