ねこみみタイフーン » 履歴 » バージョン 1
kanata, 2025/04/13 16:38
| 1 | 1 | kanata | # ねこみみタイフーン |
|---|---|---|---|
| 2 | |||
| 3 | {{toc}} |
||
| 4 | |||
| 5 | |||
| 6 | 中断中 |
||
| 7 | |||
| 8 | # Article |
||
| 9 | |||
| 10 | sonots:blog - ptraceとELFとLinuxレジスタ |
||
| 11 | http://blog.livedoor.jp/sonots/archives/50135985.html |
||
| 12 | |||
| 13 | プログラムモグモグ - ptraceシステムコール入門 ― プロセスの出力を覗き見してみよう! |
||
| 14 | http://itchyny.hatenablog.com/entry/2017/07/31/090000 |
||
| 15 | |||
| 16 | ---- |
||
| 17 | |||
| 18 | うさみみハリケーンのLinux版があればいいのに。。。ということで思い立った。 |
||
| 19 | それできるよ。gdbならね。というツッコミは無しの方向で。 |
||
| 20 | |||
| 21 | CTFで使えるでしょ。CTF用なのだよ。 |
||
| 22 | 稼働中のプロセスをごっぞりダンプできたりもするので、フォレンジックにも使えるかも。 |
||
| 23 | |||
| 24 | --- |
||
| 25 | いや、pedaとか、もっと便利なツールを教えてもらった。。 |
||
| 26 | すると、これの出番無いかもしれんなぁ。。 |
||
| 27 | |||
| 28 | # 現状 |
||
| 29 | |||
| 30 | プロトタイプ開発中→中断中 |
||
| 31 | |||
| 32 | * 実行中プロセスのメモリダンプ→完成 |
||
| 33 | * 実行中プロセスのレジストリダンプ→中途半端だけど作った |
||
| 34 | * 実行中プロセスの速度低下→完成 |
||
| 35 | * 実行中プロセスのメモリ差分抽出→断念 |
||
| 36 | |||
| 37 | # 構想 |
||
| 38 | |||
| 39 | ## nkmmtyp_memdump |
||
| 40 | |||
| 41 | プロトタイプ |
||
| 42 | attachment:nkmmtyp_dump_20150524.c |
||
| 43 | |||
| 44 | 実行中プロセスのメモリダンプ。 |
||
| 45 | 引数に pid ダンプをするメモリアドレス 表示するサイズ が必要。 |
||
| 46 | アドレスは、 /proc/(pid)/maps を調べる、もしくは、 pmap コマンドを使うと判る。 |
||
| 47 | |||
| 48 | ## nkmmtyp_regdump |
||
| 49 | |||
| 50 | プロトタイプ |
||
| 51 | attachment:nkmmtyp_regdump_20150711.c |
||
| 52 | |||
| 53 | 実行中プロセスのレジスタの値の取得。 |
||
| 54 | ptraceのPTRACE_GETREGSで実現できる。 |
||
| 55 | 今動いている状態のプロセスを一時止めてから、レジスタの値を取得する。 |
||
| 56 | 任意のタイミングで止められるといっても、所詮、人が手でコマンド叩くタイミングなので、あの命令の実行時に~・・・とかは無理ゲーとなる。 |
||
| 57 | なので、ここぞというタイミングで取れないこと請け合い。 |
||
| 58 | これ単体で使う機会はあんまりなさそうだけど、何かと組み合わせることで応用したい。 |
||
| 59 | |||
| 60 | ## nkmmtyp_slow |
||
| 61 | |||
| 62 | プロトタイプ |
||
| 63 | attachment:nkmmtyp_slow_20150524.c |
||
| 64 | |||
| 65 | 実行中プロセスの動作速度を遅くする。遅くするのでCPU使用率も下がる。 |
||
| 66 | 引数に pid ナノ秒(1命令毎に何ナノ秒停止するか) が必要。 |
||
| 67 | たぶん、タイミング障害の再現試験とかでも使える気がする。 |
||
| 68 | nice値をいじるとかで実現しているのではなく(それだったらniceコマンド使えばいいわけだし)、アレンブラレベルの1命令毎にnanosleepを挟み込んでいる。 |
||
| 69 | |||
| 70 | ## nkmmtyp_diff |
||
| 71 | |||
| 72 | リアルタイムでのメモリ内容の差分抽出 |
||
| 73 | |||
| 74 | 1stepずつメモリの差分を出せば、そのプログラムがどんな動きか解るであろう。 |
||
| 75 | そういうの作りたかった。 |
||
| 76 | |||
| 77 | # 設計 |
||
| 78 | |||
| 79 | 保留 |
||
| 80 | |||
| 81 | # 作らなくても、もう既に存在しているもの |
||
| 82 | |||
| 83 | ## livepatch |
||
| 84 | |||
| 85 | 実行中のプロセスのメモリを書き換える。 |
||
| 86 | 鵜飼さんが作ったlivepatchという神ツールがある。 |
||
| 87 | |||
| 88 | livepatch |
||
| 89 | http://ukai.jp/Software/livepatch/ |
||
| 90 | |||
| 91 | ただ、だいぶ昔に作られたソースみたいなので、今のLinux環境でコンパイルするには難がある。 |
||
| 92 | |||
| 93 | - コンパイルに、bintuils-develが必要なので、インストールする。 |
||
| 94 | - #include <linux/user.h> は、#include <sys/user.h> に修正する。 |
||
| 95 | - bfd_get_section_size_before_reloc が見つからないというエラーが出る。bfd_get_section_size に修正する。 |
||
| 96 | |||
| 97 | これでなんとか、、、(ちゃんと動作確認してないけど) |
||
| 98 | |||
| 99 | |||
| 100 | ## 関数コールトレーサー |
||
| 101 | |||
| 102 | tracef |
||
| 103 | http://binary.nahi.to/tracef/ |
||
| 104 | |||
| 105 | hogetrace |
||
| 106 | http://d.hatena.ne.jp/yupo5656/20071008/p1 |
||
| 107 | |||
| 108 | ## 走行中のプロセスの標準出力を覗き見る |
||
| 109 | |||
| 110 | ``` |
||
| 111 | strace -p `pidof a.out` -e write -s 256 2>&1 | sed -ne 's/^write(1, \"\(.*\)\"\.*, [0-9]*) *= [0-9]*$/\1/p' |
||
| 112 | ``` |
||
| 113 | |||
| 114 | 参考:揮発性のメモ |
||
| 115 | http://d.hatena.ne.jp/iww/20080129/stdout |
||
| 116 | |||
| 117 | ## Linux標準コマンド |
||
| 118 | |||
| 119 | | コマンド | 概要 | |
||
| 120 | |----------|----------------------------| |
||
| 121 | | gdb | デバッガ | |
||
| 122 | | strace | システムコールのトレース | |
||
| 123 | | strings | バイナリ中も文字列抽出 | |
||
| 124 | | readelf | ELFファイル形式の詳細出力 | |
||
| 125 | | objdump | 逆アセンブラっぽいもの | |
||
| 126 | | pmap | プロセスのメモリマップ参照 | |