背景&原理

很多 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

正常运行

拦截strcmp()

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

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

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

  2. 一种简单的hook方法--LD_PRELOAD变量

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

  3. python3--__call__拦截调用

    __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#变量以及调用后台方法

    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. JavaScript 节流函数 Throttle 详解

    在浏览器 DOM 事件里面,有一些事件会随着用户的操作不间断触发.比如:重新调整浏览器窗口大小(resize),浏览器页面滚动(scroll),鼠标移动(mousemove).也就是说用户在触发这些浏 ...

  2. Java通过JDBC连接数据库的三种方式!!!并对数据库实现增删改查

    前言 java连接数据库完整流程为: 1,获得驱动(driver),数据库连接(url),用户名(username),密码(password)基本信息的三种方式. 2,通过获得的信息完成JDBC实现连 ...

  3. Linux学习历程——Centos 7 find 命令

    一.命令介绍 find 命令用于按照指定条件来查找文件. 一些比较常用参数如下表 参数 作用 -name 匹配名称 -perm 匹配权限mode为完全匹配( –mode包含即可) -user 匹配所有 ...

  4. WSL(Windows Subsystem for Linux)--Pico Process Overview

    [转载] Windows Subsystem for Linux -- Pico Process Overview Overview This post discusses pico processe ...

  5. C# -- 使用 DriveInfo 获取磁盘驱动器信息

    C# -- 使用 DriveInfo 获取磁盘驱动器信息 1. 代码实现 class Program { static void Main(string[] args) { GetComputerDi ...

  6. goodbye 2018, hello 2019

    纵使不愿意,终究还是到了岁末. 2018 ​ 即将过去的一年,已经完成的事情自己做得不足.年初计划要做的几件事情都做了,感觉没有尽力去做好. 工作 ​ 16年毕业之后到今年,算是真正意义上完成从学生时 ...

  7. [转帖]Windows Server 2016各种版本介绍

    Windows Server 2016各种版本介绍 http://www.5sharing.com/js/zx/872.html windows server的版本 时间:2018-10-06 10: ...

  8. this直接加在函数或者是 “原型”对象的区别

    如果加在函数上,可以用函数直接调用,如果是加在原型对象时,那就的创建新对象,才能使用,最重要的是影响继承 直接加在函数上的,不能被新对象继承

  9. 浅谈kafka streams

    随着数据时代的到来,数据的实时计算也越来越被大家重视.实时计算的一个重要方向就是实时流计算,目前关于流计算的有很多成熟的技术实现方案,比如Storm.Spark Streaming.flink等.我今 ...

  10. Nginx CONTENT阶段 autoindex、index模块

    L 66 autoindex 指令 syntax : on | off; default : off; context : http,server,location; autoindex_exact_ ...