谁说常量字符串不可修改

哈喽,我是子牙,一个很卷的硬核男人

深入研究计算机底层、Windows内核、Linux内核、Hotspot源码……聚焦做那些大家想学没地方学的课程。为了保证课程质量及教学效果,一年磨一剑,三年先后做了这些课程:手写JVM、手写OS、带你用纯汇编写OS、手写64位多核OS、实战Linux内核…

问你一个问题:你觉得下面这个程序能正确运行吗?

int main() {
    char* s = "ziya";
    s[0] = 'Z';
    return 0;
}

我大胆的预测,你的内心是这样子的

哈哈,别别,我没疯,我来证明给你看

看到没,我真的做到了!

细心的小伙伴可能发现了,在修改常量字符串之前,好像执行了一段代码!是的,就是执行了这段关键的代码,改变了Linux内核的规则束缚,才能做到此,代码长这样

其实规则只能束缚那些活在规则之下的人,当你有能力认清规则,并有实力去改变规则的时候,规则其实形同虚设!接下来听我娓娓道来,我是怎么用这段代码做到这逆天操作的……

看看ChatGPT怎么说

当下AI老火了,我们来看看chatgpt能不能给我们思路或答案

第一个问题:

第二个问题:

第三个问题:

第四个问题:

面对ChatGPT给的答案,是不是越来越没概念了?每个字都能看懂,但是好像看不懂它在说什么了……所以我一直觉得AI越来越强大,只会让认知高能力强的人变得更强,拉大弱者与强者的差距,进而拉大贫富差距……

看到很多人鼓吹AI是普通人的福音,它能帮你做PPT、画图、写文案、写代码……大家都不用学习了!那也得你懂那个东西,你问它,它给你答案,你做判断,你才能得到你想要的接近正确的答案!所以AI时代,你可以不用亲自动手去做,但是你得给AI想法,你得做判断,你还得能正确的做判断,所以其实更需要学习!提高认知,提高判断能力。狙击枪放在步兵手里跟放在狙击手手里,效果天壤之别!

如果你有深厚的底层功底:懂硬件、懂Linux内核,其实ChatGPT已经给了你答案:

  1. 常量字符串不可修改是编译器、操作系统、硬件三种共同作用的结果
  2. 常量字符串编译后是放在可执行文件的只读区域
  3. 程序执行后,常量字符串又被放在进程空间中的只读区域
  4. 进程空间中的只读区域受双重保护:操作系统内存保护、硬件支持
  5. Linux提供了mprotect函数可以改变Linux规则实现只读区域可写
  6. 如果你有实力,你甚至可以做到修改硬件支持实现只读区域可写

那咱们就选最难的,直接修改硬件支持,实现只读区域可写!

接下来我们一层一层来分析

常量字符串在ELF文件中的样子

如果你的程序中有常量字符串,编译后它会放在只读区域,如图

常量字符串编译后为什么要放在这个区域?这就是一种规则。Linux要跑程序,就需要把可执行文件加载到内存中,所以制定了ELF文件结构,告诉编译器,Linux平台的程序随便你怎么编译,但是你生成的文件得符合ELF文件结构我才能运行

常量字符串你编译器编译时要放到.rodata段中,我Linux加载程序的时候才会放到内存只读区域中,这样才能实现我们所学的:常量字符串不可以修改

如果你想详细了解.rodata,或者你想全面了解Linux平台的可执行文件ELF文件结构,这时候你就可以借助ChatGPT去学习研究了!

常量字符串在内存中的样子

再来看看常量字符串在内存中的样子,如图

有木有发现一个惊天大秘密?其实常量字符串跟代码,在内存中,即进程内存空间中,是在同一个区域!给你看一个更形象的图

文章中的很多演示效果,并不是Linux提供的,是我写代码实现的。如果这是你想学的,你也想有这样的实力与认知,欢迎加入我的《逆向思维带你玩转Linux内核》小班

关于Linux进程的内存空间,我之前写过文章 实战讲解Linux进程内存空间

Linux内核的规则束缚

还剩最后一层认知:Linux内核是如何提供内存保护的?那硬件支持呢?Linux内核就是使用了硬件提供的支持才能实现内存保护,所以它俩的本质是一个,只不过是两个层面

那硬件提供了什么支持呢?4-level paging,即4级分页,如图。关于4级分页,这里我就不展开讲了,但是我会给你讲明白硬件支持与只读区域的关系。

关于虚拟内存分页机制,你可以自己去研究学习,后面我也会写文章详谈,如果你想学习,关注公众号【硬核子牙】

当CPU尝试修改常量字符串的时候,CPU肯定有字符串的内存地址,这个地址叫逻辑地址,传给CPU内部的段部件,x64 CPU采用平坦模型,段基址一律为0,段部件产出线性地址,传给CPU内部的页部件

CPU页部件,就是大家所知的MMU,它的工作原理就是根据线性地址算出物理地址,因为数据是存放在内存条上的。硬件保护就是在这一步发挥作用的。MMU工作需要依赖Linux内核中的4级页表,就是上图。一般来说,前三级表不做权限控制,最后一级才做,如图

这个图中的数据叫页描述符,其中的RW位就是ChatGPT所说的硬件支持,为0表示只读,为1表示可读可写,我们来看看常量字符串这个位是多少

5的二进制是0b0101,RW位是0,即只读,秘密终于解开!

既然知道底层是如何实现的,那就知道怎么改了!

其他Linux内核提供的mprotect函数,本质就是干这个事的!

本文至此结束,你学会(废)了吗?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/403814.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

接口性能优化的小技巧

目录 1.索引 1.1 没加索引 1.2 索引没生效 1.3 选错索引 2. sql优化 3. 远程调用 3.1 并行调用 3.2 数据异构 4. 重复调用 4.1 循环查数据库 4.2 死循环 4.3 无限递归 5. 异步处理 5.1 线程池 5.2 mq 6. 避免大事务 7. 锁粒度 7.1 synchronized 7.2 redis分…

git 使用总结

文章目录 git merge 和 git rebasegit mergegit rebase总结 git merge 和 git rebase git merge git merge 最终效果说明: 假设有一个仓库情况如下,现需要进行 merge: merge 操作流程: merge 的回退操作: git reba…

ubuntu常见配置

ubuntu各个版本的安装过程大差小不差,可以参考,ubuntu20.04 其它版本换一下镜像版本即可 安装之后需要配置基本的环境,我的话大概就以下内容,后续可能有所删改 sudo apt-get update sudo apt-get install gcc sudo apt-get inst…

常见的芯片行业ERP:SAP Business One ERP系统

在现代企业管理中,企业资源规划(ERP)系统已成为不可或缺的工具。特别是在高度复杂和竞争激烈的芯片行业中,一款高效、全面的ERP系统更是助力企业实现精细管理、提升竞争力的关键。SAP Business One ERP系统便是其中一款备受推崇的选择。 SAP Business On…

2023 龙蜥操作系统大会演讲实录:《兼容龙蜥的云原生大模型数据计算系统——πDataCS》

本文主要分三部分内容:第一部分介绍拓数派公司,第二部分介绍 πDataCS 产品,最后介绍 πDataCS 与龙蜥在生态上的合作。 杭州拓数派科技发展有限公司(简称“拓数派”,英文名称“OpenPie”)是国内基础数据计…

alist修改密码(docker版)

rootarmbian:~# docker exec -it [docker名称] ./alist admin set abcd123456 INFO[2024-02-20 11:06:29] reading config file: data/config.json INFO[2024-02-20 11:06:29] load config from env with prefix: ALIST_ INFO[2024-02-20 11:06:29] init logrus..…

bilibili尚硅谷周阳老师JUC并发编程与源码分析课程笔记第十一章——Synchronized与锁升级

文章目录 先从阿里及其它大厂面试题说起本章路线总纲阿里手册对锁使用的强制要求Synchronized锁优化的背景Synchronized锁的升级过程Synchronized锁的升级标志 Synchronized的性能变化Java5以前,只有Synchronized,这个是操作系统级别的重量级锁为什么每一…

C# .Net 发布后,把dll全部放在一个文件夹中,让软件目录更整洁

PublishFolderCleaner – Github 测试环境: .Net 8 Program.cs 代码 // https://github.com/dotnet-campus/dotnetcampus.DotNETBuildSDK/tree/master/PublishFolderCleanerusing System.Diagnostics; using System.Text;// 名称, 不用写 .exe var exeName "AbpDemo&…

【数学建模竞赛考点】近五年数维杯数学建模题型及算法模型总结

20204年第九届数维杯数学建模竞赛在5月10号开赛,为了帮助小伙伴们赛前充分准备,并且快速掌握历年的赛题类型,在这里给大家整理出了近五年的数维杯数学建模竞赛题目及考点方向,便于小伙伴们更好的巩固学习。 2019年 A题&#xff…

当项目经理的一定要考PMP嘛?

PMP资格认证并不是强制性要求,但强烈建议考虑获取该资格!首先让我们来了解一下PMP是什么,然后再谈谈为什么建议考取PMP资格的理由。 PMP(Project Management Professional)是项目管理专业人员的资格认证。该认证由全球…

落雪音乐换源失败播放不了音乐——保姆级解决方法

不想看原因可以直接跳转到下面的解决方法 一、换源失败的原因二、解决方法注意!2.1电脑版解决方法2.2 手机版解决方法前提(必看!)解决方法 一、换源失败的原因 落雪开发者原话:虽然我们之前做了一些努力(如…

《剑指Offer》笔记题解思路技巧优化_Part_7

《剑指Offer》笔记&题解&思路&技巧&优化_Part_7 😍😍😍 相知🙌🙌🙌 相识😢😢😢 开始刷题🟢1. LCR 179. 查找总价格为目标值的两个商品——和…

ocr识别tesseract.js本地复现

来源: https://github.com/naptha/tesseract.js chatgpt今天帮倒忙,一直给一些旧的东西,代码就老报错,最后还是我出面看看log和err调了一下,还的是我啊 复现效果 这个挺好复现的,用的英文模式比中文识别…

Matlab/simulink光伏发电的扰动观察法MPPT仿真(持续更新)

1.光伏发电的电导增量法MPPT仿真 2.光伏发电的恒定电压法MPPT仿真 3.光伏发电的扰动观察法MPPT仿真 4.光伏发电的占空比法MPPT仿真 5.基于神经网络的MPPT光伏发电仿真 6. 基于模糊控制的MPPT光伏发电仿真 7. 基于粒子群算法(PSO)的500w光伏系统MPPT控…

如何使用Douglas-042为威胁搜索和事件应急响应提速

关于Douglas-042 Douglas-042是一款功能强大的PowerShell脚本,该脚本可以提升数据分类的速度,并辅助广大研究人员迅速从取证数据中筛选和提取出关键数据。 该工具能够搜索和识别Windows生态系统中潜在的安全漏洞,Douglas-042会将注意力放在…

小程序商城 免 费 搭 建之java商城 电子商务Spring Cloud+Spring Boot+二次开发+mybatis+MQ+VR全景+b2b2c

java SpringCloud版本b2b2c鸿鹄云商平台全套解决方案 使用技术: Spring CloudSpring BootMybatis微服务服务监控可视化运营 B2B2C平台: 平台管理端(包含自营) 商家平台端(多商户入驻) PC买家端、手机wap/公众号买家端 微服务(30个通用…

ELF文件内容详解——各节内容分析

文章目录 写在前面准备.text节.data节.strtab.symtab.shstrtab.shstrtab之后 写在前面 只看readelf这个工具说实话我感觉还是有点云里雾里,这里就逐字节分析一下ELF文件中text节(代码段)的内容 本文分析使用的汇编程序ELF文件内容详解这篇文…

苍穹外卖Day02——总结2

前期文章 文章标题地址苍穹外卖Day01——总结1https://blog.csdn.net/qq_43751200/article/details/135466359?spm1001.2014.3001.5501苍穹外卖Day01——解决总结1中存在的问题https://lushimeng.blog.csdn.net/article/details/135473412 总结2 前期文章1. 新增员工模块1.1 …

ChatGPT调教指南 | 咒语指南 | Prompts提示词教程(一)

在我们开始探索人工智能的世界时,了解如何与之有效沉浸交流是至关重要的。想象一下,你手中有一把钥匙,可以解锁与OpenAI的GPT模型沟通的无限可能。这把钥匙就是——正确的提示词(prompts)。无论你是AI领域的新手&#…

【stm32】hal库学习笔记-UART/USART串口通信(超详细!)

【stm32】hal库学习笔记-UART/USART串口通信 hal库驱动函数 CubeMX图形化配置 导入LCD.ioc RTC设置 时钟树配置 设置LSE为RTC时钟源 USART设置 中断设置 程序编写 编写主函数 /* USER CODE BEGIN 2 */lcd_init();lcd_show_str(10, 10, 16, "Demo12_1:USART1-CH340&q…
最新文章