1. HOME
  2. ブログ
  3. IT技術
  4. 【第2回】セキュリティエンジニアを目指して「CTF」を解く!

【第2回】セキュリティエンジニアを目指して「CTF」を解く!

【第2回】セキュリティエンジニアを目指して「CTF」を解いていく

セキュリティエンジニアへの需要が高まっているこの時代。

ネットワーク、サーバ、アプリケーション、OS など、「コンピュータ全般に関する、幅広い分野の知識や技術」が求められています。

前回の『【第1回】セキュリティエンジニアを目指して「CTF」を解く!』に引き続き、今回も CTF(Capture the flag)を解いていきます。

前回の記事はこちら

注意事項

  1. 前回に引き続き、常設 CTF のCpawCTFを利用します。
  2. 今回のコードは、Docker Official Images の gcc イメージ を使用して動作確認を行っています。
  3. 情報は2020年4月6日現在のものです。

CpawCTF「Q20.[Crypto]Block Cipher」にチャレンジ!

こちらは、「Q20.[Crypto]Block Cipher」の問題内容になります。

与えられたC言語のソースコードを読zみ解いて復号してフラグを手にれましょう。

暗号文:cpaw{ruoYced_ehpigniriks_i_llrg_stae}

引用:CpawCTF

添付されているソースコードは、以下の通りになります。

「問題文」から傾向を掴む!

CTF の問題には、問題文に大きなヒントが隠されていることが多くあります

問題のタイトルには「Crypto(暗号)」というキーワードがあります。

問題文にも、「復号」、「暗号文」というキーワードがあり、暗号の問題であることがわかります

また、タイトルは「Block Cipher(ブロック暗号)」というキーワードがあり、ブロック暗号に関する問題であることがわかります

「ブロック暗号」とは?

「ブロック暗号」は、データを一定の長さごとに区切って、そのブロックごとに暗号化を行うものです。

単位ごとに区切っているので、暗号化と復号化が高速で行えるという特徴があります。

近年、インターネット上で扱われる情報は非常に長いため、そのほとんどがブロック暗号方式で暗号化されています。

ブロック内のデータ列を、「鍵」と呼ばれる値に基づいて順番を入れ替えます。

1ビットごとに暗号化するものは、「ストリーム暗号」と呼ばれ、区別されます。

「ソースコード」を読み解く!

さて、この問題には以下のようなコードが添付されています。

問題文には「ソースコードを読み解いて」というセンテンスがあり、ソースコードを読み解くことがポイントとなりそうです。

「変数名」から読み解く!

変数の名前は、重要なヒントの1つです。

argv は、「引数の配列」を表しています。

const char * flag = argv[1]; の部分から、「コマンドライン引数の1つ目には、フラグに関する文字列を指定する」と推測できます。

問題文に記されている、暗号文「ruoYced_ehpigniriks_i_llrg_stae」あたりを指定すると良さそうです。

コード中で使用されている atoi 関数は、「ASCII to Integer」の略で、文字列を整数型に変換する C言語の標準ライブラリ関数です。

これにより、 int key = atoi(argv[2]); の部分から「コマンドライン引数の2つ目には、鍵となる整数文字列を指定する」と推測できます。

「暗号文」から読み解く!

暗号文「ruoYced_ehpigniriks_i_llrg_stae」の、4文字目が大文字となっているのが目につきます。

また、先頭部分「ruoY」を逆から読むと「Your」となります。

これだけでは何とも言えませんが、「4」をサンプル鍵として、ソースコードの残り部分のループ部分を見ていきたいと思います。

「コード」から読み解く!

ループ部分だけを抜粋すると以下の通りです。

「key=4」としてみていくと、「i=3」からループがスタートします。

2つ目のループでは「j=3」からスタートし、「j=0」となるまで、 j が1ずつ減っていきながら、 flag[j] の値が出力されます。

「key=4」の場合、2つ目のループでは、まず、flag[3]、flag[2]、flag[1]、flag[0]と出力され、「Your」となりそうです。

その後、1つ目のループに戻って、「i=7」、「i=11」、「i=15」…と、順次、同様の処理が実行されるようです。

以上の内容から、key(今の場合は4)の文字数の単位(もしくはブロック)で、順次、逆から読んでいくというようなプログラムであることがわかります。

号文「ruoYced_ehpigniriks_i_llrg_stae」の大文字の位置が4番目であることと、プログラムの内容から「key=4」が有力そうです。

「総当たり」で最終チェック!

「key=4」が有力ですが、念のため、総当たりで確認しておきます。

コード

コードの内容は以下の通りです。

総当たり用に、元のコードを少し調整しています。

「key=4」で意味のある文章になったのではないでしょうか。

今回作成したソースコード

今回作成したソースコードは、以下のリポジトリにまとめてあります。

【rightcode / ctf-trial】
https://github.com/rightcode/ctf-trial

ソースコードや結果を確認する場合は、上記のリポジトリをクローンしてください。

結果の確認コマンド

以下のコマンドで、結果を確認できます。

※結果の確認には Docker と Docker Compose を使用しています。
Docker をインストールしていない場合は、確認用のコードを環境に合わせて調整してください。

第3回へつづく!

いかかでしたでしょうか!

「CTF」では問題文をしっかり読むことが非常に大事であるということがわかりました。

実際のセキュリティの世界でも、「ハッカーは自己顕示欲が強く、自分の作ったランサムウェアの解除法などをわかりにくいように隠す行動が見られる」というような報告もあります。

そのような、攻撃者の性質を見逃さず、細かいところを見て解析することが重要です!

次回の記事もお楽しみに!

(株)ライトコードは、WEB・アプリ・ゲーム開発に強い、「好きを仕事にするエンジニア集団」です。
システム開発依頼・お見積もりはこちらまでお願いします。
また、WEB・アプリエンジニアを積極採用中です!詳しくはこちらをご覧ください。

※現在、多数のお問合せを頂いており、返信に、多少お時間を頂く場合がございます。

第3回の記事はこちら

こちらの記事もオススメ!

関連記事

ライトコードよりお知らせ

にゃんこ師匠にゃんこ師匠
システム開発のご相談やご依頼はこちら
ミツオカミツオカ
ライトコードの採用募集はこちら
にゃんこ師匠にゃんこ師匠
社長と一杯飲みながらお話してみたい方はこちら
ミツオカミツオカ
フリーランスエンジニア様の募集はこちら
にゃんこ師匠にゃんこ師匠
その他、お問い合わせはこちら
ミツオカミツオカ
   
お気軽にお問い合わせください!せっかくなので、別の記事もぜひ読んでいって下さいね!

一緒に働いてくれる仲間を募集しております!

ライトコードでは、仲間を募集しております!

当社のモットーは「好きなことを仕事にするエンジニア集団」「エンジニアによるエンジニアのための会社」。エンジニアであるあなたの「やってみたいこと」を全力で応援する会社です。

また、ライトコードは現在、急成長中!だからこそ、あなたにお任せしたいやりがいのあるお仕事は沢山あります。「コアメンバー」として活躍してくれる、あなたからのご応募をお待ちしております!

なお、ご応募の前に、「話しだけ聞いてみたい」「社内の雰囲気を知りたい」という方はこちらをご覧ください。

ライトコードでは一緒に働いていただける方を募集しております!

採用情報はこちら

関連記事

採用情報

\ あの有名サービスに参画!? /

バックエンドエンジニア

\ クリエイティブの最前線 /

フロントエンドエンジニア

\ 世界はお前の手の中に・・・ /

モバイルエンジニア

\ サービスの守り神! /

インフラエンジニア