「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
この時点で、ローダー(誰?)をだましてシンボルを選択させるために何ができるかわかりません。私は正しい方向に進んでいますか?