今回はCTFの問題を解いてみました
解説動画はこちら
CTFとは
さて、まずCTFとは何でしょうか?
CTF(Capture The FLAG )
のことで情報セキュリティの分野で
専門知識や技術を駆使して
クイズ形式の問題の他
疑似的な攻防戦も有り
この問題が解ける様になると
次のような技術向上のメリットがあります
世界中でこういった問題が
解けるサイトがありますが
日本にも問題が解けるサイトがあるので
今回はこちらの問題を拝借いたします
のようになります
平文を暗号化、暗号を平文にするのも
同じプログラムで出来るので
シーザー暗号を作るプログラムを考えれば
この問題を解けます
このようなコードで暗号解読できます
ここから画像のExif情報を抽出します
Exif情報はかなりたくさんの項目がありますが
GPSの緯度経度を取得します
画像のExif情報を取得するコード
ExifのGPSは度分秒なので
10進法にするには変換が必要です
あとはこの緯度経度を
地図に打ち込んで見てみましょう
そうすると
こんな場所でした
拡大してみると
鹿児島県にある川の
陸橋の上あたりから
取られた写真であることが分かります
この川の名前が答えですね
最後は
次のC言語のコードを実行すると
まとめ
CTFには
暗号解読やフォレンジックスなど
プログラミングで解ける問題も
多く含まれています
プログラミング技術の向上意外にも
セキュリティー知識を身に付けるための
問題が数多くあるので
これを解ける様になると
セキュリティーに関する技術力の
向上が見込めると思います
それでは
解説動画はこちら
CTFとは
さて、まずCTFとは何でしょうか?
CTF(Capture The FLAG )
のことで情報セキュリティの分野で
専門知識や技術を駆使して
隠されているFlag(答え)を見つけ出し
時間内に獲得した合計点数を競う
ハッキングコンテストのことになります
ハッキングコンテストのことになります
クイズ形式の問題の他
疑似的な攻防戦も有り
以下のような技術が必要となってきます
・ネットワーク
通信技術、トラフィックのキャプチャ
・フォレンジクス
情報の秘匿、ログ解析、ファイルフォーマット、データの復元
・Web技術
Webアプリケーションの脆弱性、データベースアクセス
・プログラミング
プログラミング言語、組み込み技術、リバースエンジニアリング
・暗号化技術
符号化、公開鍵基盤(PKI)
・脆弱性調査
バグ、攻撃コードの送信
この問題が解ける様になると
次のような技術向上のメリットがあります
情報セキュリティに対する知識が身につく
情報セキュリティに限らない広範囲の知識が身につく
実践的なスキルが身につく
トラブルシューティングのカンが身につく
世界中でこういった問題が
解けるサイトがありますが
日本にも問題が解けるサイトがあるので
今回はこちらの問題を拝借いたします
https://ctf.cpaw.site/index.php
なお問題を見るにはアカウントが必要です[Crypto] 1
古典暗号文解読の問題です
シーザー暗号というものがあります
これは元の平文を何文字かシフトさせたものです
これは元の平文を何文字かシフトさせたものです
アルファベットでシーザー暗号を考えると
平文 : abc
3文字シフト
暗号文 : def
のようになります
平文を暗号化、暗号を平文にするのも
同じプログラムで出来るので
シーザー暗号を作るプログラムを考えれば
この問題を解けます
このようなコードで暗号解読できます
st = 'fsdz{Fdhvdu_flskhu_lv_fodvvlfdo_flskhu}' def caesar_cipher_encrypt(plaintext , key): cipher = "" for p in list(plaintext): if 'A' <= p <= 'Z': cipher += chr((ord(p) - ord('A') + key)%26 + ord('A')) elif 'a' <= p <= 'z': cipher += chr((ord(p) - ord('a') + key)%26 + ord('a')) else: cipher += p return cipher for i in range(20,26): print(i,caesar_cipher_encrypt(st , i))
[PPC]
並べ替えの問題です
配列の中身を大きい順に並べ替えて
くっつけて 並べ替えた後の値
がフラグになります
配列のソート
数値の文字列化
文字列の連結
これが出来ればこの問題が解けるので
プログラムに関わらず
エクセルやテキストエディターなどでも
解くことは出来ると思います
一応この問題を解くコードはこれです
そこから撮影場所を
特定することも出来たりします
がフラグになります
配列のソート
数値の文字列化
文字列の連結
これが出来ればこの問題が解けるので
プログラムに関わらず
エクセルやテキストエディターなどでも
解くことは出来ると思います
一応この問題を解くコードはこれです
data = [15,1,93,52,66,31,87,0,42,77,46,24,99,10,19,36,27,4,58,76,2,81,50,102,33,94,20,14,80,82,49,41,12,143,121,7,111,100,60,55,108,34,150,103,109,130,25,54,57,159,136,110,3,167,119,72,18,151,105,171,160,144,85,201,193,188,190,146,210,211,63,207] txt = 'cpaw{{{0}}}' txt = txt.format(''.join(map(str,sorted(data,reverse=True)))) print(txt)
[Forensics]
画像解析の問題です
画像ファイルには位置情報など
様々な情報(Exif情報)が
付加されることがあるので
付加されることがあるので
そこから撮影場所を
特定することも出来たりします
写真に写っている川の名前を特定する問題で
画像名は river.jpg です
画像をみたい方は問題のサイトに
アクセスして手に入れて頂くか
画像名は river.jpg です
画像をみたい方は問題のサイトに
アクセスして手に入れて頂くか
動画の方をみてくださいませ
画像を見るコードはこれです
from PIL import Image import PIL.ExifTags as ExifTags import matplotlib.pyplot as plt file_path = 'river.jpg' img = Image.open(file_path) plt.imshow(img) plt.axis('off') plt.show()
ここから画像のExif情報を抽出します
Exif情報はかなりたくさんの項目がありますが
GPSの緯度経度を取得します
画像のExif情報を取得するコード
exif = {} exif = img._getexif() for k, v in exif.items(): if k==34853: for gk,gv in v.items(): print(gk,gv)
0 b'\x02\x03\x00\x00'
1 N
2 (31.0, 35.0, 2.76)
3 E
4 (130.0, 32.0, 51.7272)
緯度・経度は一般に度・分・秒で表します
分,秒は時間と同じように60進法になっています
秒に小数点以下の数値をつける場合は
秒の後ろに10進法で表します
ExifのGPSは度分秒なので
10進法にするには変換が必要です
deg , minu , sec = 31.0, 35.0, 2.76 N = deg + minu/60.0 + sec/3600.0 deg2 , minu2 , sec2 = 130.0, 32.0, 51.7272 E = deg2 + minu2/60.0 + sec2/3600.0 print('{0},{1}'.format(N,E))31.5841,130.547702
あとはこの緯度経度を
地図に打ち込んで見てみましょう
そうすると
こんな場所でした
拡大してみると
鹿児島県にある川の
陸橋の上あたりから
取られた写真であることが分かります
この川の名前が答えですね
[Crypto] 2
最後は
次のC言語のコードを実行すると
回答が得られる問題です
元のCのプログラムを見てみると
暗号を平文に直すアルゴリズムのようでした
C言語が分かる方は
そのまま実行すれば答えば出てきます
元のCのプログラムを見てみると
暗号を平文に直すアルゴリズムのようでした
C言語が分かる方は
そのまま実行すれば答えば出てきます
C言語が分からない人は
他の言語に直すのもアリです
Pythonに直してみると
次の様なコードになります
flag = 'ruoYced_ehpigniriks_i_llrg_stae' for key in range(2,7): answer = '' for i in range( key - 1, len(flag)+1,key): for j in range(i , i-key , -1): idx = j if j < len(flag): answer+=flag[idx] print(x , 'cpaw{{{0}}}'.format(answer))
まとめ
CTFには
暗号解読やフォレンジックスなど
プログラミングで解ける問題も
多く含まれています
プログラミング技術の向上意外にも
セキュリティー知識を身に付けるための
問題が数多くあるので
これを解ける様になると
セキュリティーに関する技術力の
向上が見込めると思います
それでは