(✿╹◡╹)ノ

ぽえぽえ

夏休みまとめ

まだ1週間近くあるけど。

セキュリティ・キャンプ全国大会2017

チューターとして参加してました。

チューターという立場でありながら、すごい講師やチューターの方々、去年一緒にキャンプを過ごしたメンバーなどとお話できる機会が多くあり、今年も貴重な時間を過ごすことができたことに感謝です。

多くの方々、特に担当トラックの講師の方にはとても迷惑かけてしまった感じがあって、本当にごめんなさいごめんなさい… そして同時に、この1年何もやってこれなかったんだなぁというのを痛感して辛かった。

pwn.hs

Haskell 版 pwntools みいたいなやつを書き始めた。

昨年のセキュキャンで pwn というジャンルを知ってから、pwntools (Python2) を使って問題を解いてきた。Python(2) は CTF はもちろんセキュリティ全般で使われていることもあり、この手のスクリプトを書くのに向いている言語ではあるのは十分理解している。けれどもやっぱり僕は好きになれなかったし、実用的レベルまで勉強しようというモチベも出なかった1。本番中はサクッと書けることが重要なのに、「思い通りにコードが掛けない〜〜〜〜」と頻繁にググっているので全然だめ。

そこでとうとう自作のライブラリを好きな言語で書くことにした。今更になって Rust の魅力を感じた2こともあって、最初は Rust で書くつもりだった。けれども、こういった用途には向かないなーという感じだった (後述)。でも C++ は論外だし、じゃぁ… Haskell?ということで Haskell で書いてみることにした。

Haskell は以前、有名なH本を7割程度読んだ程度でまだわからないことだらけのだけれども、試しに書いてみると意外とアリだった。それからライブラリを書き始め、現時点で

  • ソケット、プロセスに対する送受信
  • pack, unpack
  • asm, disasm

などを実装し、実際に問題を解いてみたりしている。少なくとも今までよりはスラスラと、そして楽しく書けていると思う。コードがある程度実行されてから NameError: name 'hoge' is not defined みたいなエラーで落ちることがないのも気分がいい。

今後は Haskell 書かない人でもわかるような書き方 (pwntools 似?) でありつつも Haskell の良さをどんどん取り入れていきたいなと思う。

解いた

  • PlaidCTF 2013: ropasaurusrex (再)
    • pwn のリハビリ兼 Rust で exploit コード書くとどんな感じになるのかなーというテスト
    • こういう用途には向かないかなぁという感じ
  • DEF CON CTF Qualifier 2013: annyong
    • FSB と Stack BOF がある
    • アドレスリークしてから ROP するだけ
  • Ghost in the Shellcode 2013: Shiftd
    • Stack BOF があるが、入力する文字列は strftime に掛けられる必要がある
    • 入力する文字列を “%F\x00” で始めることで上記チェックを回避しつつ、.bss に shellcode を書いて飛ぶ ROP すればおk
  • return to dl-resolve テスト
  • 0ctf Quals 2017: Baby Heap 2017
    • いろんな解き方できそうな glibc malloc
    • Heap BOF がある
    • Heap をこねくり回しながら fastbin attack に繋げ、__malloc_hook を書き換えて解いた
    • libc などのライブラリが配置される 0x7fxxxxxxxxxx というアドレスの 0x7f という値が fake chunk の size に使えそうだなーと思ってやったら本当にイケたのでおもしろかった
  • Tokyo Westerns CTF 3rd 2017: simple note
    • unsasfe unlink するやつ
    • イベント時間内に Heap 問解けたのが嬉しかった
  • HITCON CTF 2014: stkof
    • simple note の復習に
    • 当時解けた人の少なかった問題が今では easy 扱いなのをみると怖いなぁ…
  • PlaidCTF 2014: kappa
    • ポケ○ンっぽいゲーム
    • 探せば探すほどバグが見つかる
  • 32C3 CTF: readme
    • __libc_argvenviron の指す先を書き換えて canary を破壊したときのメッセージから flag 読むやつ
    • こんなことができるのは TWCTF 2016 で同様の問題が出たので知っていたが、イマイチ仕組みがよくわかってなかったので
  • 31C3 CTF: mynx
    • AA とコメントが投稿できる
    • AA とコメントは同じ構造体 (フラグ + union?) で表現され、独自のアロケータっぽいもので連続した領域に確保される
    • コメントを読む処理で 1byte の BOF があるので、構造体のフラグを書き換えてゴニョると解けた
  • HITCON CTF 2016 Quals: Secret Holder
    • simple note や stkof で使った方法 (後ろの解放済み chunk を細工する/作る) ではなく、前に解放済み chunk を作るタイプの unsafe unlink attack
    • malloc が返したアドレスの配列があるときはこっちのほうが便利っぽい?

  1. むやみにプログラミング言語に手を出したくない、py2 は早く滅びてもらいたい等の理由で

  2. https://twitter.com/myon___/status/869522500132020224