ねこみみタイフーン

中断中

Article

sonots:blog - ptraceとELFとLinuxレジスタ
http://blog.livedoor.jp/sonots/archives/50135985.html

プログラムモグモグ - ptraceシステムコール入門 ― プロセスの出力を覗き見してみよう!
http://itchyny.hatenablog.com/entry/2017/07/31/090000


うさみみハリケーンのLinux版があればいいのに。。。ということで思い立った。
それできるよ。gdbならね。というツッコミは無しの方向で。

CTFで使えるでしょ。CTF用なのだよ。
稼働中のプロセスをごっぞりダンプできたりもするので、フォレンジックにも使えるかも。


いや、pedaとか、もっと便利なツールを教えてもらった。。
すると、これの出番無いかもしれんなぁ。。

現状

プロトタイプ開発中→中断中

  • 実行中プロセスのメモリダンプ→完成
  • 実行中プロセスのレジストリダンプ→中途半端だけど作った
  • 実行中プロセスの速度低下→完成
  • 実行中プロセスのメモリ差分抽出→断念

構想

nkmmtyp_memdump

プロトタイプ
nkmmtyp_dump_20150524.c

実行中プロセスのメモリダンプ。
引数に pid ダンプをするメモリアドレス 表示するサイズ が必要。
アドレスは、 /proc/(pid)/maps を調べる、もしくは、 pmap コマンドを使うと判る。

nkmmtyp_regdump

プロトタイプ
nkmmtyp_regdump_20150711.c

実行中プロセスのレジスタの値の取得。
ptraceのPTRACE_GETREGSで実現できる。
今動いている状態のプロセスを一時止めてから、レジスタの値を取得する。
任意のタイミングで止められるといっても、所詮、人が手でコマンド叩くタイミングなので、あの命令の実行時に~・・・とかは無理ゲーとなる。
なので、ここぞというタイミングで取れないこと請け合い。
これ単体で使う機会はあんまりなさそうだけど、何かと組み合わせることで応用したい。

nkmmtyp_slow

プロトタイプ
nkmmtyp_slow_20150524.c

実行中プロセスの動作速度を遅くする。遅くするのでCPU使用率も下がる。
引数に pid ナノ秒(1命令毎に何ナノ秒停止するか) が必要。
たぶん、タイミング障害の再現試験とかでも使える気がする。
nice値をいじるとかで実現しているのではなく(それだったらniceコマンド使えばいいわけだし)、アレンブラレベルの1命令毎にnanosleepを挟み込んでいる。

nkmmtyp_diff

リアルタイムでのメモリ内容の差分抽出

1stepずつメモリの差分を出せば、そのプログラムがどんな動きか解るであろう。
そういうの作りたかった。

設計

保留

作らなくても、もう既に存在しているもの

livepatch

実行中のプロセスのメモリを書き換える。
鵜飼さんが作ったlivepatchという神ツールがある。

livepatch
http://ukai.jp/Software/livepatch/

ただ、だいぶ昔に作られたソースみたいなので、今のLinux環境でコンパイルするには難がある。

  • コンパイルに、bintuils-develが必要なので、インストールする。
  • #include は、#include に修正する。
  • bfd_get_section_size_before_reloc が見つからないというエラーが出る。bfd_get_section_size に修正する。

これでなんとか、、、(ちゃんと動作確認してないけど)

関数コールトレーサー

tracef
http://binary.nahi.to/tracef/

hogetrace
http://d.hatena.ne.jp/yupo5656/20071008/p1

走行中のプロセスの標準出力を覗き見る

strace -p `pidof a.out` -e write -s 256 2>&1 | sed -ne 's/^write(1, \"\(.*\)\"\.*, [0-9]*) *= [0-9]*$/\1/p'

参考:揮発性のメモ
http://d.hatena.ne.jp/iww/20080129/stdout

Linux標準コマンド

コマンド 概要
gdb デバッガ
strace システムコールのトレース
strings バイナリ中も文字列抽出
readelf ELFファイル形式の詳細出力
objdump 逆アセンブラっぽいもの
pmap プロセスのメモリマップ参照

nkmmtyp_dump_20150524.c Magnifier - プロトタイプ (2.721 KB) kanata, 2015/05/24 09:24

nkmmtyp_slow_20150524.c Magnifier - プロトタイプ (1.88 KB) kanata, 2015/05/24 13:40

nkmmtyp_regdump_20150711.c Magnifier - プロトタイプ (2.512 KB) kanata, 2015/07/11 10:15

クリップボードから画像を追加 (サイズの上限: 100 MB)