使用 LD_PRELOAD 变量拦截调用

时间:2023-02-23 21:58:09

背景&原理

很多 a.out 程序都依赖动态库 libc.so, 比如使用 strcmp() 比较密码, 其实是不安全的

使用 LD_PRELOAD 变量可以使该变量中的可链接文件(编译时使用-rdynamic导出符号的a.out或.so)的符号优先被使用,

如果我们自己编译一个libc.so加入LD_LIBRARY_PATH变量, 同时该库依赖系统libc.so, 那么就可以拦截想拦截的c函数!

解决办法: ?

实例

  • main.c
#include <unistd.h>
#include <stdio.h>
#include <termios.h>
#include <stdlib.h>
#include <string.h> int
main(int argc, char **argv) {
char passwd[1024] = { 0 };
//******输入密码
struct termios save, current;
tcgetattr(0, &save);// 得到原来的终端属性
current = save;
current.c_lflag &= ~ECHO;// 关闭回显
tcsetattr(0, TCSANOW, &current);// 设置新的终端属性 write(1, "请输入密码: ", 17);;
scanf("%s", passwd);
setbuf(stdin, NULL); tcsetattr(0, TCSANOW, &save);// 恢复原来的终端属性
//******
puts(""); if (strcmp("userpass", passwd) == 0) {
puts("密码正确");
} else {
puts("密码错误");
} return 0;
}
  • holdStrcmp.c
#include <stdio.h>

int
strcmp(const char *a, const char *b) {
printf("拦截到调用, a=\"%s\", b=\"%s\" \n", a, b);
return 0;
}

编译&运行

develon@Topmain:~/c$ gcc passwd.c
develon@Topmain:~/c$ gcc -shared -fPIC holdStrcmp.c -o libc.so
develon@Topmain:~/c$ LB_LIBRARY_PATH=. LD_PRELOAD=./libc.so a.out

正常运行

使用 LD_PRELOAD 变量拦截调用

拦截strcmp()

使用 LD_PRELOAD 变量拦截调用

使用 LD_PRELOAD 变量拦截调用的更多相关文章

  1. Atititcmd cli环境变量的调用设置与使用

    Atititcmd cli环境变量的调用设置与使用 1.1. Cgi 环境变量的调用设置与使用1 1.2. 环境变量vs  系统变量1 1.3. 环境变量的分类 A.与服务器相关的环境变量B ,与客户 ...

  2. 一种简单的hook方法--LD&lowbar;PRELOAD变量

    LD_PRELOAD这个变量允许你定义在程序运行时优先加载的动态链接库,从而在程序运行时的动态链接 下面程序的看一个例子-getuid.c //getuid.c #include<stdio.h ...

  3. python3--&lowbar;&lowbar;call&lowbar;&lowbar;拦截调用

    __call__拦截调用 当实例调用时,使用__call__方法.不,这不是循环定义:如果定义了,Python就会为实例应用函数调用表达式运行__call__方法.这样可以让类实例的外观和用法类似于函 ...

  4. js中子页面父页面方法 变量相互调用

    (1)子页面调用父页面的方法或者变量: window.parent.方法()或者变量名window.parent相当于定位到父页面  之后的操作和在父页面中写代码一样写 window.parent.a ...

  5. php 通过变量 来调用函数

    <?php function fun() { echo 'fun'; } $a = 'fun'; $a(); ?> 复制代码 上面的$a变量就是fun()函数,调用$a()和调用fun() ...

  6. awk引用外部变量及调用系统命令方法

    目标:想用awk与scp命令批量传送文件 前提:先搭好主机间的免密登陆环境(参考:http://www.cnblogs.com/tankaixiong/p/4172942.html) 实现脚本方法: ...

  7. JavaScript获取后台C&num;变量以及调用后台方法

    http://www.educity.cn/develop/495493.html 有时需要在JavaScript中获取后台变量的值,来判断JavaScript的执行逻辑,或者需要调用C#后台方法获取 ...

  8. js中子页面父页面方法和变量相互调用

    (1)子页面调用父页面的方法或者变量: window.parent.方法()或者变量名window.parent相当于定位到父页面 之后的操作和在父页面中写代码一样写 window.parent.aa ...

  9. linux C 刚初始化后的一个变量在调用一个静态库中函数后被异常修改为乱码

    linux C 中声明并初始化一个变量const char a[512]="test";后,接着调用了一个静态库中的函数函数test(b);,a并没有传入test函数,但在调用这个 ...

随机推荐

  1. js&lowbar;apply与call

    在ECAMScript3给Function的原型定义了两个方法,它们是Function.prototype.call和Function.prototype.apply. 本文详细介绍了apply与ca ...

  2. 投资人谈VR色变,VR好戏却刚刚开始

    去年下半年,资本圈谈O2O色变,以至于创业者们都不敢说自己做O2O:到了今年下半年,资本圈却成为了谈VR色变--在中国的互联网科技创业中,资本市场已经成为了创业的一种风向标.资本走向哪里,创业者就走向 ...

  3. 简易qq对话框

    //本程序由QT5 creator编译可运行 //dialog.h 1 #ifndef DIALOG_H #define DIALOG_H #include <QDialog> class ...

  4. UIView的剖析&lpar;转&rpar;

    转自:http://blog.csdn.net/mengtnt/article/details/6716289 前面说过UIViewController,但是UIView也是在MVC中非常重要的一层  ...

  5. JAVA基础学习day27--反射机制

    一.概述 1.1.概述 反射的概念: 在Java中的反射机制是指在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法; 对于任意一个对象,都能够调用它的任意一个方法; 这种动态获取信息以及动 ...

  6. hadoop权威指南 读书笔记

    1 数据库和MapReduce对比 2 hadoop 包含的内容

  7. encodeURI&lpar;encodeURI&lpar;name&rpar;&rpar; &semi;文件上传

    window.location.href = xxxx?a=encodeURI(encodeURI(name)) ;// 编码name是中文,页面部分需要编码两次name = java.net.URL ...

  8. 添加本地jar包到本地的Maven仓库以及在Maven仓库中搜索想要添加的jar包

    今天在学习Memacached的时候,将java_memcached-release下载下来,要使用maven来集成相关的jar包,Memcached的jar包如下: java_memcached-r ...

  9. java中long类型的比较

    int类型最大存储10位,因此很多地方要用到long类型,它的存储位数是+-19位 范围:-9223372036854775808到9223372036854775807解释:long类型是64位的也 ...

  10. Mysql环境搭建&lpar;及中文乱码解决&rpar;

    卸载MySQL 电脑已经安装过mysql的 卸载电脑上的mysql方法: 我的电脑-->右键-->属性-->高级系统设置-->环境变量-->系统变量里面-->找到环 ...