プロジェクト

全般

プロフィール

Statifier » 履歴 » バージョン 2

kanata, 2025/04/13 15:41

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