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

Linux:用户空间非法指针coredump简析

1. 前言

限于作者能力水平,本文可能存在谬误,因此而给读者带来的损失,作者不做任何承诺。

2. 背景

本文分析基于 ARM32 架构Linux-4.14 内核代码。

3. 问题分析

3.1 测试范例

void main(void)
{*(int *)0 = 8;
}

运行程序会 coredump 。

3.2 分析

3.2.1 ARM32 3级页表(PAE使能)

在这里插入图片描述
上图看起有点复杂,我们简化一下,Linux 下内存的访问的过程大概是这样的:

          MMU页表
虚拟地址 --------> 物理地址

3.2.2 生成 coredump

每当发生内存访问时,如果从虚拟地址到物理地址的转换路径中,不管是哪级页表没有就绪,ARM32系统都会产生缺页中断,因此我们分析的起点就是缺页中断的入口。先看看中断向量表:

@ arch/arm/kernel/entry-armv.Svector_stub	dabt, ABT_MODE, 8.long	__dabt_usr			@  0  (USR_26 / USR_32).long	__dabt_invalid			@  1  (FIQ_26 / FIQ_32).long	__dabt_invalid			@  2  (IRQ_26 / IRQ_32).long	__dabt_svc			@  3  (SVC_26 / SVC_32).long	__dabt_invalid			@  4.long	__dabt_invalid			@  5.long	__dabt_invalid			@  6.long	__dabt_invalid			@  7.long	__dabt_invalid			@  8.long	__dabt_invalid			@  9.long	__dabt_invalid			@  a.long	__dabt_invalid			@  b.long	__dabt_invalid			@  c.long	__dabt_invalid			@  d.long	__dabt_invalid			@  e.long	__dabt_invalid			@  f.globl	vector_fiq/* 各个CPU模式下的中断向量表指针 */.section .vectors, "ax", %progbits
.L__vectors_start:W(b)	vector_rstW(b)	vector_undW(ldr)	pc, .L__vectors_start + 0x1000W(b)	vector_pabtW(b)	vector_dabt /* DataAbort模式的中断向量表指针 */W(b)	vector_addrexcptnW(b)	vector_irqW(b)	vector_fiq/* 缺页(DataAbort)中断可产生于[SVC、用户]两种模式下 */
__dabt_usr: /* 用户模式缺页中断 */...dabt_helper // bl	CPU_DABORT_HANDLER -> bl v7_early_abort....align	5
__dabt_svc: /* SVC模式缺页中断 */...dabt_helper // bl	CPU_DABORT_HANDLER  -> bl v7_early_abort...
@ arch/arm/mm/abort-ev7.S.align	5
ENTRY(v7_early_abort)mrc	p15, 0, r1, c5, c0, 0		@ get FSRmrc	p15, 0, r0, c6, c0, 0		@ get FARuaccess_disable ip			@ disable userspace access...b	do_DataAbort
ENDPROC(v7_early_abort)
/** 以3级页表举例。* arch/arm/mm/fsr-3level.c */
static struct fsr_info fsr_info[] = {.../* 缺页中断处理接口 */{ do_translation_fault,	SIGSEGV, SEGV_MAPERR,	"level 1 translation fault"	}, /* 1级页目录转换接口 */{ do_translation_fault,	SIGSEGV, SEGV_MAPERR,	"level 2 translation fault"	}, /* 2级页目录转换接口 */{ do_page_fault,	SIGSEGV, SEGV_MAPERR,	"level 3 translation fault"	}, /* 3级页表项转换接口 */...
};/** arch/arm/mm/fault.c */
asmlinkage void __exception
do_DataAbort(unsigned long addr, unsigned int fsr, struct pt_regs *regs)
{const struct fsr_info *inf = fsr_info + fsr_fs(fsr);struct siginfo info;/* 调用具体类型缺页中断的入口: do_translation_fault() 或 do_page_fault() */if (!inf->fn(addr, fsr & ~FSR_LNX_PF, regs))return;...
}

如果第 1,2 级别页表导致的缺页中断,会进入 do_translation_fault()

static int __kprobes
do_translation_fault(unsigned long addr, unsigned int fsr,struct pt_regs *regs)
{if (addr < TASK_SIZE) /* 用户空间地址 */return do_page_fault(addr, fsr, regs);...
}

第3级页表导致的缺页中断,进入 do_page_fault() ,这和第1,2级页表导致缺页中断的情形殊途同归。来看 do_page_fault()

static int __kprobes
do_page_fault(unsigned long addr, unsigned int fsr, struct pt_regs *regs)
{struct task_struct *tsk;...unsigned int flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE;...tsk = current;...fault = __do_page_fault(mm, addr, fsr, flags, tsk);...
}
static int __kprobes
__do_page_fault(struct mm_struct *mm, unsigned long addr, unsigned int fsr,unsigned int flags, struct task_struct *tsk)
{/** 查看addr是否存在对应的 vma ? * 如果没有的话,意味着非法地址访问.*/vma = find_vma(mm, addr);fault = VM_FAULT_BADMAP;if (unlikely(!vma))goto out;...out:return fault;
}

__do_page_fault() 返回 do_page_fault()

static int __kprobes
do_page_fault(unsigned long addr, unsigned int fsr, struct pt_regs *regs)
{struct task_struct *tsk;...unsigned int flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE;...tsk = current;...fault = __do_page_fault(mm, addr, fsr, flags, tsk);...if (!(fault & VM_FAULT_ERROR) && flags & FAULT_FLAG_ALLOW_RETRY) {if (fault & VM_FAULT_MAJOR) {tsk->maj_flt++;...}  else {tsk->min_flt++;...}...}...if (fault & VM_FAULT_SIGBUS) {...} else { /* 测试代码场景走这里 *//** Something tried to access memory that* isn't in our memory map..*/sig = SIGSEGV;code = fault == VM_FAULT_BADACCESS ?SEGV_ACCERR : SEGV_MAPERR;}__do_user_fault(tsk, addr, fsr, sig, code, regs);return 0;...
}
static void
__do_user_fault(struct task_struct *tsk, unsigned long addr,unsigned int fsr, unsigned int sig, int code,struct pt_regs *regs)
{struct siginfo si;...#ifdef CONFIG_DEBUG_USERif (((user_debug & UDBG_SEGV) && (sig == SIGSEGV)) ||((user_debug & UDBG_BUS)  && (sig == SIGBUS))) {printk(KERN_DEBUG "%s: unhandled page fault (%d) at 0x%08lx, code 0x%03x\n",tsk->comm, sig, addr, fsr);show_pte(tsk->mm, addr);show_regs(regs);}
#endiftsk->thread.address = addr;tsk->thread.error_code = fsr;tsk->thread.trap_no = 14;si.si_signo = sig;si.si_errno = 0;si.si_code = code;si.si_addr = (void __user *)addr;force_sig_info(sig, &si, tsk); /* 给出错进程发送 SIGSEGV 信号 */
}

出错进程处理 SIGSEGV 信号:

asmlinkage int
do_work_pending(struct pt_regs *regs, unsigned int thread_flags, int syscall)
{...do {if (likely(thread_flags & _TIF_NEED_RESCHED)) {...} else {if (unlikely(!user_mode(regs)))return 0;if (thread_flags & _TIF_SIGPENDING) {int restart = do_signal(regs, syscall); /* 信号处理 */...} else if (thread_flags & _TIF_UPROBE) {...} else {...}}...} while (thread_flags & _TIF_WORK_MASK);return 0;
}
static int do_signal(struct pt_regs *regs, int syscall)
{...if (get_signal(&ksig)) {...} else {...}return 0;
}
int get_signal(struct ksignal *ksig)
{...for (;;) {...signr = dequeue_synchronous_signal(&ksig->info);if (!signr)signr = dequeue_signal(current, &current->blocked, &ksig->info);if (!signr)break; /* will return 0 */...if (ka->sa.sa_handler != SIG_DFL) {/* Run the handler.  */ksig->ka = *ka;if (ka->sa.sa_flags & SA_ONESHOT)ka->sa.sa_handler = SIG_DFL;break; /* will return non-zero "signr" value */}...}fatal:if (sig_kernel_coredump(signr)) {if (print_fatal_signals)print_fatal_signal(ksig->info.si_signo);...do_coredump(&ksig->info); /* 产生 coredump 文件 */}...
}

4. 调试 coredump 问题

产生的 coredump 文件,可用 gdb 进行调试 。

5. 后记

本文涉及到信号处理,更多信号处理细节可参考 Linux信号处理简析 。本文没有对程序的 coredump 细节进行展开,它有点复杂,留待后续有机会再进行述说。

相关文章:

Linux:用户空间非法指针coredump简析

1. 前言 限于作者能力水平&#xff0c;本文可能存在谬误&#xff0c;因此而给读者带来的损失&#xff0c;作者不做任何承诺。 2. 背景 本文分析基于 ARM32 架构&#xff0c;Linux-4.14 内核代码。 3. 问题分析 3.1 测试范例 void main(void) {*(int *)0 8; }运行程序会 …...

带你玩转Jetson之Deepstream简明教程(四)DeepstreamApp如何使用以及用于工程验证。

1.DeepstreamApp是什么&#xff1f; 如果你安装完毕deepstream整体框架&#xff0c;会在你的系统执行目录内有可执行文件&#xff0c;文件名字是deepstream-app。这是一个可执行脚本文件&#xff0c;通过deepstream框架中的代码在安装的时候编译后install到系统根目录内。 此脚…...

快速搭建个人在线书库,随时随地畅享阅读!

前边我们利用NAS部署了个人的导航页、小说站、云笔记&#xff0c;今天&#xff0c;我们再看看怎么部署一个个人的在线书库。 相信很多朋友都在自己的电脑中收藏了大量的PDF、MOBI等格式的电子书籍&#xff0c;但是一旦换了一台设备&#xff0c;要么是无法翻阅&#xff0c;要么…...

电子纸墨水屏的现实应用场景

电子纸挺好个东西&#xff0c;大家都把注意力集中在商超场景 其实还有更多有趣的场景方案可用&#xff0c;价值也不小&#xff0c;比如&#xff1a; 一、仓库场景 通过亮灯拣选&#xff0c;提高仓库作业效率 二、仓库循环使用标签 做NFC类发卡式应用&#xff0c;替代传统纸…...

常量const、引用、指针的大杂烩

文章目录1 普通引用1.1 对普通值的普通引用1.2 对常量值的普通引用1.3 对普通指针的普通引用1.4 对常量指针的普通引用1.5 对指针常量的普通引用1.6 对指向常量的指针常量的普通引用2 常量引用2.1 对普通值的常量引用2.2 对常量值的常量引用2.3 对普通指针的常量引用2.4 对常量…...

宝塔搭建实战php开源likeadmin通用管理移动端uniapp源码(四)

大家好啊&#xff0c;我是测评君&#xff0c;欢迎来到web测评。 上一期给大家分享了pc端的部署方式&#xff0c;今天来给大家分享uniapp端在本地搭建&#xff0c;与打包发布到宝塔的方法。感兴趣的朋友可以自行下载学习。 技术架构 vscode node16 vue3 uniapp vite types…...

Hive的分区表与分桶表内部表外部表

文章目录1 Hive分区表1.1 Hive分区表的概念&#xff1f;1.1.1 分区表注意事项1.2 分区表物理存储结构1.3 分区表使用场景1.4 静态分区表是什么&#xff1f;1.4.1 静态分区表案例1.4.2 分区表练习一1.4.3 分区操作1.5 动态分区表是什么&#xff1f;1.5.1 动态态分区表案例&#…...

和数集团打造《神念无界:源起山海》,诠释链游领域创新与责任

首先&#xff0c;根据网上资料显示&#xff0c;一部《传奇》&#xff0c;二十年热血依旧。 《传奇》所缔造的成绩&#xff0c;承载的是多少人的青春回忆&#xff0c;《传奇》无疑已经在游戏史上写下了浓墨重彩的一笔。 相比《传奇》及背后的研发运营公司娱美德名声大噪&#x…...

小白入门模拟IC设计,如何快速学习?

众所周知&#xff0c;模拟电路很难学。以最普遍的晶体管来说&#xff0c;我们分析它的时候必须首先分析直流偏置&#xff0c;其次在分析交流输出电压。可以说&#xff0c;确定工作点就是一项相当麻烦的工作&#xff08;实际中来说&#xff09;&#xff0c;晶体管的参数多、参数…...

51单片机——中断系统之外部中断实验,小白讲解,相互学习

中断介绍 中断是为使单片机具有对外部或内部随机发生的事件实时处理而设置的&#xff0c;中断功能的存在&#xff0c;很大程度上提高了单片机处理外部或内部事件的能力。它也是单片机最重要的功能之一&#xff0c;是我们学些单片机必须要掌握的。 为了更容易的理解中断概念&…...

如何设计一个秒杀系统

秒杀系统要如何设计&#xff1f; 前言 高并发下如何设计秒杀系统&#xff1f;这是一个高频面试题。这个问题看似简单&#xff0c;但是里面的水很深&#xff0c;它考查的是高并发场景下&#xff0c;从前端到后端多方面的知识。 秒杀一般出现在商城的促销活动中&#xff0c;指定…...

厄瓜多尔公司注册方案

简介&#xff1a; 经济概况与商机 厄瓜多尔是世界上第74大国家&#xff0c;是南美西部国家&#xff0c;与哥伦比亚&#xff0c;秘鲁和太平洋接壤。厄瓜多尔地处世界中心&#xff0c;地理位置优越&#xff0c;地理位置优越-赤道线零纬度&#xff0c;使其成为通往太平洋的理想枢…...

安全渗透环境准备(工具下载)

数据来源 01 一些VM虚拟机的安装 攻击机kali&#xff1a; kali官网 渗透测试工具Kali Linux安装与使用 kali汉化 虚拟机网络建议设置成NAT模式&#xff0c;桥接有时不稳定。 靶机OWASP_Broken_Web_Apps&#xff1a; 迅雷下载 网盘下载 安装教程 开机之后需要登录&am…...

118.(leaflet篇)leaflet空间判断-点与geojson面图层的空间关系(turf实现)

听老人家说:多看美女会长寿 地图之家总目录(订阅之前建议先查看该博客) 文章末尾处提供保证可运行完整代码包,运行如有问题,可“私信”博主。 效果如下所示: 下面献上完整代码,代码重要位置会做相应解释 <!DOCTYPE html> <html>...

目标检测与目标跟踪算法技术汇总

现如今chatgpt的爆火&#xff0c;我也使用了一段时间&#xff0c;问了许多关于人工智能技术的问题&#xff0c;基本是它能够回答了大部分的原理的&#xff0c;至于其人工智能涉及到的算法以及网络&#xff0c;考虑到也没有图&#xff0c;可能在给出这类回答上&#xff0c;是不太…...

Linux 系统启动过程

过去几十年&#xff0c;公用事业行业发生了重大变化。能源需求的转变导致企业利润率的波动&#xff0c;但不是运营成本的波动。 许多公用事业公司通过后勤部门流程自动化来削减成本&#xff0c;比如招采流程自动化。 在招采活动中&#xff0c;人工招采会产生盲点。由于公共事业…...

【每日一题Day118】LC1124表现良好的最长时间段 | 前缀和+单调栈/哈希表

表现良好的最长时间段【LC1124】 给你一份工作时间表 hours&#xff0c;上面记录着某一位员工每天的工作小时数。 我们认为当员工一天中的工作小时数大于 8 小时的时候&#xff0c;那么这一天就是「劳累的一天」。 所谓「表现良好的时间段」&#xff0c;意味在这段时间内&#…...

vue使用nprogress(进度条)

目录 1.安装 2.引入 3.配置 4.使用 5.使用场景 6.改变颜色 1.安装 npm install --save nprogress2.引入 import NProgress from nprogress import nprogress/nprogress.css3.配置 NProgress.configure({easing: ease, // 动画方式&#xff0c;和css动画属性一样&#…...

@NotNull 、@NotBlank、@NotEmpty区别和使用

引言 今天在使用validation校验的时候&#xff0c;发现了使用校验不起作用&#xff0c;一时间有点摸不到头绪&#xff0c;就看了一下同事提交的代码&#xff0c;发现了问题在用NotNull用法&#xff0c;用的有些错误&#xff0c;所以在这里讲一下NotNull、NotBlank、NotEmpty区…...

Nacos——Nacos简介以及Nacos Server安装

资料来源&#xff1a;02-Nacos配置管理-什么是配置中心_哔哩哔哩_bilibili nacos记得下载2.x版本的&#xff0c;负责以后新建配置的时候会出现“发布错误&#xff0c;请检查参数是否正确”错误&#xff01;&#xff01;&#xff01;&#xff01; 目录 一、Nacos简介 1.1 四…...

FFmpeg 低延迟同屏方案

引言 在实时互动需求激增的当下&#xff0c;无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作&#xff0c;还是游戏直播的画面实时传输&#xff0c;低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架&#xff0c;凭借其灵活的编解码、数据…...

电脑插入多块移动硬盘后经常出现卡顿和蓝屏

当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时&#xff0c;可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案&#xff1a; 1. 检查电源供电问题 问题原因&#xff1a;多块移动硬盘同时运行可能导致USB接口供电不足&#x…...

【Go】3、Go语言进阶与依赖管理

前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课&#xff0c;做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程&#xff0c;它的核心机制是 Goroutine 协程、Channel 通道&#xff0c;并基于CSP&#xff08;Communicating Sequential Processes&#xff0…...

什么是EULA和DPA

文章目录 EULA&#xff08;End User License Agreement&#xff09;DPA&#xff08;Data Protection Agreement&#xff09;一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA&#xff08;End User License Agreement&#xff09; 定义&#xff1a; EULA即…...

JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案

JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停​​ 1. ​​安全点(Safepoint)阻塞​​ ​​现象​​:JVM暂停但无GC日志,日志显示No GCs detected。​​原因​​:JVM等待所有线程进入安全点(如…...

【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)

1.获取 authorizationCode&#xff1a; 2.利用 authorizationCode 获取 accessToken&#xff1a;文档中心 3.获取手机&#xff1a;文档中心 4.获取昵称头像&#xff1a;文档中心 首先创建 request 若要获取手机号&#xff0c;scope必填 phone&#xff0c;permissions 必填 …...

使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台

🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...

云原生安全实战:API网关Kong的鉴权与限流详解

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关&#xff08;API Gateway&#xff09; API网关是微服务架构中的核心组件&#xff0c;负责统一管理所有API的流量入口。它像一座…...

C#学习第29天:表达式树(Expression Trees)

目录 什么是表达式树&#xff1f; 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持&#xff1a; 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...

Linux系统部署KES

1、安装准备 1.版本说明V008R006C009B0014 V008&#xff1a;是version产品的大版本。 R006&#xff1a;是release产品特性版本。 C009&#xff1a;是通用版 B0014&#xff1a;是build开发过程中的构建版本2.硬件要求 #安全版和企业版 内存&#xff1a;1GB 以上 硬盘&#xf…...