プロジェクト

全般

プロフィール

ねこみみタイフーン » 履歴 » バージョン 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     | プロセスのメモリマップ参照 |