WTF!?

オンサイトCTFのWriteupとか書いてく.

サイバー甲子園 Write up

SECCONのintercollegeの予選のサイバー甲子園に参加した.

2015.seccon.jp

193sと一緒にscryptosとして出場し優勝した.
自分の解いた問題のwrite upを書く.

Find from binary - Bin 100

fileコマンドを叩いてみると

questions: ELF 32-bit LSB  executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=0ae2183f11574b7147809273d6069958ff21eb70, not stripped

とりあえずIDAに喰わせてみる.

f:id:nanuyokakinu:20151108101921p:plain

絶対通らない分岐先でflagを表示する処理に入っている.
バイナリ書き換えたりデバッガで値変えたりするという方法もあるが,
動かすのが面倒だったのでIDAのHex Viewからコピーしてsubmitした.

flag: SECCON{Can U read me?}

Guess the flag - Bin 200

fileコマンドを叩いてみると

guess: ELF 32-bit LSB  executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=f1a2e385b6a77f23bf5528c7303300309e8d827a, not stripped

IDAに喰わせてみる.

f:id:nanuyokakinu:20151108102003p:plain

fgetsで受け取った文字列にNOT演算を掛けて,
0x8048700にあるバイト列と比較して,32バイト一致していたらいいらしい.
bin100と同様にIDAのHex Viewからコピーしてpythonでゴチャゴチャやってflagを出した.

flag: SECCON{XOR_encryption_message}

XOR encription ……?

Invisible message - Net 100

pcapファイルが渡された.
HTTPの通信をしてるのでHTTPで受け渡しされたhtmlとか色々見てみるが,
どれも特に怪しい感じがしなかった.
しばらくpcapを眺めていると,パケットのヘッダー部分にSECC...という文字列が見えた.
よくよく見てみるとクライアントからサーバーへSYNを飛ばし,
SYN/ACKが帰ってきたらすぐにRSTする通信が度々行われており,
これにflagが乗っかっているらしい.

f:id:nanuyokakinu:20151108102055p:plain

wirwsharkの条件式の使い方がわからず,
これに気づいたのが終了15分前ぐらいで
調べる時間もなかったので目grepでflagを出した.

flag: SECCON{Data_is_included_NOT_ONLY_in_payload_but_also_header_field.}

これ絶対100ptsじゃないだろ……

Follow the mail - Net 300

pcapを開くとsmtpの通信があるが,
文字コードISO-2022-JPだったりUTF-8だったりしてそのままでは読めない.
Follow TCP StreamでShow data as Hex Dumpとし,
メール本文のバイト列をコピー,
バイナリエディタに貼っつけてテキストエディタで読んだ.
全部のメールを読むと,flag.zipがメールに添付されており,
zipを解凍するためのパスワードはseccon2015_takesako
zipの中身の文書を開く時のパスワードはtakesako_tessy_sonodam
とのことらしい.

取り敢えずpcapからflag.zipを取り出してseccon2015_takesakoで解凍した.
すると中から出てきたのは,またflag.zipだった.
出てきたflag.zipにfileコマンドをかけてみると.
flag.zip: Composite Document File V2 Document, No summary info
だった.
これは.docだったり.xlsだったりを指しているので,
flag.docとしてMicrosoft Wordに開かせ,
パスワードにtakesako_tessy_sonodamを入力するとflagが現れた.

flag: SECCON{Sending_File_Password_with_Followed_Mail_is_bogus.}

前にもTDUCTFでメールの問題が出たが, その時も人力でメール本文のバイナリを引っこ抜いた.
どうにかこうにか簡単にメール本文だけ引っこ抜くことは出来ないのだろうか.
イケメンパケリスト各位に教えて頂きたい.

Excel

エクセルファイルが渡された.
開いてみるとこんな感じ.

f:id:nanuyokakinu:20151108102232p:plain

多分,値の部分に何か隠れているのだろうと適当にセルを見た.
すると#が値に入っているセルがあったので色の付いたセル全体をコピーして,
「形式を選択してペースト」で値だけをペーストしてやると

f:id:nanuyokakinu:20151108102301p:plain

横幅を調整してやると

f:id:nanuyokakinu:20151108102311p:plain

flag: SECCON{NIRVANA_KA1}

エスパーやな

感想

Bin300ふぁっく

ScrapChallenge 2015 に参加した

ScrapChallengeとは

mixiの社員の方がmixiサービスのクローンに対して脆弱性を仕込み,
その脆弱性をいかに早く発見し,攻撃できるかというイベント.

alpha.mixi.co.jp

前々からWebセキュリティの知識が足りてないところがあり,
また実際のサービスの脆弱性は何処に目をつけて探せばいいのか知りたかったので
Webセキュリティの人権を得るために参加した.


始まる前

会場に着くと既にチーム分けがされており,
農工大の方々(2人)との3人構成のチームだった.
(後から聞いた話によると今回は地域別にチーム分けをしたらしい.)


Webセキュリティ概論

Webセキュリティの基礎的な説明を受けた.


チュートリアル

小手試しにXSSを見つける問題が出た.


ランチ

8月29日(焼き肉の日)ということで,叙々苑の焼肉弁当を用意されていた.
ここまで豪華な昼ご飯は久しぶりだった.


競技開始

最初は5問公開された.
取り敢えず取れそうな問題を解こうとしたがなかなか解けず,
Hintが出されてからやっと1問解けた.他の二人もその内に何問か解けていた.
その後6問公開され,そっちのほうが解きやすそうだなとやってみたところ,
時間はかかったものの1問解けた.
その頃には他2人が前半の問題をある程度解いてくれていた.
隣の席の人に後半の問題をバトンタッチし,
前半の解けていなかった問題をギリギリsubmitしたところで競技終了となった.


問題解説

自分の担当しなかった問題や解けなかった問題の解説が聞けた.


結果発表

残念ながらTop3には入れなかった.
結果発表の後,話を聞くと3位と1ポイント差の4位だったらしく,
あと1問解けていればという感じだったらしい.


懇親会

運営の方や前からよく知っているが遠方に住んでいるため中々会えない
某某某氏と話をしたり出来てよかった.
社員の方に自分の学校のOBが居たのには驚いた.


まとめ

ちゃんとしたサービスに対し攻撃する感じは,
CTFのWeb問とは異なりとても面白かった.
このScrapChallengeでWebセキュリティをもっと学びたいと思えたので
参加してよかったと思う.


常設CTFまとめ

ある程度の需要があるっぽいのでまとめておいた.
Twitterとかで広めて頂けるとありがたい.
CTFをこれから始める人にはpicoctfがおすすめ.


国内サイト

ksnctf

http://ksnctf.sweetduet.info

kusano(@kusano_k)さんが運営するCTF

CTFを始めるならこれと紹介されている事が多い気がする

akictf

http://ctf.katsudon.org

akiym(@akiym)さんが運営するCTF

Web問多し

ED CTF

https://ctf.npca.jp

EpsilonDeltaが運営するCTF

1度npca.jpドメインが死んで以降復旧されていないらしい

MMA CTF

https://ctf.mma.club.uec.ac.jp

電気通信大学MMAが運営するCTF

CryptoやPPCが得意なチームなのでそのジャンルの問題は良問揃い

ES CTF

http://s01.elliptic-shiho.xyz/ctf/

Shiho Midorikawa(@elliptic_shiho)さんが運営するCTF

問題投稿,正答者間でのWrite up共有が可能

2017/1/23(月) 現在閉鎖中

Flaggers

http://ctf.nash-dev.com

nash(@nash_fs)さんが運営するCTFの問題を出し合うコミュニティサイト

MNCTF

MNCTF2018

http://mnctf.info/mnctf2018/

MNCTF2017

http://mnctf.info/mnctf2017/

MNCTF2016

http://mnctf.info/mnctf2016/

MNCTF2015

http://mnctf.info/mnctf2015/

とっきー(@tokky_cpp)さんから教えていただきました.
ありがとうございます.

Macnica Networks DAY 2015で行われたCTFが公開され常設化したもの

柚子胡椒CTF

http://ctf.mzyy94.com

かの有名な柚子胡椒氏のCTF

CpawCTF

https://ctf.cpaw.site

プロのプロによる初心者のためのCTF
CTFのプロのぱろっく氏(@porisuteru)が主導で運営している
初心者向けCTFサイト

CpawCTF2

https://ctf2.cpaw.site

CpawCTFの続編

YEHD 2015 CTF

https://2015-yehd-ctf.meiji-ncc.tech

明治大学中野キャンパスで活動するNakano Computer Club(NCC)が開催した,

Year End's Hack Dayの中で行われたCTFが常設化したもの

MAGURO β

https://score.maguro.run

サイバーディフェンス研究所が運営するCTF


海外サイト

初心者向け

picoctf

picoctf 2019

https://2019game.picoctf.com/

picoctf 2018

https://2018game.picoctf.com/

HackCenter

https://hackcenter.com

pwn専門

pwnable.kr

http://pwnable.kr

pwnable.tw

https://pwnable.tw

pwnable.xyz

https://pwnable.xyz

Exploit Exercises

https://exploit-exercises.com

Crypto専門

id0-rsa

https://id0-rsa.pub

Web専門

Wargame.kr

http://wargame.kr

Stereotyped Challenges

https://chall.stypr.com

Websec

http://websec.fr

hackburger.ee

http://hackburger.ee

Solve Me

http://solveme.safflower.kr

CanHackMe

https://canhack.me

Reversing専門

Reversing.Kr

http://reversing.kr

Embedded Security CTF

https://microcorruption.com

RE CTFd

https://reversing.ctfd.io

MOBISEC

https://challs.reyammer.io/

総合

LSE CTF

https://ctf.lse.epita.fr

Root Me

http://www.root-me.org

CSAW 365

https://365.csaw.io

ROP Wargames

https://game.rop.sh

hack.cert.pl

https://hack.cert.pl/

247CTF

https://247ctf.com/

Bamboofox

https://bamboofox.cs.nctu.edu.tw/

XCTF OJ

http://oj.xctf.org.cn/web/practice/

PwnerRank

https://www.pwnerrank.com

RingZer0 Team Online CTF

http://ringzer0team.com

OverTheWire

http://overthewire.org

CTF All The Time

https://ctfs.me

Ryan's CTF

http://ctf.ryanic.com/

canyoupwn.me

https://ctf.canyoupwn.me

Тренировки

http://training.hackerdom.ru

Security Shepherd

https://ec2-35-162-97-34.us-west-2.compute.amazonaws.com/login.jsp

UOSEC CTF

https://ctf.uosec.info

CTFLearn

https://ctflearn.com

Net-Force

https://www.net-force.nl

::SuNiNaTaS::

http://suninatas.com

NewbieContest

https://www.newbiecontest.org/index.php

CanYouHack.It

http://canyouhack.it

EnigmaGroup

http://www.enigmagroup.org

W3Challs

https://w3challs.com/

Challenge Land

http://challengeland.co

Valhalla

http://halls-of-valhalla.org/beta/challenges

HACKTHIS!!

https://www.hackthis.co.uk

HellBound Hackers

https://www.hellboundhackers.org

Hacker Gateway

https://www.hackergateway.com

NOE.systems

http://noe.systems

Hack The Box

https://www.hackthebox.eu

Shellter Labs

https://shellterlabs.com

OnlineCTF.com

https://www.onlinectf.com/

Salus Lab

http://ctf.saluslab.net

0xf.at

https://0xf.at

Jarvis OJ

https://www.jarvisoj.com/

南京邮电大学

http://ctf.nuptsast.com/

bugku

http://ctf.bugku.com/


セキュリティ・キャンプ全国大会2015に応募した

セキュリティ・キャンプ全国大会2015に応募した.
去年の募集の時点で存在は知っていたが,応募用紙を見て挫折.
1年間CTFやら何やらやってたら応募用紙をある程度埋められるようになってて嬉しかった.

共通問題1

セキュリティ・キャンプに応募した自分なりの理由とセキュリティ・キャンプで学んだことを何に役立てたいかを教えてください。

バイナリ読むのが大好きだとか,セキュキャンでは出会い厨になりたいとか書いた.

共通問題2

セキュリティに関することで、過去に自分が経験したことや、ニュースなどで知ったことの中から、最も印象に残っていることを教えてください。また、その印象に残った理由も教えてください。

授業で作ったプログラムに脆弱性があって云々の話をした.

共通問題3

その他に自己アピールしたいことがあれば自由に書いてください。(たとえば、あなたが希望する講座を受講する上で、どのような技術力を持っているか、部活動、技術ブログ、GitHub、ソフトウェア開発、プログラミングコンテスト、勉強会での発表・運営などの実績や熱意があれば、あるだけ書いてください。)

CTFやってるとか書いた.

選択問題2

ある機械語をobjdumpにより逆アセンブルしたところ、以下の結果が得られました。このダンプに見られる問題点を指摘してください。

00000000 <.text>:
   0:   b8 de 07 00 00       mov   $0x7de,%eax
   5:   3d df 07 00 00       cmp   $0x7df,%eax
   a:   75 06                jne   0x12
   c:   89 c0                mov   %eax,%eax
   e:   ff e3                jmp   *%ebx
  10:   75 01                jne   0x13
  12:   e9 5b ba 0e 00       jmp   0xeba72
  17:   00 00                add   %al,(%eax)
  19:   b9 00 00 00 00       mov   $0x0,%ecx
  1e:   bb 01 00 00 00       mov   $0x1,%ebx
  23:   b8 04 00 00 00       mov   $0x4,%eax
  28:   cd 80                int   $0x80
  2a:   b8 01 00 00 00       mov   $0x1,%eax
  2f:   cd 80                int   $0x80

x86CISCとして設計されたので,可変長命令を用いている.そのため,エントリポイントが異なる場合異なる処理を行う.
上記のダンプはtextセクションの先頭をエントリポイントとして逆アセンブルしている.
しかし,上記のプログラムを先頭から実行すると必ずjmp 0xeba72でSegmentation Faultを起こし,異常終了してしまう.
また上記のダンプには奇妙な命令がいくつか出てきている.

  10:   75 01                jne   0x13
  12:   e9 5b ba 0e 00       jmp   0xeba72
  17:   00 00                add   %al,(%eax)

である.もしEFLAGSのZFがセットされていない状態でjne 0x13を実行した場合,次に実行されるのは5bから始まる命令である.
つまり,上記のダンプでは解析できない処理を行うことになる.そこで,<.text+0x13>をエントリポイントとして逆アセンブルをすると次のようになる.

   0:   5b                   pop   %ebx
   1:   ba 0e 00 00 00       mov   $0xe,%edx
   6:   b9 00 00 00 00       mov   $0x0,%ecx
   b:   bb 01 00 00 00       mov   $0x1,%ebx
  10:   b8 04 00 00 00       mov   $0x4,%eax
  15:   cd 80                int   0x80
  17:   b8 01 00 00 00       mov   $0x1,%eax
  1c:   cd 80                int   0x80

これを実行すると1つ目のsystem callでwrite(1, null, 0xe);,2つ目のsystem callで_exit();を行う.
この動作は問題文のダンプからは読み取ることが出来ない.これが問題点である.
このように途中の命令バイトにジャンプすることで解析しにくくする技法マルウェアにも用いられている.

選択問題3

過去に作成したプログラムのうち最も気に入っているものについて答えてください。 ここでいうプログラムは、Webサービスやモバイルアプリ、サーバ/デスクトップアプリケーションあるいはOS、VMなどといったソフトウェア全般のことです。 (1)どのようなソフトウェアであるかを教えてください (2)何の目的のためにそれを作ろうと思ったのか、理由を教えてください (3)開発するにあたって工夫したところを教えてください (4)新たな課題、今後勉強してみたいと思っている内容を書いてください

去年の高専プロコンで作ったものについて書いた.

選択問題5

以下のようなC言語の関数functionがあるとします。

void function(int *array, int n) {
  int i;
  for(i = 0; i < n; i++) {
    array[i] = i * n;
  }
}

上記プログラムをコンパイルした結果の一例 (i386)は以下となりました。

00000000 <function>:
   0:   56                   push   %esi
   1:   53                   push   %ebx
   2:   8b 5c 24 0c          mov    0xc(%esp),%ebx
   6:   8b 4c 24 10          mov    0x10(%esp),%ecx
   a:   85 c9                test   %ecx,%ecx
   c:   7e 18                jle    26 <function+0x26>
   e:   89 ce                mov    %ecx,%esi
  10:   ba 00 00 00 00       mov    $0x0,%edx
  15:   b8 00 00 00 00       mov    $0x0,%eax
  1a:   89 14 83             mov    %edx,(%ebx,%eax,4)
  1d:   83 c0 01             add    $0x1,%eax
  20:   01 f2                add    %esi,%edx
  22:   39 c8                cmp    %ecx,%eax
  24:   75 f4                jne    1a <function+0x1a>
  26:   5b                   pop    %ebx
  27:   5e                   pop    %esi
  28:   c3                   ret  

このとき以下の(1)~(5)の設問について、回答と好きなだけ深い考察を記述してください。知らない点は、調査したり自分で想像して書いてもらっても結構です。どうしてもわからない部分は、具体的にここがわかりませんと記述しても良いです。(1)~(2)の回答は必ず答えてください。(3)~(5)の回答は任意です。わかることを書いてください。CPU やコンパイラは特定の実装を例に説明しても良いですし、理想を自由に考えても良いです。

(1)【必須】上記の C 言語のプログラムはどのような動作をしますか。また、この関数を呼び出して利用する main 関数の例を作成してください。 (2)【必須】上記のアセンブリコードを、いくつかのブロックに分割して、おおまかに何をしている部分かを説明してください。もし、上記のアセンブリが気に入らないのであれば、好きなアーキテクチャコンパイラアセンブル結果を載せて説明しても良いです。 (3)【任意】 コンパイラソースコードの関数を解釈して、ターゲットのアーキテクチャのバイナリを生成するまで、どのように内部で処理を行っていると思いますか。(キーワード: 構文解析、変数、引数、呼出規約、レジスタ、スタック、アセンブラ、命令セット) (4)【任意】CPU の内部では、プログラムのバイナリはどのように解釈され実行されていると思いますか。(キーワード: フェッチ、デコード、オペコード、オペランド、命令パイプライン、回路) (5)【任意】現在の CPU やコンパイラの不満点があれば自由に記述してください。

(1)
このfunction関数は第一引数にint型配列のポインタを受け取り,第二引数でint型の値を受け取る.
arrayの先頭からn番目の要素まで,インデックス × n の値を代入する.
つまり,この関数を用いることで 0 〜 n * (n - 1)までのnの倍数を生成できる.
main関数の例:

int
main()
{
    int i;
    int n;
    int *array;

    printf("Please input natural number > ");
    scanf("%d", &n);
    if(n <= 0) return 0;
    array = (int *) malloc(sizeof(int) * n);
    if(array == NULL) return 0;
    function(array, n);
    for(i = 0; i < n; i++){
      printf("%d\n", array[i]);
    }
    return 0;
}

(2)
上記のアセンブリが気に入らないのでアーキテクチャx86コンパイラgcc version 4.9.2 (Debian 4.9.2-10)を用いる.

ソースコードとの対応
080483cb <function>:
 80483cb: 55                    push   ebp                      ;
 80483cc: 89 e5                 mov    ebp,esp                  ;
 80483ce: 83 ec 10              sub    esp,0x10                 ; int i;
 80483d1: c7 45 fc 00 00 00 00  mov    DWORD PTR [ebp-0x4],0x0  ; i = 0;
 80483d8: eb 1c                 jmp    80483f6 <function+0x2b>  ;
 80483da: 8b 45 fc              mov    eax,DWORD PTR [ebp-0x4]  ;
 80483dd: 8d 14 85 00 00 00 00  lea    edx,[eax*4+0x0]          ;
 80483e4: 8b 45 08              mov    eax,DWORD PTR [ebp+0x8]  ;
 80483e7: 01 c2                 add    edx,eax                  ;
 80483e9: 8b 45 fc              mov    eax,DWORD PTR [ebp-0x4]  ;
 80483ec: 0f af 45 0c           imul   eax,DWORD PTR [ebp+0xc]  ;
 80483f0: 89 02                 mov    DWORD PTR [edx],eax      ; array[i] = i * n;
 80483f2: 83 45 fc 01           add    DWORD PTR [ebp-0x4],0x1  ;
 80483f6: 8b 45 fc              mov    eax,DWORD PTR [ebp-0x4]  ; i++;
 80483f9: 3b 45 0c              cmp    eax,DWORD PTR [ebp+0xc]  ;
 80483fc: 7c dc                 jl     80483da <function+0xf>   ; for文内の i < n;
 80483fe: c9                    leave                           ;
 80483ff: c3                    ret                             ;

詳しい動作の説明
080483cb <function>:
 80483cb: 55                    push   ebp                      ; 呼び出し元のebpをスタックに積む
 80483cc: 89 e5                 mov    ebp,esp                  ; ebpにespを転送する
 80483ce: 83 ec 10              sub    esp,0x10                 ; espから0x10を引くことでスタックに16バイトの領域を確保する
 80483d1: c7 45 fc 00 00 00 00  mov    DWORD PTR [ebp-0x4],0x0  ; ebp-4からebpまでの4バイトにdword幅で0を転送する
                                                                ; ebp-4からebpまでの領域はソースコードの int i と対応している
 80483d8: eb 1c                 jmp    80483f6 <function+0x2b>  ; 80483f6へジャンプする
 80483da: 8b 45 fc              mov    eax,DWORD PTR [ebp-0x4]  ; eaxにebp-4からebpまでの内容を転送する
 80483dd: 8d 14 85 00 00 00 00  lea    edx,[eax*4+0x0]          ; edxにeax*4を保存
 80483e4: 8b 45 08              mov    eax,DWORD PTR [ebp+0x8]  ; eaxにebp+0x8からebp+0xcまでの内容(第一引数)を転送
 80483e7: 01 c2                 add    edx,eax                  ; edxにeaxとの和を保存する
 80483e9: 8b 45 fc              mov    eax,DWORD PTR [ebp-0x4]  ; eaxにebp-0x4からebpまでの内容(int i)を転送
 80483ec: 0f af 45 0c           imul   eax,DWORD PTR [ebp+0xc]  ; eaxにebp+0xcからebp+0x10までの内容(第二引数 n)との積を保存する
 80483f0: 89 02                 mov    DWORD PTR [edx],eax      ; edxに保存されているアドレス(array[i])にeaxを転送する
 80483f2: 83 45 fc 01           add    DWORD PTR [ebp-0x4],0x1  ; ebp-0x4からebpまでの内容(int i)に1を加算する
 80483f6: 8b 45 fc              mov    eax,DWORD PTR [ebp-0x4]  ; eaxにebp-4からebpまでの内容を転送する
 80483f9: 3b 45 0c              cmp    eax,DWORD PTR [ebp+0xc]  ; eaxとebp+0xcからebp+0x10までの内容(第二引数 n)を比較し,
 80483fc: 7c dc                 jl     80483da <function+0xf>   ; eaxの方が小さかったら80483daへジャンプする
 80483fe: c9                    leave                           ; espにebpを転送し,saved ebpをebpレジスタにpopして復帰させる.
 80483ff: c3                    ret                             ; スタックの一番上に保存されているリターンアドレスにジャンプする

(3)
コンパイラはバイナリを生成するまで字句解析,構文解析,意味解析,最適化,バイナリ生成という流れで処理を行っている.
まず字句解析ではソースコードの文字列を予約語や識別子などのトークンに分割する.
次に構文解析では字句解析で分割されたトークンを構文規則を考慮して構文木を生成する.またこのとき,プログラムが文法的に正しいかをチェックする.
意味解析では構文解析によって生成された構文木をもとに中間コード(逆ポーランド記法やPコードなど)を生成する.
最適化では中間コードに存在する無駄な処理(使われていない変数や無駄な代入など)を削除することで,実行速度の高速化や使用メモリ領域の削減をする.
そして最適化された中間コードをアセンブリ機械語に変換して実行バイナリのフォーマットに従い生成する.
このとき,変数の宣言をもとにスタック領域や初期化データ領域,未初期化データ領域の確保. また,関数が呼び出されていたら引数を呼出規約に基いてレジスタやスタックを介して関数に渡して呼び出す処理を生成している.

(4)
CPUはまず命令がメモリから外部バスインタフェースを介して制御ユニットに読み込まれる.この動作をフェッチと呼ぶ.
次にフェッチされた命令は制御ユニットにあるデコーダーで,各種演算命令やデータ転送命令といった具体的な情報に変換される.
この作業をデコードと呼び,変換された命令は制御情報となる.これは,演算ユニットをどのように動作させて演算させるかをコントロールする情報である.
制御情報が演算ユニットに渡されると演算の対象となるデータを,メモリーから外部バスインタフェースを通して演算ユニット内のレジスタに読み込み,演算を実行する.
演算が終了すると結果をレジスタに書き込む.レジスターに書き込まれた結果は,メモリーに出力される.この動作をライトバックという.
このフェッチ,デコード,実行,ライトバックの一連の流れがCPUがプログラムのバイナリを実行する動きである.
更に,実際のCPUは命令パイプラインという仕組みで複数の命令を同時に処理している.
命令パイプラインとは,先程のフェッチをある命令が終えたらすぐに次の命令がフェッチを始め,フェッチを終えた方の命令がデコードをし始めるという仕組みである.
こうすることで全工程を一つとして処理するよりも高速化できる.また工程を細分化するとより高速になる.

(5)
特に不満点はない.
しかし,バイナリ解析する立場で見た時,
gccを最適化無しでコンパイルすると素直なバイナリを吐いてくれるが,
clangなどで最適化したバイナリはgccの最適化無しとは比べ物にならないほど動作が複雑になり,
手動デコンパイルがとても難しくなることは悩ましい.

選択問題8

gccが持つ-fno-stack-protectorは、どのようなセキュリティ機能を無効にするオプションであるのか、またこの機能により、どういった脆弱性からソフトウェアを守れるのかをそれぞれ記述してください。

-fno-stack-protectorはStack Smashing Protector( 以降SSPと呼ぶ )というセキュリティ機能を無効にするオプションである.
SSPが有効になっている状態でビルドされたプログラムの関数はローカル変数とsaved ebpの間にcanaryと呼ばれる,32bitの時はword幅,64bitの時はqword幅の値が置かれる.
関数のローカル変数確保直後にThread Local Storage( 以降TLSと呼ぶ )に保存されてる値をcanaryにコピーし,
関数からのreturn直前にcanaryとTLSに保存されている値を比較し,canaryが変化していたらstack_chk_fail関数を呼ぶ.
stack_chk_fail関数は内部でexit関数を読んでおり,関数の呼び出し元へreturnすることはない.
つまり,Stack buffer overflowという脆弱性からプログラムを守ることができる.
canaryの値は/dev/urandomから生成されているので予測することは不可能である.
ただしforkしたとき,子プロセスは親プロセスと同じメモリ領域を共有するため,canaryの値が必ず同じものになる.
BOF脆弱性を持ち,リクエストごとにforkするようなプログラムを想定する.BOFによってcanaryの最下位1バイトを書き換える.
もし,書き換えたcanaryの値が異なってた場合異常終了を起こし,合っていた場合正常に終了する. これを256回試行すればcanaryの最下位バイトを特定することができる.同様の操作を繰り返すことでcanary全体の値も特定することが可能である.
32bitのプログラムの場合,1024回の試行.64bitプログラムの場合,2048回の試行で特定可能で,これは実現可能な回数である.
また,-fstack-protector-allオプションが指定されていない場合, ローカル変数に文字配列が存在しない若しくは文字配列長が8バイト未満である関数にはcanaryを生成しないことも留意しておかなければならない.
SSPはStackに対する書き換えを検知するものなので,Format String BugやHeap Over Flowといった脆弱性に対する攻撃を防ぐことは出来ない.
更に,Stack buffer overflowに対する攻撃を緩和することは可能であるが,BOF自体を予防できるわけではないことを理解することが重要である.

選択問題9

以下のコードは、与えられたテキスト内からURLらしき文字列を探して、それらを<a>要素でリンクにしたHTMLを生成するJavaScriptの関数であるとします。攻撃者が引数 text の中身を自由に制御可能な場合、このコードにはどのような問題点があるか、またこのコードを修正するとすればどのようにすればよいか、自分なりに考察して書いてください。

function makeUrlLinks( text ){
 var html = text.replace( /[\w]+:\/\/[\w\.\-]+\/[^\r\n \t<>"']*/g, function( url ){
   return "<a href=" + url + ">" + url + "</a>";
   } );
 document.getElementById( "output" ).innerHTML = html;
}

もしtextに<img onerror='document.location="http://example.com"' src=x></img>という文字列が渡された場合,http://example.comに遷移する.
これはmakeUrlLinksでDOMに書き込まれた文字列がimgタグとして認識され,エラー時に実行されるonerrorハンドラのスクリプトが実行されたからである.
つまり上記のコードはDOM Based XSSという脆弱性を持っている.
この脆弱性が存在するとhttponly属性のついていないcookieを窃取したり,
偽のログインフォームを表示してパスワード入力を促すことでパスワードを奪うことが可能である.
上記のコードを修正するには出力の際にエスケープ処理を施すのが有効的である.
以下に修正例を示す.

function makeUrlLinks( text ){
 text = text.replace( /&/g, "&amp;").replace( /</g, "&lt;").replace( />/g, "&gt;").replace( /"/g, "&quot;").replace( /'/g, "&#x27;");
 var html = text.replace( /[\w]+:\/\/[\w\.\-]+\/[^\r\n \t<>"']*/g, function( url ){
   return "<a href=" + url + ">" + url + "</a>";
   } );
 document.getElementById( "output" ).innerHTML = html;
}

選択問題10

アンチデバッグ、難読化といった単語をキーワードとする技術について、あなたが知っていること、調べたことを具体的に記述してください。基本的にPCのソフトウェアにおける技術を想定していますが、他端末、またはハードウェアに関する内容でもかまいません。

アンチデバッグwindowsにのネイティブコードにに関するもののみ書いた.
難読化はネイティブコード,マネージコード及びJavaバイトコードjavascriptの3つの難読化技術について触れた.
あまりに長いので省略.

選択問題11

下記バイナリを解析し、判明した情報を自由に記述してください

D4 C3 B2 A1 02 00 04 00 00 00 00 00 00 00 00 00 
00 00 04 00 01 00 00 00 88 EB 40 54 A2 BE 09 00 
52 00 00 00 52 00 00 00 22 22 22 22 22 22 11 11 
11 11 11 11 08 00 45 00 00 44 1A BD 40 00 80 06 
3A 24 C0 A8 92 01 C0 A8 92 80 10 26 01 BB 86 14 
7E 80 08 B3 C8 21 50 18 00 FC 0D 0E 00 00 18 03 
03 00 17 01 0E FB 06 F6 CD A3 69 DC CA 0B 99 FF 
1D 26 09 E1 52 8F 71 77 45 FA

先頭4バイトにD4 C3 B2 A1という特徴的なバイト列が現れている.これはpcap形式のファイルのシグネチャである.
試しに上記のバイナリをファイルにしてWiresharkで開いた.するとHeartbeat Requestのパケットであることが分かった.
Secure Sockets Layerに注目してみる.Secure Sockets Layerの中身のバイナリを抜き出すと, "18 03 03 00 17 01 0E FB 06 F6 CD A3 69 DC CA 0B 99 FF 1D 26 09 E1 52 8F 71 77 45 FA"である.
これを意味するごとに区切ると次の通りである.

18 : Content Type: Heartbeat (24)
03 03 : Version: TLS 1.2 (0x0303)
00 17 : Length: 23
01 : Type: Request (1)
0E FB : Payload Length: 3835
06 F6 CD A3 : Payload (4 bytes)
69 DC CA 0B 99 FF 1D 26 09 E1 52 8F 71 77 45 FA : Padding and HMAC (16 bytes)

Payload Lengthと実際に送られているPayloadのサイズに差があることが分かる.
これはCVE-2014-0160,OpenSSLのHeartbleedという脆弱性を狙った攻撃のパケットである.
Heartbleedの脆弱性を持ったOpenSSLのクライアントはHeartbeat RequestのPayloadをヒープ領域に保存し,
そこからPayload Length分読み込んでレスポンスメッセージを作成する.
このことを利用し実際のPayloadのサイズよりもPayload Lengthを大きくしたパケットを送りつけることで, ヒープ領域に存在するデータを抜き出すことができる脆弱性がHeartbleedである. 上記のパケットがHeartbleedの脆弱性が存在するクライアントに送信された場合,3835 - 4 = 3831[byte]のデータが抜き取られる.
Heartbleedは他のユーザのデータやクライアントの秘密鍵が盗み取られる可能性が存在するため,とても重大な脆弱性である.

感想

選択問題9とかはweb力の足り無さを感じた.
あとネットワーク系の問題に答えられなかったのでもっと勉強しなければという感じ.
応募用紙を埋めていく過程で色々学ぶことができた.
今の自分が出せるものは出しきったのであとは運に任せるしかない.

CTF for Beginners 2015 横浜 with mochigoma-Beginners Writeup

CTF4bに参加してきた.
バイナリ初心者なのでバイナリガッツリコースで親方の素晴らしい講義を受けてきた.
講義は,バイナリとは何ぞやというところから話が始まり,バイナリ読経をしたり最後にはPwnの話に触れたりもした.また,講義の後に1時間半の簡易CTFがあった.1200ポイントを獲得し,193sさんと同率の2位だった.ここではそのCTFのWriteupを書いていく.

続きを読む