「SteamforLinux」をDebianで動作させようとして、問題が発生しました。libcef
(Chromium Embedded Framework)はGLIBC_2.13
(Debianテストのeglibcが提供できる)で正常に動作しますが、GLIBC_2.15
(eglibcが提供できない)から1つの厄介な小さな追加関数が必要です。
$ readelf -s libcef.so | grep -E "@GLIBC_2\.1[4567]"
1037: 00000000 0 FUNC GLOBAL DEFAULT UND __fdelt_chk@GLIBC_2.15 (49)
2733: 00000000 0 FUNC GLOBAL DEFAULT UND __fdelt_chk@@GLIBC_2.15
ここでの私の攻撃計画は、LD_PRELOAD
これらの機能だけを提供するシムライブラリへの攻撃でした。これはうまくいかないようです。私は本当にインストールを避けたいと思ってGLIBC_2.17
います(Debian実験的であるため、Debian sidでさえまだ持っていますGLIBC_2.13
)。
これは私が試したことです。
fdelt_chk.c
基本的にGNUCライブラリから盗まれます:
#include <sys/select.h>
# define strong_alias(name, aliasname) _strong_alias(name, aliasname)
# define _strong_alias(name, aliasname) \
extern __typeof (name) aliasname __attribute__ ((alias (#name)));
unsigned long int
__fdelt_chk (unsigned long int d)
{
if (d >= FD_SETSIZE)
__chk_fail ();
return d / __NFDBITS;
}
strong_alias (__fdelt_chk, __fdelt_warn)
私のVersions
スクリプトは次のようになります。
GLIBC_2.15 {
__fdelt_chk; __fdelt_warn;
};
次に、次のようにライブラリを構築します。
$ gcc -m32 -c -fPIC fdelt_chk.c -o fdelt_chk.o
$ gcc -m32 -shared -nostartfiles -Wl,-s -Wl,--version-script Versions -o fdelt_chk.so fdelt_chk.o
ただし、Steamを実行すると(そもそも動作させるために余分なものがたくさんあります)、ローダーはまだシンボルを見つけることを拒否します:
% LD_LIBRARY_PATH="/home/tinctorius/.local/share/Steam/ubuntu12_32" LD_PRELOAD=./fdelt_chk.so:./steamui.so ./steam
./steam: /lib/i386-linux-gnu/i686/cmov/libc.so.6: version `GLIBC_2.15' not found (required by /home/tinctorius/.local/share/Steam/ubuntu12_32/libcef.so)
ただし、バージョンシンボルは、作成した.so
ばかりのIによっても提供されます。
% readelf -s fdelt_chk.so
Symbol table '.dynsym' contains 8 entries:
Num: Value Size Type Bind Vis Ndx Name
0: 00000000 0 NOTYPE LOCAL DEFAULT UND
1: 00000000 0 FUNC GLOBAL DEFAULT UND __chk_fail@GLIBC_2.3.4 (3)
2: 0000146c 0 NOTYPE GLOBAL DEFAULT ABS _edata
3: 0000146c 0 NOTYPE GLOBAL DEFAULT ABS _end
4: 00000310 44 FUNC GLOBAL DEFAULT 11 __fdelt_warn@@GLIBC_2.15
5: 00000310 44 FUNC GLOBAL DEFAULT 11 __fdelt_chk@@GLIBC_2.15
6: 00000000 0 OBJECT GLOBAL DEFAULT ABS GLIBC_2.15
7: 0000146c 0 NOTYPE GLOBAL DEFAULT ABS __bss_start
この時点で、ローダー(誰?)をだましてシンボルを選択させるために何ができるかわかりません。私は正しい方向に進んでいますか?