SlideShare a Scribd company logo
こわくない
CTF超入門
@kikuchan98
for 第12回セキュリティさくら
CTFとは
Capture The Flag: 旗とり合戦
●
攻防戦方式
●
クイズ方式
CTFとは
Capture The Flag: 旗とり合戦
●
攻防戦方式 (今日は割愛…)
●
クイズ方式 (入門にオススメ!)
サーバやプログラム、ファイル
などから、フラグという文字列を
機密情報になぞらえて奪取する
遊び
CTFとは
●
情報通信技術を用いた
「知恵の輪」
(by @9GHzさん)
(ごめん、当日、間違えてました…)
どんな問題が出る?
問題ジャンル
一般的には
●
Binary (リバースエンジニアリングなど)
●
Exploits (シェルコードなど)
●
Web
●
Forensics
●
Network
など
CTFのすゝめ
何が身につくか:
●
情報通信技術(ICT)に関する
幅広い技術・知識
●
高度なセキュリティ技術・知識
●
問題解決能力 (デバッグ力)
何故か?
出題範囲が広い
●
暗号理論
●
符号理論
●
信号処理
●
画像処理
●
通信技術
出題範囲が広い
●
組み込み技術
●
Web技術
●
公開鍵基盤(PKI)
●
プログラミング言語
●
データベース
出題範囲が広い
●
オペレーティングシステム
●
ファイルシステム
●
API (POSIX, Win32API)
●
ファイルフォーマット
●
符号化
出題範囲が広い
●
脆弱性,バグ
●
Exploits (Bin術)
●
情報の秘匿
●
ログ解析
●
ツール
●
雑学
…
……
………
広すぎね?
だから CTF をやろう
CTFを通じて、広範囲の高い技
術と知識を手に入れることがで
きる
●
ノウハウの塊
●
情報の高速道路に乗れる
というわけで
やってみよう
問題1
問題1
問題1
問題1
問題1
問題1
問題1
問題1
問題1
解けた?
で、何?
この問題は…
で、何?
この問題は…
●
重要な情報が欠落している
で、何?
この問題は…
●
重要な情報が欠落している
●
そのままでは読めない
で、何?
この問題は…
●
重要な情報が欠落している
●
そのままでは読めない
●
知識があれば復元可能
おk?
じゃあこれは?
問題2
実は
この問題も…
●
重要な情報が欠落している
●
そのままでは読めない
●
知識があれば復元可能
復元可能!
どうするか?
仕様
http://en.wikipedia.org/wiki/QR_code
仕様
http://en.wikipedia.org/wiki/QR_code
つまり
データが
残ってる
大差無い
詳しい手順は…
吉村くんの write-up
http://eleclog.quitsq.com/2014/01/seccon
-ctf-2013-online-forensics-400.html
または
「SECCON 2013 qr」
で検索
次
問題3 (暗号)
●
次の暗号文を解読しなさい
Uryyb, jrypbzr gb 
Frphevgl FNXHEN.
Jr ubcr lbh'ir 
rawblrq gur pbasrerapr.
暗号とは
●
解読方法を知らない人には
解読できない
●
意味の無い情報に見える
問題3 (暗号)
●
次の暗号文を解読しなさい
Uryyb, jrypbzr gb 
Frphevgl FNXHEN.
Jr ubcr lbh'ir 
rawblrq gur pbasrerapr.
問題3 (暗号)
●
次の暗号文を解読しなさい
Uryyb, jrypbzr gb 
Frphevgl FNXHEN.
Jr ubcr lbh'ir 
rawblrq gur pbasrerapr.
問題3 (暗号)
●
次の暗号文を解読しなさい
Uryyb, jrypbzr gb 
Frphevgl FNXHEN.
Jr ubcr lbh'ir 
rawblrq gur pbasrerapr.
スペース、記号の位置はそのまま?
⇒ アルファベットだけが対象?
問題3 (暗号)
●
次の暗号文を解読しなさい
Uryyb, jrypbzr gb 
Frphevgl FNXHEN.
Jr ubcr lbh'ir 
rawblrq gur pbasrerapr.
問題3 (暗号)
●
次の暗号文を解読しなさい
Uryyb, jrypbzr gb 
Frphevgl FNXHEN.
Jr ubcr lbh'ir 
rawblrq gur pbasrerapr.
考える
●
記号・スペースがそのまま
●
文章そのままの可能性
●
まずは、換字式暗号を仮定
●
大文字で始まる
●
とりあえず、英語を仮定
考える
● r が多い
● r ⇒ e を仮定する
● ‘ir から ’ve を予想
● i ⇒ v を仮定
● r ⇒ e の仮定と矛盾しない
問題3 (暗号)
●
当てはめる
Uryyb, jrypbzr gb 
Frphevgl FNXHEN.
Jr ubcr lbh'ir 
rawblrq gur pbasrerapr.
問題3 (暗号)
●
当てはめる
Ueyyb, jeypbze gb 
Fephevgl FNXHEN.
Je ubce lbh've 
eawbleq gue pbaseeeape.
考える
● gur から the を予想
● g ⇒ t, u ⇒ h の仮定
● r ⇒ e の仮定と矛盾しない
● gb から to を予想
● b ⇒ o の仮定
● g ⇒ t の仮定と矛盾しない
考える
●
ここまでの対応表
● r ⇒ e
● i ⇒ v
● g ⇒ t
● u ⇒ h
● b ⇒ o
問題3 (暗号)
●
当てはめる
Heyyo, jeypoze to 
Fephevtl FNXHEN.
Je hoce loh've 
eawoleq the poaseeeape.
別の角度からも考える
●
ASCIIコード(16進数)で考える
● 0x72 ⇒ 0x65
● 0x69 ⇒ 0x76
● 0x67 ⇒ 0x74
● 0x75 ⇒ 0x68
● 0x62 ⇒ 0x6f
別の角度からも考える
●
引いてみる
● 0x72 - 0x65 =  0x0d
● 0x69 - 0x76 = ­0x0d (0xf3)
● 0x67 - 0x74 = ­0x0d (0xf3)
● 0x75 - 0x68 =  0x0d
● 0x62 - 0x6f = ­0x0d (0xf3)
問題3 (暗号)
●
当てはめる
Heyyo, jeypoze to 
Fephevtl FNXHEN.
Je hoce loh've 
eawoleq the poaseeeape.
問題3 (暗号)
●
当てはめる
Hello, welcome to 
Fephevtl FNXHEN.
Je hoce loh've 
eawoleq the poaseeeape.
問題3 (暗号)
●
当てはめる
Hello, welcome to 
Security SAKURA.
Je hoce loh've 
eawoleq the poaseeeape.
問題3 (暗号)
●
当てはめる
Hello, welcome to 
Security SAKURA.
We hope you've
eawoleq the poaseeeape.
問題3 (暗号)
●
当てはめる
Hello, welcome to 
Security SAKURA.
We hope you've
enjoyed the conference.
問題3 (暗号)
答え
●
単換字式暗号
●
アルファベットが、13文字分
ずれている
●
別名 ROT13
問題3 (暗号)
http://en.wikipedia.org/wiki/ROT13
問題3 (暗号)
別解
●
見た瞬間、何故か読める
●
勘で解く
「どうせROT13じゃねぇの?」
●
当てずっぽうで色々な古典暗号
を試す
問題3 (暗号)
別解
● "Uryyb" でググる!
問題3 (暗号)
問題3 (暗号)
じゃあこれは?
問題4 (暗号)
問題4 (暗号)
一方…
ステガノグラフィとは
●
解読方法を知らない人には
解読できない
●
別の情報に見える
問題5 (ステガノ)
問題5 (ステガノ)
問題5 (ステガノ)
問題5 (ステガノ)
全部奇数
例)
R: 209
G: 173
B: 151
問題5 (ステガノ)
この辺だけ偶数
例)
R: 212
G: 140
B: 70
プログラム
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
main()
{
        char buf[1024];
        int ch;
        fputs(fgets(buf, sizeof(buf), stdin), stdout);
        fputs(fgets(buf, sizeof(buf), stdin), stdout);
        fputs(fgets(buf, sizeof(buf), stdin), stdout);
        while ((ch = getchar()) != EOF) {
                putchar((ch & 1) ? ch / 2 : 255);
        }
}
プログラム
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
main()
{
        char buf[1024];
        int ch;
        fputs(fgets(buf, sizeof(buf), stdin), stdout);
        fputs(fgets(buf, sizeof(buf), stdin), stdout);
        fputs(fgets(buf, sizeof(buf), stdin), stdout);
        while ((ch = getchar()) != EOF) {
                putchar((ch & 1) ? ch / 2 : 255);
        }
}
プログラム
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
main()
{
        char buf[1024];
        int ch;
        fputs(fgets(buf, sizeof(buf), stdin), stdout);
        fputs(fgets(buf, sizeof(buf), stdin), stdout);
        fputs(fgets(buf, sizeof(buf), stdin), stdout);
        while ((ch = getchar()) != EOF) {
                putchar((ch & 1) ? ch / 2 : 255);
        }
}
奇数のときは、明るさ1/2
偶数のときは、白
実行
% pngtopnm pizza.png | ./a.out 
| pnmquant 256 | ppmtosixel
実行
% pngtopnm pizza.png | ./a.out 
| pnmquant 256 | ppmtosixel
まとめ
●
CTFはICTを活用した知恵の輪
●
技術力の向上
●
腕試し
●
セキュリティ意識の向上
●
PC1台で簡単に遊べる
●
こわくない
Gunax lbh sbe
yvfgravat!
Thnax loh soe
yvfgeavat!
Thnnx loh soe
yvfgenvnt!
Thank you for
listening!
CTF超入門 (for 第12回セキュリティさくら)
CTF超入門 (for 第12回セキュリティさくら)
あとがき(追記)
●
CTFの出題範囲っぽいものを書き出してみてた
けど、本当に多すぎたのでボツ。
次ページ以降に載せてるので、キーワード集と
かに使ってみてね。
分類が前のページと違ってるけどキニシナイ。
●
実在のCTFの紹介をするの忘れてた…。
常設では ksnctf や akictf とか。
オフラインだと ctf4b や SECCON といった活
動があるよ。
暗号理論
●
古典暗号
●
換字式暗号
●
転置式暗号
●
現代暗号
●
共通鍵暗号
●
公開鍵暗号
暗号理論
●
暗号解読, 攻撃法
●
暗号文単独攻撃
●
既知平文攻撃
●
サイドチャネル攻撃
●
バースデー攻撃
符号理論
●
圧縮, 伸長
●
ハフマン符号
●
LZ法
●
誤り検出
●
チェックサム, CRC
●
パリティ検査
●
ハッシュ関数 (MD5, sha1 など)
符号理論
●
誤り訂正
●
リードソロモン, BCH
●
疑似乱数
●
線形合同法 (rand, random)
●
Mersenne Twister
●
エンコード, デコード
●
Base64, uuencode, BinHex
信号処理
●
フーリエ変換
●
変調, 復調
●
AM, FM
●
PSK
●
PWM
●
フィルター
●
LPF, HPF
画像処理
●
2値化
●
エッジ検出
●
画像認識
●
文字認識
●
図形認識
●
顔認識
通信技術
●
無線技術
●
ネットワーク (プロトコル)
●
TCP/IP
●
HTTP, HTTPS
●
FTP
組み込み系技術
●
電子回路
●
トランジスタ, LED
●
論理回路
●
組み合わせ回路
●
順序回路
●
FPGA
●
Verilog, VHDL
Web技術
●
HTML, CSS, JavaScript
●
Cookie
●
HTTP
●
Headers (Host, Cookie)
●
Methods (GET, POST)
●
Status codes (200, 404, 401)
公開鍵基盤(PKI)
●
暗号スイート
●
認証局(CA)
●
証明書, 検証手段
●
SSL, TLS
プログラミング言語
●
C, C++
●
Python
●
JavaScript
●
アセンブラ
●
x86, x86_64
●
arm
●
sh3, sh4
オペレーティングシステム
UNIX系OS, Windowsなどの
OS固有な部分
●
操作方法, コマンド
●
特殊なファイルの場所
●
文化
●
ハマりどころ
API
●
POSIX
●
Win32 API
●
socket
ファイルシステム
●
FAT, FAT32, VFAT
●
FFS
●
Ext2fs
●
NTFS
●
ZFS
ファイルフォーマット
●
JPEG, PNG, GIF, BMP
●
ZIP, LZH, 7z, CAB
●
EXE, ELF, a.out
●
WAV
●
AVI, MP4
データベース
●
SQLite
●
MySQL
●
PostgreSQL
●
Oracle
●
MongoDB
雑学
●
モールス信号, 手旗信号
●
難解言語
●
パンチカード
●
文字コード (闇)
●
バーコード, 2次元バーコード
各種ツール
●
IDA, gdb, binutils
●
デコンパイラ
●
Metasploit
●
tcpdump, wireshark
●
nc, wget, curl
脆弱性, バグ
●
メモリ破壊
●
パーミッション不備
●
入出力の検証, 無害化漏れ
●
設定不備
●
設計不備
脆弱性の攻撃手法
●
既知のexploits
●
ディレクトリトラバーサル
●
バッファオーバーフロー, ROP
●
Code injection
●
SQL injection, Command injection
●
XSS, CSRF
●
中間者攻撃(MITM)
情報の秘匿
●
暗号化
●
難読化, アンパック
●
ステガノグラフィ
痕跡の情報
●
デバッグ情報
●
ログファイル
●
ヒストリーファイル
●
タイムライン解析

More Related Content

CTF超入門 (for 第12回セキュリティさくら)