# gefを改造した話
###### tags: `gef` `gdb` `ctf`
# はじめに
この記事は,[CTF Advent Calendar 2020](https://adventar.org/calendars/5338) の10日目の記事です.
9日目は私の「[HITCON CTF 2018 - Super Hexagon (Part 7/7)](https://hackmd.io/@bata24/HJhLZTvGI)」でした.
# 背景
gdbには,pythonで書かれたスクリプトをロードする機能があります.
CTFプレイヤーの間では,長らく[peda](https://github.com/longld/peda)が使われてきました.私の記憶によれば,2012年前後に活動していた,ベトナムのチームCLGTが当時公開したものです(間違っていたらごめんなさい).pedaは,これまでのgdbの無味乾燥なインターフェースに変わって,非常に見やすくデバッグしやすい画面と,多機能なコマンド群を提供するものであり,またたく間にCTFプレイヤーの間に広まりました.
その後pedaの流れを汲んだgdbスクリプトが数多く作られました.全部追いかけていたわけではないので,ここで挙げることはしませんが,そのほとんどは現れてはすぐ消えていったように思います.
さて本家pedaはこの頃開発が停滞していたこともあり,私は[HITCONのメンバーがpedaを独自に改良したもの](https://github.com/scwuaptx/peda)を使っていました.同作者の[Pwngdbという別の拡張スクリプト](https://github.com/scwuaptx/Pwngdb)を組み合わせると,ヒープの状況表示もできたため,exploit開発にはそれで事足りたのです.
しかし最近はそれも開発が停滞しており,最新のglibcには適合しなくなりつつあります.そこで新たに乗り換え先を探し始めることにしました.
現在,世の中で使われているgdbスクリプトは,pedaを除くと主に以下の2つなのではないかな,と思っています.
- [gef](https://github.com/hugsy/gef)
- [pwndbg](https://github.com/pwndbg/pwndbg)
機能や安定性は,後発であるpwndbgの方が良さそうです.実際,多くのCTFプレイヤーがpwndbg派だと思います.
しかし私はgefの思想に惹かれました.主に`gef.py`という1つのファイルから成るようなのです.個人的な感覚ですが,沢山のファイルからなるソフトウェアは,開発時のメンテ性は上がると思いますが,利用時にはごちゃごちゃするイメージがあり,あまり好きではないのです.
※gefは別ファイルに書かれたコマンド定義等を読み込むこともでき,そのせいか最近は分割され始めていますが,コアとなるファイルはgef.pyの一つだけから成ります.
# gefの問題点
gefを使ってみて,最初はこれすごい!!と思ったのですが,結構バグがあるようでした.まともに動かなかったり,明らかに結果がおかしいというような状況もちょくちょくありました.
で,ソースを見てたら,これ俺でも直せそうだな,と思ったわけです.
# 何をしたのか
ソースを見て直してたら,機能追加しようかなと思うようになり,調子に乗って色々追加してしまいました.
そして機能追加やバグ修正を続けた結果,本家とのdiffが10000行を超えてしまいました.でもかなり安定したのと,自分のほしい機能をあらかた付けられたと思うので,一旦は満足しています.
ソースはここで公開しています → https://github.com/bata24/gef
リンク先に画像を貼ってあるので,追加された機能/修正された機能はそちらで確認してみてください.
不安定な部分も沢山あるので,本家へのPRは送らず,forkしたものを勝手にメンテしていこうかなと思っています.バグは沢山あると思いますので,気づいたらissueなりPRなり飛ばしてください.
# 終わりに
明日は[@icchyr](https://twitter.com/icchyr)の[WCTF2020](http://icchy.hatenablog.jp/entry/2020/12/12/005752)です.期待して待ちましょう.