我们最近录制一期特工队节目,全球独家的视频节目,全程2.5小时,这个视频节目是围绕这样一个实验来进行的。我们在这期视频节目中重点介绍:
ARM64体系结构中的内存管理
ARM64的页表管理
ARM64 的Linux内核如何walk through页表
ARM64的Linux内核系统调用是如何实现的?
如何面对宕机?本实验讲会面临4次不同的宕机。
详细分析宕机的log
利用kdump来手撕宕机问题
笨叔保证,在全球的视频网站和培训机构上也找不到这样有深度和广度的视频,只有笨叔的旗舰篇视频有哟!喜欢的赶紧点本文最后面的“阅读原文”来订阅吧。
这个实验是酱杨紫的:
“假设你是一名安全人员,正在执行一项秘密任务,这项秘密任务就是要深入到敌军的作战指挥中心的计算机里安装一个窃听的程序,简单来说就是把计算机的系统调用动态替换掉。假设你的同事已经帮你把敌军计算机的root密码给破解了,接下来就看你如何动态修改系统调用了。注意:编写的内核模块不能让敌军的计算机重启、crash/panic,否则就暴露行踪,秘密行动失败。
1)编写一个内核模块。
实验环境:ARM64体系结构,Linux 5.0内核。
要求替换系统调用表(sys_call_table)中某一项系统调用,替换成自己编写的系统调用处理函数(例如:my_new_syscall()),在新的系统调用函数中打印一句“hello, I have hacked this syscall”,然后再调用回原来的系统调用处理函数。
比如以ioctl系统调用为例,它在系统调用表中的编号就是__NR_ioctl。那么需要修改系统调用表sys_call_table[__NR_ioctl]的指向,让其指向my_new_syscall()函数,然后在my_new_syscall()函数中打印一句话,调用原来的sys_call_table[__NR_ioctl]指向的处理函数。
【特工队 - 动态修改计算机系统调用】2)卸载模块时候把系统调用表恢复原样。
3)用clone系统调用来验证你的驱动,clone系统调用号是__NR_clone。
”
这个实验来自一个实际的项目,最开始是笨叔的VIP微信群里一个朋友在国庆节期间问笨叔的一个问题。他们说这个问题困扰了他们好久,他们的实验平台是某鹏的ARM64服务器芯片,怎么折腾总是死机,于是救助与笨叔。笨叔看了看他们的代码,喝了一杯二锅头的时间就把这个问题fix了。后来,笨叔觉得这个问题对学习linux驱动和内核的小伙伴很有帮助,特别是对加深理解ARM64的体系结构,ARM64内存管理、系统调用、如何面对死机等问题,于是,笨叔在那个VIP朋友的问题基础上做了修改和抽象,做成一个实验share给大家。
笨叔让小笨笨同学来做这个实验。
文章图片
风华正茂的小笨笨同学
笨叔先给小笨笨介绍一些ARM64体系结构的知识。
文章图片
文章图片
文章图片
文章图片
文章图片
文章图片
文章图片
文章图片
小笨笨开始动手写内核模块了,花了一个下午,写好了一个驱动模块。
文章图片
但是呢,这个驱动一跑起来就死机,而且整个过程会有4次不同的宕机。
第一次宕机,小笨笨同学就懵了。。。
文章图片
在笨叔的指点下,fix了第一次宕机。
文章图片
重新编译好内核模块之后,一跑,又马上第二次宕机了。
文章图片
小笨笨同学这可傻眼了,在笨叔给他讲解了系统调用的一些基本原理之后,马上fix了第二次宕机。这回小笨笨同学把ioctl系统调用号改成clone号,重新编译好内核模块之后,一跑,又马上第三次宕机了。
文章图片
小笨笨同学这回哭了,叔叔,我不玩了~~~~
我把小笨笨同学哄着:小笨笨,不怕,我们来仔细分析死机log,你看看,你只把第一个page的只读属性改成了可写,但是呢,因为clone系统调用号是220,每个系统调用号在系统调用表sys_call_table中占8个字节,但是呢,这个表没有按照page大小对齐来存放的,所以呢,这个clone可能存放到了第2个page里,你发现了吗?小笨笨同学。
小笨笨同学看了看笨叔,叔,好像是这么回事。叔,你真帅!
文章图片
小笨笨很快就修改好了代码,上机一跑,好像不宕机了。
笨叔:小笨笨,你这个驱动写的好不错,但是呢,我们需要在卸载模块的时候,把系统调用表恢复原样。
小笨笨马上去修改卸载模块函数,上机一跑,又宕机了~~,这回小笨笨真的哭了:叔,真的好难啊,为啥我一修改,就死机。
文章图片
文章图片
文章图片
小伙伴,你有兴趣和小笨笨一起来玩这个实验吗?
笨叔录制了2个多小时的高清视频来详细讲解这个实验,有兴趣的同学可以点击“阅读原文”来订阅笨叔的旗舰篇合集视频。
另外我们精心制作了400多页的实验指导手册,独家供应,免费提供大家下载。
下载办法:
登录“奔跑吧linux社区”微信公众号,在微信公众号里输入“实验指导手册”即可。
文章图片