[内核pwn] 环境搭建

照着师傅们的教程弄的,顺便记录一些自己遇到的问题

编译内核 or 下载内核

自己编译内核

  1. 安装所需要的依赖
sudo apt-get update
sudo apt-get install git fakeroot build-essential ncurses-dev xz-utils libssl-dev bc
  1. 下载kernel源码,这里我下载的是4.4.72版本

  2. 解压源码,然后在源码目录

make menuconfig
进入kernel hacking
勾选以下项目
Kernel debugging
Compile-time checks and compiler options —> Compile the kernel with debug info和Compile the kernel with frame pointers
KGDB
然后保存退出
  • 但基本上都默认保存了,所以检查一下然后退出就好了
  1. 生成kernel binary
make bzImage
  • 等一段时间就会出现如下信息,就意味着编译成功,然后从/arch/x86/boot/拿到bzImage,从源码根目录拿到vmlinux
Setup is 17436 bytes (padded to 17920 bytes).
System is 6797 kB
CRC c4c988d7
Kernel: arch/x86/boot/bzImage is ready  (#1)
☁  linux-4.4.72  file vmlinux
vmlinux: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, BuildID[sha1]=d1f415bda5dcb18a110c0c741a0b4d69ebcee3a7, not stripped
☁  linux-4.4.72  cd arch/x86/boot 
☁  boot  file bzImage 
bzImage: Linux kernel x86 boot executable bzImage, version 4.4.72 (hacker_mao@hacker-virtual-machine) #1 SMP Sat Jan 5 19:, RO-rootFS, swap_dev 0x6, Normal VGA

利用apt直接下载内核文件及源码

  1. 下载源码
  • 先按照版本号搜索,例如4.15.0-22版本的
apt search linux-headers-4.15.0-22-
  • 然后安装
sudo apt install linux-headers-4.15.0-22 linux-headers-4.15.0-22-generic
  • 安装成功后就会在/usr/src目录下有源码了,4.4.0-21是本机的
☁  boot  cd /usr/src 
☁  src  ls
linux-headers-4.15.0-22  linux-headers-4.15.0-22-generic  linux-headers-4.4.0-21  linux-headers-4.4.0-21-generic
  1. 下载内核文件
  • 同样先搜索各个版本的内核
sudo apt search linux-image-
  • 然后再下载自己所需要版本的内核
apt download xxxx
  • 下载下来是deb,我们解压之后在/data/boot文件夹下可以找到我们所需的内核镜像文件vmlinuz-4.15.0-22-generic,一般名字都是vmlinuz开头的

添加syscall

  • 这里我们也跟着501师傅的教程在4.4.72版本的内核复现一下添加syscall的操作
  1. 源码根目录下创建helloworld目录,并在helloworld目录下添加两个文件
☁  linux-4.4.72  mkdir helloworld
☁  linux-4.4.72  cd helloworld 
☁  helloworld  touch helloworld.c
☁  helloworld  touch Makefile
//helloworld.c
#include <linux/kernel.h>

asmlinkage long sys_helloworld(void){
    printk("{==kernel==} hello world\n");
    return 0;
} 
//Makefile
obj-y=helloworld.o
  1. 编辑源码根目录下的Makefile,添加helloworld/
  1. 编辑include/linux/syscalls.h,添加函数原型
asmlinkage long sys_helloworld(void);
  1. 编辑arch/x86/entry/syscalls/syscall_32.tbl和arch/x86/entry/syscalls/syscall_64.tbl,添加系统调用号
//syscall_32.tbl
1337 i386   helloworld          sys_helloworld
//syscall_64.tbl
1337 common helloworld          sys_helloworld
  1. 编译kernel,然后在./arch/x86/boot/下获得新bzImage
make bzImage
  • 编译成功
Setup is 17436 bytes (padded to 17920 bytes).
System is 6800 kB
CRC a4eb3388
Kernel: arch/x86/boot/bzImage is ready  (#2)

编译busybox

  1. 官网上下载源码编译,这里我下的是busybox-1.30.0

  2. 解压源码,然后在根目录下

make menuconfig
  • 进Settings,勾上Build static binary (no shared libs)
  1. 编译
make install -j4
  1. 编译完成后根目录多了一个_install的目录,这就是编译的结果,然后
cd _install
mkdir proc
mkdir sys
touch init
chmod +x init
touch packet
  • 在init中写入下面内容,用于内核初始化,其中insmod用于将指定模块加载到内核中
#!/bin/sh
echo "{==DBG==} INIT SCRIPT"
mkdir /tmp
mount -t proc none /proc
mount -t sysfs none /sys
mount -t debugfs none /sys/kernel/debug
mount -t tmpfs none /tmp
# insmod /xxx.ko # load ko
mdev -s # We need this to find /dev/sda later
echo -e "{==DBG==} Boot took $(cut -d' ' -f1 /proc/uptime) seconds"
setsid /bin/cttyhack setuidgid 1000 /bin/sh #normal user
# exec /bin/sh #root
  • 在packet中写入,用于将FileSystem打包成映像
#!/bin/sh
echo "Generate rootfs.img"
find . | cpio -o --format=newc > ./rootfs.img

编译ko文件

  1. 在kernel源码目录下创建一个新的文件夹
☁  linux-4.4.72  mkdir test_ko
☁  linux-4.4.72  cd test_ko 
☁  test_ko  touch hello.c
☁  test_ko  touch Makefile
  • 在hello.c和Makefile中写入东西,写Makefile的时候注意要使用Tab而不是空格
//hello.c
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/cred.h>
MODULE_LICENSE("Dual BSD/GPL");
struct cred c1;
static int hello_init(void) 
{
    printk("<1> Hello world!\n");
    printk("size of cred : %d \n",sizeof(c1));
    return 0;
}
static void hello_exit(void) 
{
    printk("<1> Bye, cruel world\n");
}
module_init(hello_init);
module_exit(hello_exit);
//Makefile 
obj-m := hello.o

KERNELDR := /home/hacker_mao/desktop/kernel_pwn/linux-4.4.72

PWD := $(shell pwd)  

modules:  
    $(MAKE) -C $(KERNELDR) M=$(PWD) modules  

moduels_install:  
    $(MAKE) -C $(KERNELDR) M=$(PWD) modules_install  

clean:  
    rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions

  1. 编译ko文件
make
  • 编译成功,会出现hello.ko文件
☁  test_ko  make
make -C /usr/src/linux-headers-4.15.0-22-generic M=/home/hacker_mao/desktop/kernel_pwn/linux-4.4.72/test_ko   modules  
make[1]: Entering directory '/usr/src/linux-headers-4.15.0-22-generic'
  CC [M]  /home/hacker_mao/desktop/kernel_pwn/linux-4.4.72/test_ko/hello.o
  Building modules, stage 2.
  MODPOST 1 modules
  CC      /home/hacker_mao/desktop/kernel_pwn/linux-4.4.72/test_ko/hello.mod.o
  LD [M]  /home/hacker_mao/desktop/kernel_pwn/linux-4.4.72/test_ko/hello.ko
make[1]: Leaving directory '/usr/src/linux-headers-4.15.0-22-generic'
☁  test_ko  file hello.ko
hello.ko: ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), BuildID[sha1]=1aa1e7d97868119d05876707c472a92a877048fa, not stripped

启动系统

  1. 将编译好的hello.ko放到busybox的_install目录下

  2. 再写个demo测试前面添加的syscall,将demo也放在_install目录下

//gcc test.c -static -o test
#include <unistd.h>

int main(void){
    syscall(1337);
    return 0;
}
  1. 将FileSystem打包成映像
./packet
  1. 将生成的rootfs.img和编译的内核bzImage文件放在同一文件夹下,新建一个启动脚本boot.sh
#! /bin/sh

qemu-system-x86_64 \
-m 128M \
-kernel ./bzImage \
-initrd  ./rootfs.img \
-append "root=/dev/ram rw  oops=panic panic=1 kalsr" \
-netdev user,id=t0, -device e1000,netdev=t0,id=nic0 \
-monitor /dev/null \
-smp cores=2,threads=1 \
-cpu kvm64,+smep \
#-gdb tcp::1234 \
#-S
  1. 启动内核
./boot.sh
  • 编译的syscall和hello.ko都生效了
  • 通过lsmod命令还可以查看已加载的modul
  1. 调试ko

  2. 这里按照gdb调试内核模块的操作来,首先下载相关文件

  3. 在自己的内核源码根目录下拷贝vmlinux文件到arbitrarily_write文件夹下

  4. 启动内核,并安装模块

./start.sh
./mknod.sh
su hac425
  • 为了调试内核模块,还需要加载驱动的符号文件,首先在系统里面获取驱动的加载基地址
/ $ cat /proc/modules | grep arb
arbitrarily_write 2168 0 - Live 0xffffffffa0000000 (O)
  1. 启动gdb,加载符号文件和驱动,对驱动的函数下断点
gdb -q ./vmlinux
pwndbg> target remote 127.0.0.1:1234
pwndbg> add-symbol-file ./arbitrarily_write.ko 0xffffffffa0000000
pwndbg> b arw_ioctl
pwndbg> c
  • 这时候在系统运行test文件
./test
  • 这时候gdb就会断在我们下断点的函数

参考文章:

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,686评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,668评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,160评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,736评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,847评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,043评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,129评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,872评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,318评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,645评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,777评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,861评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,589评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,687评论 2 351

推荐阅读更多精彩内容

  • Finally,I got it!首先,查资料自觉用google。恕我直言,除google外,其他的都是垃圾! 参...
    athorn阅读 29,012评论 1 10
  • 前言 本次实验和某操作系统实验课好像啊,我又回忆起了那几次被Linux支配着的恐惧。 本次试验使用Ubuntu 1...
    lmzqwer2阅读 2,604评论 5 2
  • 《基于ARM的多终端自助打印系统》是以前和控制工程学院的建斌同学和仪器与电子学院的培松同学一起做的一个创新项目。 ...
    free_will阅读 2,889评论 1 2
  • 周末回家陪同老公与儿子,发现自己单独与孩子相处时有着那种焦虑与自责,说话中能量向下,不能传递向上能量,今日一早起来...
    爱君2005阅读 342评论 0 1
  • 如果可以 我愿化风一缕 悄悄地 将你的秀发梳理 如果可以 我愿化雨一阵 轻轻地 将你的汗迹拂拭 如果可以 我愿伴你...
    秋之枫520阅读 385评论 27 22