12 dog250

尚未进行身份认证

暂无相关简介

等级
TA的排名 9

int3断点指令的原理和示例

今天有人让我解释一下断点调试的原理,我就想先解释一下int3指令,就写了一篇短文。单字节指令int3的二进制码是0xcc,它的效果是:处理器执行到0xcc时,会陷入内核,执行int3的异常处理代码,比如给当前进程发送一个SIGTRAP信号。就这么简单。剩下的就看信号处理程序如何发挥了。我给出一个简单的代码,演示一下一个程序的 自我单步跟踪 如何实现:#include <stdio.h>#include <sys/mman.h>#include <signal.

2020-05-21 21:00:32

窃取Linux内核page以构建窝藏自己的Rootkit

窃取内核的page?是的,偷page意味着我们绕过page分配的一切规则和接口,直接从freelist中摘取一个空闲的page来用。直接看个POC吧,我来模拟一个task_struct的分配过程:#include <linux/module.h>#include <linux/mm.h>#include <linux/sched.h>static void * page_steal(unsigned int j){ void *addr = NULL;

2020-05-20 20:52:00

dump出Linux内核所有的slab对象缉拿内核Rootkit

前面的文章介绍了很多种隐藏进程,隐藏TCP连接,隐藏内核模块的方法,总结起来和大多数网上介绍Rootkit的文章种介绍的方法不同点在于:网上大多数文章均是hook procfs来达到隐藏对象的目的。我的方法则是直接将对象从链表等数据结构中摘除。无疑,我的方法更简单,因为很显然,hook procfs需要修改大量关于VFS API调用相关的代码。但是,跑了和尚跑不了庙,虽然进程,TCP连接,内核模块等摘了链表,它还是在slab中啊!我们只需要dump特定的slab对象,就能找到它们:dump出

2020-05-20 20:23:50

Linux Rootkit躲避内核检测

Rootkit在登堂入室并得手后,还要记得把门锁上。如果我们想注入一个Rootkit到内核,同时不想被侦测到,那么我们需要做的是精妙的隐藏,并保持低调静悄悄,这个话题我已经谈过了,诸如进程摘链,TCP链接摘链潜伏等等,详情参见:https://blog.csdn.net/dog250/article/details/105371830https://blog.csdn.net/dog250/...

2020-05-16 17:23:26

构建/dev/kmem枚举所有Linux内核模块(包括隐藏的)

Linux系统不是可以有lsmod枚举所有内核模块吗?procfs不香吗?干嘛还要费事从/dev/kmem里去枚举?其实,Linux是后来的事了,在最初的UNIX时代,像ps之类的枚举进程的,都是从/dev/kmem里扫描出来的,这就是 一切皆文件 ,后来的Linux内核很不恰当地拓展了procfs,将乱八七糟的东西都往里面塞,像modules,filesystems,vmallocinfo之类,这些明明不是进程,全部扔进去了,这并不合适,但就是因为这是Linux内核,所以什么都是对的!当然,Linux

2020-05-16 16:27:54

修改掉Linux内核缺页中断处理的exception fixup表

近日,我在写内核模块的时候犯了一个低级错误:直接access用户态的内存而没有使用copy_to_user/copy_from_user!在内核看来,用户态提供的虚拟地址是不可信的,所以在一旦在内核态访问用户态内存发生缺页中断,处理起来是非常棘手的。Linux内核的做法是提供了一张 异常处理表 ,使用专有的函数来访问用户态内存。类似 try-catch块一般。具体详情可参见copy_to_user/copy_from_user的实现以及内核文档Documentation/x86/exception

2020-05-13 20:46:59

抓住被恶意隐藏的Linux内核模块

前面的文章介绍了一种相对彻底的隐藏Linux内核模块的方法:https://blog.csdn.net/dog250/article/details/106023941总结下来就是:摘除list,使得/proc/modules中不可见。摘除kobject,使得/sys/modules/中不可见。摘除depend on,使得依赖模块的/sys/modules/$(depended)/holder/中不可见。摘除vmap area list/rbtree,使得/proc/vmallocinfo中不

2020-05-11 23:33:43

扫描slab找出被隐藏的task_struct或者随便别的什么

如果一个进程被隐藏了,如何把它检测出来?这里给出一种100%可以检测成功的方法:https://blog.csdn.net/bin_linux96/article/details/105889045代码在那篇文章中已经给出了,我这里就不赘述了。我在本文中所写的,是对上述文章的补充。其实我们大可不必去扫描内存,我来解释一下这是为什么。黑客的攻击对象,或者说所有的被攻击对象,95%以上甚至99%的都是小白用户,我说过不止一次,如果你拿任何黑客技术去挑战安全专家,那基本都是惨败,充其量势均力敌,然而大

2020-05-10 18:51:07

Linux系统创建系统侦测不到的隐形进程(Rootkit技术必备)

在前面的文章中,我不止一次谈到隐藏一个进程的方法,该方法在我看来引以为豪地彻底又直接:将task从tasks链表摘除。将task从pid链表摘除。如此一来除非你扫描run queue或者扫描内存进行特征匹配,否则很难找到这个被隐藏的进程:task即使被隐藏也要进入run queue运行。task的字段值或者其地址本身具有特征。当然,前面提到的perf probe/trace,d...

2020-05-10 18:26:21

隐藏自己的Linux内核模块

前面我提倡使用oneshot模式加载模块,即让模块在init函数中把事情做完后就return -1,这样系统中便不存在这么一个模块,也就不需要隐藏了。但是,由于THIS_MODULE宏的存在,我们发现实际上隐藏一个模块是多么地简单。事实上,模块可以在init函数中通过THIS_MODULE宏实现自隐藏的。既然如此简单,还费事搞oneshot干嘛,精神洁癖总是不想看到return -1。和进程隐藏完全不同,进程无法自己隐藏自己,只能依靠其它模块找到相应的task_struct,然后再摘链。THIS_M

2020-05-09 17:42:59

修改ELF可执行文件entry入口感染一个程序

前面的文章在介绍如何将代码注入Linux内核模块的时候,我提到 “修改ELF文件或者PE文件的入口,让它跳到自己的逻辑”这件事很容易。真的很容易吗?是的,真的很容易。本文就是要演示这个的。还记得熊猫烧香病毒吧,包括它在内的早期计算机病毒都是靠这种方式来注入自己的代码并实现自我复制的,当然,它不一定修改的是入口地址,但肯定是修改了ELF/PE文件。若想修改ELF文件,我们先要了解ELF文件的结构,这个只需要花10分钟大致浏览即可,本文不会花篇幅介绍ELF的相关概念。<elf.h>头文件里已

2020-05-08 21:09:04

再谈Linux内核模块注入(没有kernel header也能hack kernel)

在前面的一篇文章中,我简单描述了一种Linux内核模块注入的方法:https://blog.csdn.net/dog250/article/details/105978803本文,我们抛开Rootkit这个刺眼的字样,看看这种注入机制还有什么新的玩法。我们知道,编写Linux内核模块必须要有对应版本的kernel header,并且版本号必须100%匹配,一个字都不能差,这对Linux内核模...

2020-05-07 23:54:49

将你的Rootkit代码注入到一个Linux内核模块

前段时间从完成“实时获取系统中TCP半连接数量”这个永远无法上线的半吊子需求开始,一发不可收拾地栽进了Rootkit深坑,有点走火入魔,写了好多篇这方面的随笔并结识了很多朋友,感觉不错。前面的系列文章中,大多数都是描述某个技术点的,而你想利用这个技术点做点实际的好事或者坏事,其实还有一段很长距离的路要走,比如:谁给你的root权限?你会编程并且编写Linux内核模块吗?系统中有gcc和m...

2020-05-07 21:03:22

Linux如何动态添加新的系统调用

先来个满满的回忆:https://blog.csdn.net/dog250/article/details/64461922011年写这篇文章的时候,我的女儿小小还没有出生。评价一下这篇文章,总体写得还不错,时间如白驹过隙,快十年过去了,今天我来旧事重提。添加新的系统调用 ,这是一个老掉牙的话题。前段时间折腾Rootkit的时候,我有意避开类似HOOK劫持系统调用的话题,我主要是想来点新...

2020-05-06 22:25:04

劫持Linux idle进程做点自己的计算任务

前面谈过如何隐藏一个进程,我说过,隐藏procfs接口那无异于掩耳盗铃,正确的做法应该是将task_struct从任何链表中摘除,仅仅保留于run queue。但CPU利用率会暴露你隐藏的进程…于是hook掉CPU记账接口…但是…于是…害怕被debug,封堵/dev/mem,/proc/kcore,封堵lkm,…左右手互搏…目前防御手稍微占优势。其实,还有一个好办法,即劫持idle,...

2020-05-04 09:14:00

彻底解释Linux select的1024限制(select真的受1024限制吗?不!)

很多很多年前,我被面试 为什么select调用最多只支持1024个文件描述符?我没有答出来,我甚至不知道select到底是干什么的。又过了很多年,我用这个问题面试了别人…在当时,我心里已经有了会令自己满意的预期答案,我预期的大概就是:Linux内核的宏限制了fd_set最多只支持1024…为了避免talk is cheap,我还能show you the code:// inclu...

2020-05-02 22:42:15

通过trace stack检测内核函数是否被hook

Rootkit需要及时发现是否有程序抓它,而侦测程序本身也需要时刻警惕Rootkit的注入,左右互搏。侦测程序发现Rootkit的手段是非常多的,前面我介绍过通过内核text段互相调用的地址范围来静态扫描的方式:https://blog.csdn.net/dog250/article/details/105474909本文我将介绍一种动态trace stack的方式来捕捉内核函数的调用异常。...

2020-04-30 17:20:42

Linux Rootkit的反侦测手段漫谈

任何恶意程序和反恶意程序都是左右手互搏,无关褒贬善恶,它们使用的均是同一种技术或者说手段。之前说了很多如何做一个藏得很深的Rootkit,无论是藏进程,藏TCP连接,还是藏文件,当然,也顺便说了很多如何发现这些Rootkit的技巧,本文主要聊一下 Rootkit需要主动做哪些具体措施以反制侦测程序的侦测。我们用之前的脚本隐彻底藏掉一个进程:[root@localhost test]# ps ...

2020-04-30 12:04:32

Linux fork之后,到底是子进程先运行还是父进程先运行

大约10年前,我写过两篇关于Linux内核CFS调度器的文章:https://blog.csdn.net/dog250/article/details/5302865https://blog.csdn.net/dog250/article/details/5302864我觉得这两篇文章是垃圾,但我又不删,留着给自己喷吧!不就是一个内核参数 kernel.sched_child_runs_f...

2020-04-25 21:52:01

从一个CFS调度案例谈Linux系统卡顿的根源

Linux系统是一个让人感觉卡顿的系统,先别怼,让我说完: 卡顿的原因在于Linux内核的调度器从来不关注业务场景! Linux内核只能看到机器而不愿意看到应用。它倾向于自下而上从CPU角度提高吞吐,而不是自上而下从业务角度提高用户体验。拟人来看,Linux是一个好程序员,但不是一个好经理。万事必有因缘,Linux就是一个程序员发起一帮程序员折腾起来的,几乎没有穿西装的经理之类的人参与...

2020-04-23 22:51:05

查看更多

CSDN身份
  • 博客专家
勋章 我的勋章
  • 技术圈认证(专家版)
    技术圈认证(专家版)
    博客专家完成年度认证,即可获得
  • 持之以恒
    持之以恒
    授予每个自然月内发布4篇或4篇以上原创或翻译IT博文的用户。不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
  • 1024超级勋章
    1024超级勋章
    授予原创文章总数达到1024篇的博主,感谢你对CSDN社区的贡献,CSDN与你一起成长。
  • 勤写标兵Lv3
    勤写标兵Lv3
    授予每个自然周发布7篇到8篇原创IT博文的用户。本勋章将于次周周三上午根据用户上周的博文发布情况由系统自动颁发。
  • 原力计划专属勋章
    原力计划专属勋章
    2019年《原力计划【第一季】》专属勋章,现已经开启第二季活动啦,小伙伴们快去参加吧
  • 学习力
    学习力
    《原力计划【第二季】》第一期主题勋章 ,第一期活动已经结束啦,小伙伴们可以去参加第二期打卡挑战活动获取更多勋章哦。
  • 原力新人
    原力新人
    在《原力计划【第二季】》打卡挑战活动中,成功参与本活动并发布一篇原创文章的博主,即可获得此勋章。
  • 原力探索 · S
    原力探索 · S
    在《原力计划【第二季】》打卡挑战活动中,发布 12 篇原创文章参与活动的博主,即可获得此勋章。(本次活动结束后统一统计发放)