把系统函数替换掉,就重新写一个与标准库相同的函数.

由于调用系统的库不行,那么要调用自己写的函数库,有多种方法.
1,自己写一个sharelib
2,使用preload

我们写下面一段例程:
/* 文件名:verifypasswd.c */
/* 这是一段判断用户口令的程序,其中使用到了标准C函数strcmp*/
 

 
 
  1. #include <stdio.h> 
  2. #include <string.h> 
  3. int main(int argc, char **argv)   
  4. {  
  5. char passwd[] = "password";  
  6. if (argc < 2) {  
  7. printf("usage: %s <password>\n", argv[0]);  
  8. return;  
  9. }  
  10. if (!strcmp(passwd, argv[1])) {  
  11. printf("Correct Password!\n");  
  12. return;  
  13. }  
  14. printf("Invalid Password!\n");  

在上面这段Unix操作系统程序中,我们使用了strcmp函数来判断两个字符串是否相等。下面,我们使用一个动态函数库来重载strcmp函数:
 

 
 
  1. /* 文件名:hack.c */  
  2. #include <stdio.h> 
  3. #include <string.h> 
  4. int strcmp(const char *s1, const char *s2)  
  5. {  
  6. printf("hack function invoked. s1=<%s> s2=<%s>\n", s1, s2);  
  7. /* 永远返回0,表示两个字符串相等 */  
  8. return 0;  

编译程序:
 

 
 
  1. $ gcc -o verifypasswd verifypasswd.c  
  2. $ gcc -shared -o hack.so hack.c 


测试一下程序:(得到正确结果)
 

 
 
  1. $ ./verifypasswd asdf  
  2. Invalid Password! 

设置LD_PRELOAD变量:(使我们重写过的strcmp函数的hack.so成为优先载入链接库)
 $ export LD_PRELOAD="./hack.so"

再次运行程序:
 

 
 
  1. $ ./verifypasswd  asdf  
  2. hack function invoked. s1=<password> s2=<asdf> 
  3. Correct Password! 

1)我们的hack.so中的strcmp被调用了。
2)主程序中运行结果被影响了。

system的代码直接照猫画虎了.

经过测试,preload不如直接写在代码里面效率高.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值