Site cover image

🏪ofuroniku火星第3支店

Post title iconksnctf #2

ksnctfをちょっとずつ進めようと思う。writeupの公開はOKとのことなので解法を書いていく。

Easy Cipher

アルファベットの羅列が与えられる。タイトルから何かしらの暗号文とわかる。

Amazonアソシエイトのニコニ広告みたいのが下にあって、カエサルって本が登録されてた。シーザー暗号なのかな…。

RubyにはString#trというメソッドがあってシーザー暗号の解読にちょうど良い感じ(String#nextは使えないね)。

参考

vfはisっぽいなという予想から、irbを開き試しているとこれでisが現れる。

"vf".tr("a-z", "n-za-m")
=> "is"

変換の仕方がわかったので、問題文を復号するコードを書く。

ciphers = "EBG KVVV vf n fvzcyr yrggre fhofgvghgvba pvcure gung ercynprf n yrggre jvgu gur yrggre KVVV yrggref nsgre vg va gur nycunorg. EBG KVVV vf na rknzcyr bs gur Pnrfne pvcure, qrirybcrq va napvrag Ebzr. Synt vf SYNTFjmtkOWFNZdjkkNH. Vafreg na haqrefpber vzzrqvngryl nsgre SYNT."

res = ciphers.split.map do |cipher|
  cipher.split("").map { _1.tr("a-z", "n-za-m") }.join
end

print res.join(" ")

=> EBG KVVV is a simple letter substitution cipher that replaces a letter with the letter KVVV letters after it in the alphabet. EBG KVVV is an example of the Paesar cipher, developed in ancient Eome. Slag is SYNTFwzgxOWFNZqwxxNH. Vnsert an underscore immediately after SYNT.

…大文字が拾えてないせいで微妙に解読しきれていない。大文字も変換するようにtrを書き直し、以下でクリア。

ciphers = "EBG KVVV vf n fvzcyr yrggre fhofgvghgvba pvcure gung ercynprf n yrggre jvgu gur yrggre KVVV yrggref nsgre vg va gur nycunorg. EBG KVVV vf na rknzcyr bs gur Pnrfne pvcure, qrirybcrq va napvrag Ebzr. Synt vf SYNTFjmtkOWFNZdjkkNH. Vafreg na haqrefpber vzzrqvngryl nsgre SYNT."

res = ciphers.split.map do |cipher|
  cipher.split("").map { _1.tr("a-zA-Z", "n-za-mN-ZA-M") }.join
end

print res.join(" ")

=> ROT XIII is a simple letter substitution cipher that replaces a letter with the letter XIII letters after it in the alphabet. ROT XIII is an example of the Caesar cipher, developed in ancient Rome. Flag is ______________. Insert an underscore immediately after FLAG.

おまけ

ソースが微妙。

# cipher"s"なので配列を格納する
ciphers = "EBG KVVV vf n fvzcyr yrggre fhofgvghgvba pvcure gung ercynprf n yrggre jvgu gur yrggre KVVV yrggref nsgre vg va gur nycunorg. EBG KVVV vf na rknzcyr bs gur Pnrfne pvcure, qrirybcrq va napvrag Ebzr. Synt vf SYNTFjmtkOWFNZdjkkNH. Vafreg na haqrefpber vzzrqvngryl nsgre SYNT.".split

# mapをワンライナーにする
results = []
ciphers.map { |cipher| cipher.split { results << _1.tr("a-zA-Z", "n-za-mN-ZA-M") } }

print results.join(" ")

…2度のsplitがイケてないので…

ciphers = "EBG KVVV vf n fvzcyr yrggre fhofgvghgvba pvcure gung ercynprf n yrggre jvgu gur yrggre KVVV yrggref nsgre vg va gur nycunorg. EBG KVVV vf na rknzcyr bs gur Pnrfne pvcure, qrirybcrq va napvrag Ebzr. Synt vf SYNTFjmtkOWFNZdjkkNH. Vafreg na haqrefpber vzzrqvngryl nsgre SYNT.".split("")

print ciphers.map { _1.tr("a-zA-Z", "n-za-mN-ZA-M") }.join

これでスッキリ🆗