acomagu's diary

思ったことを書きます。技術的なことは書きません。

僕の gdb

この記事は Aizu Advent Calendar の1日目の記事です。

Aizu AdC が毎年人気なので、今年も埋まっているだろうなーと思いつつ開いたらなぜか今日、明日と埋まっていなかったので今日急遽書くことにします。

去年とかも超気合を入れて書いていたのですが、最近尊敬する mattn さんという方が

なんて言っていたのを見かけたので、小ネタで行こうと思います。

重いネタは本業の LT やブログ等で発散することにします。

gdbとは?

CTFでpwnに使うツールです。gdb-pedaを導入することで完全体となります。

デバッガとかではありません。

gdb-peda の導入方法

公式では、 ~/.gdbinit

source ~/peda/peda.py

と追記するとあります。

しかしモダンなLinux Desktop勢であれば、 dotfiles 系はすべて $XDG_CONFIG_HOME 配下に置きたいですよね?

なのでとりあえず設定ファイルは $XDG_CONFIG_HOME/gdb/init とすることにしましょう。

また、もちろんホームディレクトリに peda なんてディレクトリを作ることも許されないので、 ghq のルールに従い $GHQ_ROOT/github.com/longld/peda 以下を参照することにします。

しかし、ここで問題が発生します。 gdbinit の内容は今の所シェルスクリプトっぽく見えますが、実はシェルスクリプトではなく gdb シェルで実行されるのと同じ、つまり GDB コマンドの扱いになります。よって 環境変数をかんたんに読み込む方法がありません。

しかし、 gdb では シェル内でかんたんに Python コードを実行できる という特徴があります。これを応用し、最終的な init ファイルは以下になります。

python
import os
gdb.execute('source {0}/github.com/longld/peda/peda.py'.format(os.environ['GHQ_ROOT']))
end

最後に、 gdb の設定ファイルの場所を変えてしまったので、起動時にちゃんと読み込んでくれるように alias を掛けておきます。

function gdb
    command gdb -nh -x $XDG_CONFIG_HOME/gdb/init $argv
end

(Fish です)

せっかく環境変数で移植性が保てたので、 Makefile を書いてリポジトリに挙げることにします。

.PHONY: install
install:
    ghq get longld/peda
    ln -s $(shell:pwd)/init $(XDG_CONFIG_HOME)/gdb/init

完成です!

acomagu/dotfiles-gdb