プロジェクト

全般

プロフィール

Statifier » 履歴 » バージョン 3

kanata, 2025/05/03 17:18

1 1 kanata
# Statifier
2
3 3 kanata
追記(2025/5)
4
今は[sold](https://akawashiro.github.io/sold_kernelvm_20211120.pdf)というのがあります。
5
6 1 kanata
{{toc}}
7
8
# 経緯
9
10
とあるコマンドをインストールしようと思った・・・・が・・・・・ 駄目っ・・・・・!
11
パッケージの依存関係がすごい。つまり、1つコマンドを導入するのに、入れたくないパッケージを山のように入れなければならない。。
12
13
そのコマンド1つだけ実行したいだけなのに・・・
14
15
そこで思いつく悪魔の発想・・・っ!
16
17
![fig2.png](fig2.png)
18
![fig1.png](fig1.png)
19
20
1バイナリで動くようにすれば、他の環境に楽に持っていける。理論上は出来るはず・・・と思い、調べたら出てきた。
21
22
[statifier](http://statifier.sourceforge.net/)というのを使えば可能であることがわかった。
23
24
{{rawhtml(<a class="embedly-card" href="http://statifier.sourceforge.net/">ELF STATIFIER MAIN PAGE</a><script async src="//cdn.embedly.com/widgets/platform.js" charset="UTF-8"></script>)}}
25
26
メンテナンスはあまり活発ではないようだが、x86_64にも対応してくれているっぽい。
27
28
>その他の案として、参照している動的リンクライブラリを全部洗い出してコピーし、LD_PRELOAD環境変数に突っ込んだ上で実行すればいけるかなぁ。とか、思ったんだけど、試してはいない。
29
30
# 概要
31
32
結局、なにがしたいかと言うと、
33
34
~~~
35
$ cat test.c 
36
#include <stdio.h>
37
38
int main(){
39
  printf("Helloworld");
40
  return 0;
41
}
42
$ gcc test.c 
43
$ ldd a.out 
44
        linux-vdso.so.1 =>  (0x00007fffc62d0000)
45
        libc.so.6 => /lib64/libc.so.6 (0x00007f886214a000)
46
        /lib64/ld-linux-x86-64.so.2 (0x00007f8862517000)
47
~~~
48
49
この単純なプログラムですら、3つの動的リンクライブラリを必要としている事がわかる。
50
このライブラリがシステムに存在しないと、プログラムは動かない。
51
だったら・・・プログラム(a.out)の中に、この3つの動的リンクライブラリを取り込んだらいいじゃない。
52
という発想。
53
54
# Install
55
56
まず、自分はこのソフトのコンパイルのため、コンパイル用の仮想環境を用意した。
57
statifierを導入するために、依存関係となっている複数パッケージを導入する・・・のは本末転倒である。
58
コンパイル済みのものだけを目的の環境にコピーしてやればよいではないか。
59
60
という訳で、[ここ](https://sourceforge.net/projects/statifier/files/)から最新版のtar.gzをダウンロードする。
61
62
>自分が実施した時は、statifier-1.7.4.tar.gz でした。
63
64
適当なところに展開しておく。
65
66
~~~
67
$ tar xvfz statifier-1.7.4.tar.gz
68
~~~
69
70
コンパイル時に必要となるパッケージをインストール。
71
72
~~~
73
# yum install glibc.i686 glibc-devel.i686 libgcc.x86_64 libgcc.i686 
74
~~~
75
76
makeする。
77
78
~~~
79
$ cd xvfz statifier-1.7.4
80
$ bash ./configure
81
$ make
82
~~~
83
84
というのが、めんどうな方のために自分がコンパイルしたものをここに置いておく。
85
86
attachment:statifier-1.7.4_for_x86_64.tar.gz
87
88
# 実行環境について
89
90
さっそく動作確認してみる。
91
dateコマンドを静的リンクにしてみよう。
92
93
~~~
94
$ ldd /bin/date 
95
        linux-vdso.so.1 =>  (0x00007fff3432f000)
96
        libc.so.6 => /lib64/libc.so.6 (0x00007f61fcf4f000)
97
        /lib64/ld-linux-x86-64.so.2 (0x00007f61fd31c000)
98
$ cd statifier-1.7.4
99
$ setarch `uname -m` -R src/statifier.sh /bin/date /tmp/date2
100
~~~
101
102
これでstaticなdateコマンドが出来たはず。
103
104
~~~
105
$ setarch `uname -m` -R /tmp/date2
106
2016年  6月  5日 日曜日 17:30:56 JST
107
$ ldd /tmp/date2
108
        動的実行ファイルではありません
109
~~~
110
111
うん、たぶんうまく動いてるんだと思われる。
112
113
## 超注意:ASLRの怪
114
115
なんか、おまじないのようなコマンドがくっついているのが、おわかり頂けただろうか・・・
116
117
~~~
118
$ setarch `uname -m` -R
119
~~~
120
121
実は、これ、LinuxのASLRというセキュリティ機能を一時的に無効にするコマンドになります。
122
ASLRについては、ググるか、[[CTF_Pwn]]をみてね。
123
なんか、いろいろやってみたけど、動かなくてね~。
124
125
どうやら、「静的リンクの実行体に変換する時」と、「実際に動作させる時」にメモリアドレスが同じになってないといけないっぽい。
126
127
なので、必ず「setarch `uname -m` -R」を頭につけて変換&実行しておくれ。
128
129
# 想定される使い方
130
131
よっしゃー。これで、1バイナリになって、どの環境でも動くぞイヤッッホォォォオオォオウ!
132
133
と、ならないのが世の定め。。
134
135
ちょっとLinuxディストリビューションの違うLinuxに持ち込んでみたが動かない。。
136
まぁ全部試した訳ではないのだけれど、
137
同じディストリビューションだと動いているっぽい。
138
139
たぶん、kernelのバージョンが違ってたりすると、取り込んだlibcでそれを吸収できないとか、そんな感じになっている気がする。
140
調べてないけど。
141
142
>そう考えると1バイナリになるGo言語って結構考えられてますね。ファイルサイズが大きくなるだろうから、そこらへんトレードオフなんだろうけど。
143
144
なので、自分は同じLinuxディストリビューションで2環境用意して運用している。
145
146
* VMでコンパイル用環境を作る(足りない物は、なんでもかんでもyum install。使い捨て)
147
* 本番環境。できるだけパッケージを入れない。
148
149
# 補足
150
151
statifier には、こんな記述が
152
153
>Recent Linux kernels introduced VDSO (Virtual Dynamic Shared Object) and stack randomization. Those things, while valuable features, don't play well with Statifier.
154
155
>>意訳:ASLRとVDSOを使うバイナリは上手く動かないぜ
156
157
この statifier を作った方達は、Ermine というソフトを販売しております。
158
159
>Ermine works in a fashion similar to Statifier, creating self-contained executables from dynamically-linked >applications. But Ermine-packed applications are not snapshots: instead they can be thought of as small virtual machines.
160
>And because of this an Ermine-packed application does not suffer from the problems created by VDSO/stack randomization
161
162
>> 意訳:Ermineなら問題ないんだぜ
163
164
Ermine
165
http://www.magicermine.com/
166
167
>15日トライアルもできるらしい。
168
169
# 参考
170
171
bkブログ - statifier で動的リンクの実行ファイルを擬似的に静的リンクにする
172
http://0xcc.net/blog/archives/000089.html
173
174
ELF Statifierを使って実行形式ファイルをシステム間で移動する
175
https://osdn.jp/magazine/08/12/02/012255