| 欺騙庫函數(shù) 
 我們可以愚弄那些比較傻的用戶。如果你利用LD_PRELOAD環(huán)境變量來捉弄他,你可以讓他執(zhí)行你自己的代碼,你已經(jīng)利用LD_PRELOAD環(huán)境變量把標準的庫函數(shù)替換成了你自己的程序,挺有意思吧?LD_PRELOAD并不是linux系統(tǒng)特有的,并且它一般用在一些應(yīng)用程序(比如老版本的StarOffice需要運行在較新版本的Redhat系統(tǒng)上)必須用他們自己的(或者比較老的版本,或者修改過的)庫函數(shù),因為在安裝的時候沒有滿足他們的需求。Quantum(Staog病毒的作者)在Unix病毒的郵件列表里面提供了這些代碼,我做了修改,也是為了便于大家理解:
 
 
 
| ------------------------tryld.c------------------------------
extern int __open(char *, int, int); 
extern int execv(char *, char *[], char *envp[]); 
int open(char *path, int flags, 
int mode){ 
printf("open: %s\n", path); 
return __open(path, flags, mode); 
} 
/* 注意這里,原來它放棄了envp參數(shù),這樣會...:(?! 
呵呵,所以我修改了一下,影響不大:)*/ 
int execve(char *path, char *args[], 
char *envp[]){ 
printf("execve: %s\n", path); 
return execv(path, args, envp); 
} 
-------------------------------------------------------------- |  
 
 
| ------------------------main.c--------------------------------
/*test only,by e4gle*/ 
#include 
#include 
#include 
#include 
main() 
{ 
int fd; 
execve("/bin/date","",NULL); 
if(fd=open("/etc/inittab",O_RDONLY)!=-1) 
{ 
fprintf(stdout,"open file succeed!\n"); 
} 
else 
fprintf(stderr,"open error!\n"); 
close(fd); 
return 0; 
} 
---------------------------------------------------------------- |  
 這段代碼獲取open和execv并且改變了它們的輸出,好,我們測試一下:
 
 
 
| [e4gle@redhat62 elf]$ gcc -o main main.c 
[e4gle@redhat62 elf]$ ./main 
open file succeed! <--證明我們打開文件成功了,open調(diào)用正常工作 
[e4gle@redhat62 elf]$ ldd -v -r ./main 
libc.so.6 => /lib/libc.so.6 (0x4001c000) 
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000) 
Version information: 
./main: 
libc.so.6 (GLIBC_2.0) => /lib/libc.so.6 
/lib/libc.so.6: 
ld-linux.so.2 (GLIBC_2.1.1) => /lib/ld-linux.so.2 
ld-linux.so.2 (GLIBC_2.1) => /lib/ld-linux.so.2 
ld-linux.so.2 (GLIBC_2.0) => /lib/ld-linux.so.2 
/*跟蹤一下庫函數(shù)的利用,都是glibc的標準庫函數(shù),solaris里面是sotruss,我個人認為sotruss 
比較好用:)*/ 
[e4gle@redhat62 elf]$ gcc -shared -o tryld tryld.c 
[e4gle@redhat62 elf]$ export LD_PRELOAD=./tryld <--用我們自己的lib 
[e4gle@redhat62 elf]$ ./main 
execve: /bin/date 
open: /etc/inittab 
open file succeed! 
/*注意!不一樣了吧?已經(jīng)在用我們自己的open和execve了,呵呵:)*/ |  
 以上僅僅是個測試代碼并且沒有任何危害性,但是它足以說明我們利用欺騙函數(shù)庫來攻擊程序的原理。
 我們可以愚弄那些比較傻的用戶。如果你利用LD_PRELOAD環(huán)境變量來捉弄他,你可以讓他執(zhí)行你自己的代碼,你已經(jīng)利用LD_PRELOAD環(huán)境變量把標準的庫函數(shù)替換成了你自己的程序,挺有意思吧?LD_PRELOAD并不是linux系統(tǒng)特有的,并且它一般用在一些應(yīng)用程序(比如老版本的StarOffice需要運行在較新版本的Redhat系統(tǒng)上)必須用他們自己的(或者比較老的版本,或者修改過的)庫函數(shù),因為在安裝的時候沒有滿足他們的需求。Quantum(Staog病毒的作者)在Unix病毒的郵件列表里面提供了這些代碼,我做了修改,也是為了便于大家理解:欺騙庫函數(shù)
 
 
 
 
 
| ------------------------tryld.c------------------------------
extern int __open(char *, int, int); 
extern int execv(char *, char *[], char *envp[]); 
int open(char *path, int flags, 
int mode){ 
printf("open: %s\n", path); 
return __open(path, flags, mode); 
} 
/* 注意這里,原來它放棄了envp參數(shù),這樣會...:(?! 
呵呵,所以我修改了一下,影響不大:)*/ 
int execve(char *path, char *args[], 
char *envp[]){ 
printf("execve: %s\n", path); 
return execv(path, args, envp); 
} 
-------------------------------------------------------------- |  
 
 
| ------------------------main.c--------------------------------
/*test only,by e4gle*/ 
#include 
#include 
#include 
#include 
main() 
{ 
int fd; 
execve("/bin/date","",NULL); 
if(fd=open("/etc/inittab",O_RDONLY)!=-1) 
{ 
fprintf(stdout,"open file succeed!\n"); 
} 
else 
fprintf(stderr,"open error!\n"); 
close(fd); 
return 0; 
} 
---------------------------------------------------------------- |  
 這段代碼獲取open和execv并且改變了它們的輸出,好,我們測試一下:
 
 
 
| [e4gle@redhat62 elf]$ gcc -o main main.c 
[e4gle@redhat62 elf]$ ./main 
open file succeed! <--證明我們打開文件成功了,open調(diào)用正常工作 
[e4gle@redhat62 elf]$ ldd -v -r ./main 
libc.so.6 => /lib/libc.so.6 (0x4001c000) 
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000) 
Version information: 
./main: 
libc.so.6 (GLIBC_2.0) => /lib/libc.so.6 
/lib/libc.so.6: 
ld-linux.so.2 (GLIBC_2.1.1) => /lib/ld-linux.so.2 
ld-linux.so.2 (GLIBC_2.1) => /lib/ld-linux.so.2 
ld-linux.so.2 (GLIBC_2.0) => /lib/ld-linux.so.2 
/*跟蹤一下庫函數(shù)的利用,都是glibc的標準庫函數(shù),solaris里面是sotruss,我個人認為sotruss 
比較好用:)*/ 
[e4gle@redhat62 elf]$ gcc -shared -o tryld tryld.c 
[e4gle@redhat62 elf]$ export LD_PRELOAD=./tryld <--用我們自己的lib 
[e4gle@redhat62 elf]$ ./main 
execve: /bin/date 
open: /etc/inittab 
open file succeed! 
/*注意!不一樣了吧?已經(jīng)在用我們自己的open和execve了,呵呵:)*/ |  
 以上僅僅是個測試代碼并且沒有任何危害性,但是它足以說明我們利用欺騙函數(shù)庫來攻擊程序的原理。
 
 |