kernel技巧
基操
拿到一个core.cpio,一般得到的都是压缩包,先将其回归到正常的名字,mv core.cpio core.cpio.gz,然后将其解压,gunzip core.cpio.gz,解压后的状态就是运行起仿真所需要的core.cpio;
然后我们将exp放入重新生成一个core.cpio要怎么办呢,先生成一个空的文件夹,mkdir core;cd core,cpio -idmv <core.cpio,就得到了core.cpio的东西了,然后编译exp,gcc exp..c -static -masm=intel -g-o exp,将其放入core文件夹,在core文件夹中执行find . | cpio -o --format=newc >core.cpio,会在该文件夹中获取到一个core.cpio,放回start.sh目录下,运行期环境然后执行就可以了
泄露地址
一般开启KASLR的时候寻找地址
1.Dmesg
在启动内核后可以查看内核的信息,如dmesg | grep -i "kernel可以查看内核的地址信息
但是,在init.sh文件中有 echo 1 > /proc/sys/kernel/dmesg_restrict,即设置dmesg_restrict为1 就不能使用;或者是 编译内核时CONFIG_SECURITY_DMESG_RESTRICT=y
2.kallsyms
看init.sh文件
1 | echo 2 > /proc/sys/kernel/kptr_restrict |
- 0:默认情况下,没有任何限制。
- 1:使用
%pK输出的内核指针地址将被替换为 0,除非用户具有CAP_ SYSLOG特权,并且group id和真正的 id 相等。(这个不太懂,root用户就可以看到) - 2:使用
%pK输出的内核指针都将被替换为 0 ,即与权限无关。(root用户也看不到,需要在启动时去掉这个才行)
3.module
这个是用来获取模块加载地址的
1 | bashcat /sys/module/module_name/sections/.text |
打印地址
1.常规打印
1 | plaintextprintf("0x%lx\n",leakAddr); |
有时候不加\n打不出来
1 | #define HEX(x) |
2.gdb式打印
1 | void gdbPrint(size_t* data,int len) |
实现效果

搜索内存
当不知道内存在哪里时,可以使用peda的搜索功能,搜索地址范围,常常在操控栈时很好用
1 | find "galf" 0xffffc900001d3f80 0xffffc900001d3f98 |

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 许可协议。转载请注明来源 hfddh666's Blog!