ksnctf#25 Reservedを解いてみた
前回はksnctfの20ポイント問題について解説しました。
今回は30ポイントの問題であるksnctf#25 Reservedを解いていこうと思います。
![](https://myhobbies-blog.net/wp-content/uploads/2023/11/66c19942ab4ba346fdb64ccc04cde373-1024x364.jpg)
問題を見ると、
英語の文字列が規則的に並んでいます。
どういう意味なんでしょうか…。
![](https://myhobbies-blog.net/wp-content/uploads/2023/11/44d29d2792be3bad9a9ed98c7bbb20d6-1024x422.jpg)
並んでいる文字列を見ると、
・chr,print等のプログラミングで使う文字列が並んでいる
・やたら「q」という文字が出てくる
という特徴があるようですね。
何かのスクリプトのようですが、これだけでは分かりません。
とりあえずググってみる
文字列の一部をコピーしてGoogleで検索してみると、プログラミング言語「Perl」用のスクリプトのようで、さらにはppencode という予約語だけで任意文字列を出力するスクリプトだということが分かりました。
![](https://myhobbies-blog.net/wp-content/uploads/2023/11/464b1f13b0d2bd53e52e687b363d661f-1024x427.jpg)
予約語とは、プログラミング言語で開発者があらかじめ定義(予約)している文字列であり、変数や関数で利用できないもののことです。
![](https://myhobbies-blog.net/wp-content/uploads/2023/11/0e4aae38a1f5494592124a884058f7cb-1024x333.jpg)
問題のタイトルが「Reserved」(予約済み)であることからも、予約語に関する問題であることは間違いなさそうですね。
Perlにおける予約語とは、今回の問題文にも度々出現している「q」「qw」「uc」「ord」等が該当します。
今回の問題は予約語をふんだんに使ったPerl用のスクリプトだと分かりました。
では、問題を解いていきましょう。
問題の解説
![](https://myhobbies-blog.net/wp-content/uploads/2023/11/44d29d2792be3bad9a9ed98c7bbb20d6-1024x422.jpg)
このPerl用のスクリプトを読み解いてみます。
問題文を使って具体的に説明すると、冒頭部分に
print chr ord uc qw q flock q
とありますが、これで「F」を出力するという意味になります。
各予約語の処理については、
print=出力
chr=文字列に変換
ord=ASCIIコードに変換
uc=大文字に変換
qw=配列をリスト化
q flock q=‘flock’を表す(Perlでqはシングルクォーテーションの意味)
となり、まとめると「flock」という文字列の先頭の「f」を大文字「F」に変換して出力するということになります。もっと簡単に言うと「F」を出力するというわけです。
「F」と言えば、FLAGのFですよね。
というわけで、このスクリプトを読み解いていけばFLAGが判明しそうです。
手動で解くのはかなり手間がかかるので、このスクリプトをPerlで動作させてみます。
Windows OSへのPerlインストール方法
WindowsへのPerlのインストール方法についてですが、ActiveState 社の公式サイトからWindows用のインストーラをダウンロードします。(要アカウント登録)
ActiveState 社の公式サイト https://www.activestate.com/products/perl/
![](https://myhobbies-blog.net/wp-content/uploads/2023/11/dda9bb331e5adc2b5a3ca1088fa71280-1024x444.jpg)
インストーラを実行するとコマンドプロンプトが起動します。
インストーラの説明に従って手続きを進めていきます。(ほぼ自動です。)
![](https://myhobbies-blog.net/wp-content/uploads/2023/11/080047c41d77c58d97cf85ec35d0e15b-1024x168.jpg)
無事PerlがWindowsにインストールされました。
![](https://myhobbies-blog.net/wp-content/uploads/2023/11/486359223c22c9ae1b93f7f652f68c66.jpg)
Perl実行環境が整ったところで、スクリプトを実行していきます。
Perlでのスクリプト実行結果
コマンドプロンプト上でPerlを実行し、任意の文字列を出力するコマンドは
perl -e “任意の文字列”
となります。
例えば、プログラミングでおなじみのHello worldをPerlで出力する場合、以下のコマンドとなります。
![](https://myhobbies-blog.net/wp-content/uploads/2023/11/abf92b3a4c3eeb1db239b7fb8223bddd.jpg)
そこで、問題文のスクリプトを前から順に区切って実行してみると…
![](https://myhobbies-blog.net/wp-content/uploads/2023/11/f9f2f8267651893dc20507a60167128c-1024x212.jpg)
F、L、A、Gという順に文字列が出力されました!
このまま問題文のすべてのスクリプトを入力・出力させればFLAGがゲットできそうですね。
コマンドプロンプト上で入力するのは大変なので、スクリプトを別のファイルに保存して実行することにします。
![](https://myhobbies-blog.net/wp-content/uploads/2023/11/8b296d4aeaa1aa9e17f90b729aa4a5ff.jpg)
コマンドプロンプト上でこのファイルを呼び出して実行すると…
![](https://myhobbies-blog.net/wp-content/uploads/2023/11/7f92390e36c9645cdfcab1197c9adabb.jpg)
FLAGが出力されました。
解答欄にFLAGを入力して終了です。
![](https://myhobbies-blog.net/wp-content/uploads/2023/11/fbc1ff07c972958f736b77a6530eec5d.jpg)
無事正解となりました。
まとめ
さて、今回は30ポイントの問題を解いてみました。
問題文をGoogleで検索してPerlのスクリプトであることを確認、Perl環境を構築して実行という流れでFLAGがゲットできるので30ポイント問題といったところでしょうか。
この問題を通じて今まで触れて来なかったPerlや予約語、ppencodeというスクリプトについて知ることが出来、勉強になりました。皆さんも是非チャレンジしてください。
コメント