当前位置: 首页 > article >正文

常见二进制漏洞原理及分析

本文将介绍常见二进制漏洞类型及避免方法。一.虚拟内存的布局Linux中进程使用虚拟内存再由MMU转换成物理内存其虚拟内存布局如下其中堆区向高 地址生长栈区向低地址生长且代码段和rodata段为只读属性。栈区高地址共享库 / 内存映射区mmap 区堆区数据段.data/.rodata/.bss代码段.text低地址二.常见漏洞类型1.缓冲区溢出漏洞由于用户输入时未进行长度校验导致用户输入长度超过缓冲区长度因而覆盖其他内存int main() { char buffer[16]; printf(please input); read(0, buffer, 100);//这里有明显的溢出 printf(your content:%s\n, buffer); return 0; }上面的代码中read的长度明显超过buffer的长度会造成栈溢出。同理当使用malloc()申请堆内存时就会造成堆溢出。所以在开发中尽量避免使用gets()strcpy()read()等危险函数同时要对用户输入进行长度校验。2.整形漏洞由于对整数的取值范围符号隐式类型转换的忽略导致的安全问题。void check_length(int input_len) { unsigned int safe_len input_len;//触发漏洞 if (input_len 16) { char buffer[16]; printf(input:); read(0, buffer, input_len); printf(content:%s\n, buffer); } else { printf(overflow\n); } }上图输入长度校验函数中因为int类型默认为有符号将int类型的input_len转化为无符号的int类型就会产生问题。当用户输入一个负数会将这个负数的补码存在内存中当使用时会直接将补码当做超大正数首先绕过检测然后进行read函数时发生溢出。3.格式化字符串漏洞格式化字符串漏洞是指用户输入中含有格式化字符换导致的printf()函数被错误执行。void log_write(const char* user_input) { char log_buf[256]; strcpy(log_buf, 用户操作); strcat(log_buf, user_input); printf(log_buf);//触发漏洞 printf(\n); }上图的日志写入函数中想将用户输入进行拼接然后输出但是printf()函数有两个特殊的格式化字符串%p可以输出地址%n可以向内存写入数据这样就会导致地址泄露相关问题。4.指针相关漏洞下面一种典型的可能触发Use after free漏洞代码例子主要由于free()函数触发。typedef struct { int id; char* name; } Person; Person* create_Person(int id, const char* name) { Person* p (Person*)malloc(sizeof(Person)); p-id id; p-name (char*)malloc(strlen(name) 1); strcpy(p-name, name); return p; } int main() { Person* person create_Person(1001, ZhangSan); printf(ID%d, Name%s\n, person-id, person-name); free(person-name); free(person); return 0; }上面的代码就是可能触发UAF漏洞的高危代码程序首先定义一个新类型Person然后定义了创建该类型的函数main函数中创建后使用然后释放但是释放后未将指针置空造成野指针。如果下面的代码出现再次使用这个指针的时候就会触发漏洞。下面则是空指针解引用漏洞的典型例子。struct data{ int id; int value; }; int main(){ struct data* p NULL; p (struct data*)malloc(sizeof(struct data)); p-id 1; p-value 100; free(p); p NULL; return 0; }这段代码中使用的p指针进行对data对象的处理但是其实我们并不知道p指针是否创建成功。所以必须要对p指针进行是否为NULL的判断if(p NULL){ return 1; }5.多线程相关程序漏洞主要是由于程序使用了多线程但是多线程同时访问了同一个内存或文件从而造成竞争。int count 0; void* task(void* arg){ int i; for(int i 0; i 1000000; i){ count; } return NULL; } int main(){ pthread_t t[10]; for(int i0;i10;i){ pthread_create(t[i],NULL,task,NULL); } for(int i0;i10;i){ pthread_join(t[i],NULL); } printf(count %d\n,count); return 0; }上面这段程序中就是点典型的动态竞争漏洞程序中开启了十个线程同时给count变量进行自增的任务但是并没有加锁导致会出现两个线程同时对count做操作造成结果错误。5.类型混淆漏洞由于强制类型转换导致的内存作物修改致使数据出错。class father { public: virtual void func1() { std::cout father std::endl; } int a; }; class childA : public father { public: void func1() override { std::cout child1 std::endl; } int b; }; class childB : public father { public: void func1() override { std::cout child2 std::endl; } int c; }; int main() { childA* Ap new childA(); Ap-b 10; childB* Bp (childB*)Ap; Bp-c 20; std::coutAp-bstd::endl; return 0; }这个就是一个类型混淆的基本实例由于强制将chiildA类型转化为childB类型导致程序按照childB的方式解析childA的内存布局了导致修改出错。三.常见防范手段1.缓冲区溢出防护手段主要有内存地址随机化(PIE)Canary以及NX等可以使用下面命令查看checksec ./your_program如图就是开启了PIE和NX但是没有开启canary保护栈保护较弱。Canary就是一个标志位如果栈被篡改标志位也会被篡改就可以发现栈溢出问题。NX就是让栈上的数据不可执行PIE 是让整个程序的基地址包括代码段、数据段、栈、堆随机化从而大幅增加 offset的计算难度。2.对于由于多线程造成的漏洞可以采用加互斥锁或这个改用原子操作。互斥锁常用函数主要有三个初始化锁上锁和开锁//初始化锁 int pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutexattr_t *restrict attr); //上锁 int pthread_mutex_lock(pthread_mutex_t *mutex); //开锁 int pthread_mutex_unlock(pthread_mutex_t *mutex);进入任务函数时要上锁防止其他线程竞争同时完成任务时也要开锁让其他线程继续使用。同时也可以使用原子操作原子操作就是将好几步完成的事强制一步干完了使得CPU不能打断其性能高于互斥锁但是操作比较简单。常用数据结构如下。atomic_int a 0; // 原子int atomic_short b 0; // 原子short atomic_long b 0; // 原子long atomic_char c x; // 原子char常见函数及示例如下1.原子读取返回原子变量count的当前值给valint val atomic_load(count);//示例2.原子赋值把 val 写入原子变量atomic_store(count, 0);3.原子加操作atomic_fetch_add(count, 1); // count4.原子减操作atomic_fetch_and(flag, 0x01);// count-25.比较并交换atomic_compare_exchange_strong(a,b,c) //当a b将a改成c返回true //当a ! b将b改成a返回false以上是一些常用二进制漏洞以及一些预防方式同时这些只是基础原理真实漏洞会更加复杂。本人新手如有错误欢迎各位大佬指点。

相关文章:

常见二进制漏洞原理及分析

本文将介绍常见二进制漏洞类型及避免方法。一.虚拟内存的布局Linux中进程使用虚拟内存,再由MMU转换成物理内存,其虚拟内存布局如下,其中堆区向高 地址生长,栈区向低地址生长,且代码段和rodata段为只读属性。栈区 …...

永磁同步电机伺服控制仿真:三环PI参数自整定Matlab模型探秘

永磁同步电机伺服控制仿真三环PI参数自整定 Matlab仿真模型 1.模型简介模型为永磁同步电机伺服控制仿真,采用 Matlab R2018a Simulink搭建。模型内主要包含DC直流电压源、三相逆变器、永磁同步电机、采样模块、SVPWM、Clark、Park、Ipark、位置环、速度环、电流环等…...

用 Copilot 一年后,我的代码质量变好了还是变差了?

01 从怀疑到离不开去年这个时候,GitHub Copilot 刚在我们小组里小范围开放试用。我当时的态度是不屑一顾的——一个 AI 能懂多少逻辑?代码补全不还是靠 IDE 的智能提示?况且我学了几年 Java,写过多少个项目,什么场景没…...

电网电压扰动下相光伏并网逆变器控制的Simulink仿真探索

电网电压扰动联系相光伏并网逆变器的控制 simukink仿真 电流闭环控制的逆变器并网 LCL 型输出滤波器 含有文档报告在光伏并网发电系统中,逆变器作为核心部件,其性能的优劣直接影响到电能质量和系统稳定性。而电网电压扰动是实际运行中不可避免的问题&am…...

内存涨价、供应不稳?嵌入式工程师必看:适合轻量级项目ARM选型与存储避坑指南

在嵌入式开发的圈子里,很多工程师都经历过这种“阵痛”: 原本用得好好的高性能单片机(MCU),随着项目需求的增加——要接个高分辨率屏、要做个复杂的协议转换、要跑个轻量级语音识别,或者要处理多路音频流—…...

高速追剪程序之定长追剪实战

高速追剪程序,定长追剪,威纶触摸屏汇川5u全套程序,注释清楚。最近搞了个高速追剪的项目,用的是威纶触摸屏搭配汇川5u的全套程序,今天来跟大家分享一下。 整体思路 高速追剪的核心目标就是在物料高速运动过程中&#xf…...

提示词工程:这样跟AI说话,它才听你的!

哈,提示词是什么?简单来说,提示词(Prompt) 就是你向人工智能(比如我)发出的指令或问题。它是你用来描述“希望AI干什么”的那段文字。AI会根据你提供的提示词,来生成相应的回答或内容…...

微电网二次控制:下垂控制与基于数据采样二次控制的奇妙融合

微电网二次控制,下垂控制,基于数据采样的二次控制,补偿了下垂控制的偏差,实现了有功均分,效果好在微电网的运行控制领域,下垂控制和基于数据采样的二次控制是两个关键的技术点,它们相互配合&…...

无人零售/五金厂必看!边缘设备Java+YOLOv11推理稳定性全攻略:崩溃率从15%降到0.1%,断点续检1秒恢复

今年帮深圳南山的无人零售创业公司和东莞长安的五金厂同时做了边缘设备Java+YOLOv11推理的稳定性升级——无人零售那边是100个瑞芯微RK3588货架盘点设备,之前的崩溃率15%/天,每天要重启3-5次,数据丢失10%+,断点续检难,每次重启要重新盘点所有10个货架(10分钟),效率低,…...

STM32串口双机模拟汽车电量里程项目:Protues仿真与源码解析

STM32单片机开发的串口双机模拟汽车电量里程项目,两个STM32单片机进行数据交互,模拟主控与驱动传感器发送数据,可以手动调节数据,并显示屏显示出来。 包括程序源码和protues仿真8.12版本。 程序源码注释详细。 非常适合开发人员&a…...

基于Matlab的螺丝轮廓识别:数字图像处理流程

基于matlab的螺丝轮廓识别,matlab数字图像处理。 对输入图像进行灰度化,滤波,平滑操作然后进行阈值化,分割成二值图像,之后对图像进行图像的形态学操作,最终使用边缘检测算法提取边缘,最终获得十…...

SpringBoot3实战集成mzt-biz-log,一行代码搞定业务日志记录

作为后端开发者,业务日志是线上问题排查、操作追溯和审计留痕的核心抓手。手写业务日志不仅重复代码量大,还容易出现记录不规范、关键信息漏记错记的问题,排查线上问题时往往效率极低。最近我在SpringBoot3项目中接入了mzt-biz-log这款轻量业…...

搞嵌入式开发的小伙伴应该都遇到过PID调参这个头疼的问题吧?今天咱们直接上干货,聊聊怎么在STM32上玩转PID自整定和温度控制。先扔个核心代码片段镇楼

基于STM32开发的PID自整定和PID温控和PWM输出程序源码,采用反馈法进行PID参数自动整定,得出系统临界值比例增益,自动计算调节,使系统进入正常状态。 程序源码注释详细typedef struct {float Kp;float Ki;float Kd;float integral_…...

智能指针相关

零、预备知识 右值: 表示不可寻址的临时数据值。 根据C11标准,右值分为纯右值(如字面量、表达式结果)和将亡值(即将销毁的对象)。 右值具有不可修改、无持久内存地址的特性 右值引用&&、移动语义…...

当立体车库遇上PLC仿真

西门子1200PLC立体车库 33立体车库 博图触摸屏仿真 不需要实物 自带人机界面,动画,可以仿真 还有接线图原理图 现在拥有自动出入仓库的功能 IO表已列出最近捣鼓了个挺有意思的项目——基于西门子1200PLC的33立体车库仿真。不用焊线接电机,纯…...

HTML基础教程(一)

目录 一、HTML基本概念 二、基础HTML (Tag) 三、Html常用格式 一、HTML基本概念 什么是HTML文件? HTML的英文全称是Hypertext Marked Language,中文叫做“超文本标记语言”。和一般文本的不同的是,一个HTML文件不…...

AI基石 | 对齐技术:从 RLHF 到 DPO —— 赋予大模型“三观”的终极进化

AI基石 | 对齐技术:从 RLHF 到 DPO —— 赋予大模型“三观”的终极进化 前言 如果 SFT(监督微调)后的模型是一个“懂事”的练习生,那么对齐后的模型就是一个“老练”的专家。 练习生虽然知道问答的格式,但依然存在两个…...

俄罗斯RT-2PM2“白杨-M“(Topol-M)洲际弹道导弹系统完整技术报告

Comprehensive Technical Report on Russias RT-2PM2 Topol-M Intercontinental Ballistic Missile System 报告日期:2026年3月11日 保密级别:公开来源情报(OSINT) 摘要(Executive Summary) RT-2PM2"…...

Java线程池面试题50道(含答案解析)

在Java后端开发面试中,线程池(ThreadPool) 是并发编程的重要考点之一。 在高并发系统中,合理使用线程池可以 提高系统性能、减少线程创建开销、避免资源耗尽。 很多互联网公司在面试Java工程师时都会重点考察: 线程池原…...

Clawdbot 杀红眼了,几天怒斩 80k+ Star!你真正的 AI 数字员工来了!!(附保姆级安装使用教程)

最近一款 AI 开源工具 Clawdbot 杀疯了,人送外号:大龙虾,短短几天时间,GitHub 上 Star 数量暴涨到 80k,因为名称与 Claude 相似,还被 Anthropic 公司警告被迫改名:Moltbot。 Moltbot 的核心是它…...

Python3.9环境配置太麻烦?试试这个Miniconda镜像,一键部署

Python3.9环境配置太麻烦?试试这个Miniconda镜像,一键部署 还在为配置Python开发环境而头疼吗?从源码编译安装,要解决一堆依赖问题;手动下载安装包,又担心版本冲突和路径混乱。特别是当你需要Python 3.9这…...

从原理到代码:深度解析Halcon中segment_contours_xld的Ramer算法实现

从原理到代码:深度解析Halcon中segment_contours_xld的Ramer算法实现 在机器视觉的工程实践中,我们常常需要将相机捕捉到的、由像素点构成的连续轮廓,转化为更高级、更易于理解和处理的几何基元,比如直线、圆弧或椭圆弧。这个过程…...

Keil5 vs Keil6:如何选择?附带Keil5中STM32开发环境搭建全攻略(含FreeRTOS移植准备)

Keil MDK 进化论:从经典到现代,如何为你的STM32项目选择最佳开发环境 作为一名在嵌入式领域摸爬滚打了多年的开发者,我至今还记得第一次打开Keil MDK时那种既兴奋又茫然的心情。那个经典的蓝色界面,几乎成了ARM Cortex-M开发的代名…...

第三期:基于立创·梁山派开发板的游戏机扩展板训练营全记录

第三期:基于立创梁山派开发板的游戏机扩展板训练营全记录 大家好,我是老张,一个在嵌入式行业摸爬滚打了十几年的工程师。最近,我作为导师完整地跟进了立创EDA举办的“梁山派游戏机扩展板训练营”第三期。看到很多朋友对如何从零开…...

OAuth2.0中state参数的深度应用:业务数据的安全传输与防CSRF实践

1. 不只是防CSRF:重新认识OAuth2.0的state参数 很多刚开始接触OAuth2.0的开发者,一看到state参数,第一反应就是“哦,防CSRF的”。这个理解没错,但只对了一半。在实际项目中,尤其是在需要深度集成的场景里&a…...

Ubuntu20.04下拯救者笔记本亮度调节失效?NVIDIA驱动加载顺序问题全解析

Ubuntu 20.04 下拯救者笔记本亮度调节失效?NVIDIA 驱动加载顺序问题全解析 最近在联想拯救者系列笔记本上安装 Ubuntu 20.04 的朋友,可能都遇到过同一个令人头疼的问题:屏幕亮度过高,刺眼得让人无法工作,而无论是系统设…...

SAR动目标检测系列:【5】多基线联合处理下的三维速度解耦

1. 从二维到三维:为什么我们需要多基线联合处理? 在上一篇文章里,我们聊透了如何利用单天线或者双天线SAR系统,去估计动目标的二维速度(也就是方位向和距离向的速度)。这就像你用手机拍一个移动的物体&…...

Flink实战:如何用KeyedProcessFunction实现温度异常检测(附完整代码)

从零构建实时温度异常检测系统:深入Flink KeyedProcessFunction核心实战 最近在帮一个做智慧农业的朋友处理温室大棚的监控数据,他们部署了上百个温湿度传感器,数据像潮水一样涌来。最头疼的不是数据量大,而是如何从这些实时流里快…...

KITTI 3D 数据可视化:从点云到鸟瞰图的实战解析

1. 从零开始:理解KITTI数据集与3D点云 大家好,我是老张,在自动驾驶这个行当里摸爬滚打了十来年,跟激光雷达和相机数据打了无数次交道。今天,我想跟你聊聊一个非常基础但又极其重要的技能:如何把KITTI数据集…...

内存马二:Filter

Filter内存马 源码学习 首先写一个普通的Filter了解一下重点数据的传递过程,断点到内部的一行,往上找。回到的是org.apache.catalina.core.ApplicationFilterChain#internalDoFilter,这部分找到filters找filters的赋值的地方,找到…...