吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 4679|回复: 26
收起左侧

[系统底层] Linux kernel环境搭建—0x00

  [复制链接]
peiwithhao 发表于 2022-10-31 22:18
本帖最后由 peiwithhao 于 2023-3-8 13:39 编辑

闲着也是闲着,并且十分崇敬内核pwn的学习,所以先记录一下linux kernel的环境搭建,这里主要也是跟着arttnab3师傅来一步一步走的

Linux Kernel 环境搭建

安装依赖

$ sudo apt-get update
$ sudo apt-get install git fakeroot build-essential ncurses-dev xz-utils qemu flex libncurses5-dev fakeroot build-essential ncurses-dev xz-utils libssl-dev bc bison libglib2.0-dev libfdt-dev libpixman-1-dev zlib1g-dev libelf-dev

获取内核镜像(bzImage)

有如下三种方式

  • 下载内核源码后编译
  • 直接下载现成的的内核镜像
  • 直接使用自己系统的镜像
    $ wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.11.tar.xz

我求稳,跟着师傅来,他是我的神,采取法一

方法一:自行编译内核源码

1.获取内核源码

前往Linux Kernel Archive下载对应版本的内核源码,这里选用5.11这个版本的内核镜像。

$ wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.11.tar.xz

2.配置编译选项

解压我们下载来的内核源码

$ tar -xvf linux-5.11.tar.xz

完成后进入文件夹内,执行如下命令开始配置编译选项

$ make menuconfig


保证勾选如下配置(默认都是勾选了的):

  • Kernel hacking —> Kernel debugging
  • Kernel hacking —> Compile-time checks and compiler options —> Compile the kernel with debug info
  • Kernel hacking —> Generic Kernel Debugging Instruments –> + + KGDB: kernel debugger
  • kernel hacking —> Compile the kernel with frame pointers
    一般来说不需要有什么改动,直接保存退出即可,你也可以根据你的需求手动更改一些编译选项

通常保存的路径在当前目录下的 .config 文件中,如果你在生成配置文件后才想起来忘了改某个选项也可以直接编辑这个文件


自己编译这里出了点网络问题,咱们换一个法子,以后我再补全

方法二:下载现有内核镜像

使用如下命令可以查看现有的内核镜像

$ sudo apt search linux-image- 

这里采用5.8进行示范

$ sudo apt download linux-image-5.8.0-43-generic

下载下来是一个deb文件,解压

$ dpkg -X ./linux-image-5.8.0-43-generic_5.8.0-43.49~20.04.1_amd64.deb extract
./
./boot/
./boot/vmlinuz-5.8.0-43-generic
./usr/
./usr/share/
./usr/share/doc/
./usr/share/doc/linux-image-5.8.0-43-generic/
./usr/share/doc/linux-image-5.8.0-43-generic/changelog.Debian.gz
./usr/share/doc/linux-image-5.8.0-43-generic/copyright

其中的./boot/vmlinuz-5.8.0-43-generic便是bzImage内核镜像文件

方法三:直接用自己系统的镜像

一般位于/boot/目录下,也可以直接拿出来用

使用 busybox 构建文件系统

BusyBox 是一个集成了三百多个最常用Linux命令和工具的软件,包含了例如ls、cat和echo等一些简单的工具,我们将用 busybox 为我们的内核提供一个基本的编译busybox
I.获取busybox源码用户环境

1.编译busybox

  1. 获取busybox源码
    busybox.net下载自己想要的版本,这里选用busybox-1.33.0.tar.bz2这个版本
    $ wget https://busybox.net/downloads/busybox-1.33.0.tar.bz2

    解压

    $ tar -jxvf busybox-1.33.0.tar.bz2
  2. 编译busybox源码
    进入配置界面
    $ make menuconfig

    勾选Settings —> Build static binary file (no shared lib)

    若是不勾选则需要单独配置lib,比较麻烦

接下来就是编译了,速度会比编译内核快很多

$ make install

编译完成后会生成一个_install目录,接下来我们将会用它来构建我们的磁盘镜像

建立文件系统

  1. 初始化文件系统
    一些简单的初始化操作…无非也就是构建出基本的文件夹等
    $ cd _install
    $ mkdir -pv {bin,sbin,etc,proc,sys,home,lib64,lib/x86_64-linux-gnu,usr/{bin,sbin}}
    $ touch etc/inittab
    $ mkdir etc/init.d
    $ touch etc/init.d/rcS
    $ chmod +x ./etc/init.d/rcS
  2. 配置初始化脚本
    首先配置etc/inttab,写入如下内容:
    ::sysinit:/etc/init.d/rcS
    ::askfirst:/bin/ash
    ::ctrlaltdel:/sbin/reboot
    ::shutdown:/sbin/swapoff -a
    ::shutdown:/bin/umount -a -r
    ::restart:/sbin/init

    在上面的文件中指定了系统初始化脚本,因此接下来配置etc/init.d/rcS,写入如下内容:

    #!/bin/sh
    mount -t proc none /proc
    mount -t sys none /sys
    /bin/mount -n -t sysfs none /sys
    /bin/mount -t ramfs none /dev
    /sbin/mdev -s

    主要是配置各种目录的挂载

也可以在根目录下创建init文件,写入如下内容:

#!/bin/sh

mount -t proc none /proc
mount -t sysfs none /sys
mount -t devtmpfs devtmpfs /dev

exec 0</dev/console
exec 1>/dev/console
exec 2>/dev/console

echo -e "\nBoot took $(cut -d' ' -f1 /proc/uptime) seconds\n"
setsid cttyhack setuidgid 1000 sh

umount /proc
umount /sys
poweroff -d 0  -f

别忘了添加可执行权限:

$ chmod +x ./init
  1. 配置用户组
    $ echo "root:x:0:0:root:/root:/bin/sh" > etc/passwd
    $ echo "ctf:x:1000:1000:ctf:/home/ctf:/bin/sh" >> etc/passwd
    $ echo "root:x:0:" > etc/group
    $ echo "ctf:x:1000:" >> etc/group
    $ echo "none /dev/pts devpts gid=5,mode=620 0 0" > etc/fstab

    在这里建立了两个用户组root和ctf,以及两个用户root和ctf

  2. 配置glibc库
    将需要的动态链接库拷到相应位置即可

    这里师傅没弄我就也不弄,哼😕

3.打包文件系统为镜像文件

使用如下命令打包文件系统

$ find . | cpio -o --format=newc > ../../rootfs.cpio

也可以采用如下写法

$ find . | cpio -o -H newc > ../core.cpio

注意这里的打包位置可以随意

向文件系统中添加文件

若是我们后续需要向文件系统中补充一些其他的文件,可以选择在原先的_install文件夹中添加(不过这样的话若是配置多个文件系统则会变得很混乱),也可以解压文件系统镜像后添加文件再重新进行打包

  1. 解压磁盘镜像
    $ cpio -idv < ./rootfs.cpio
  2. 重打包磁盘镜像
    和打包磁盘镜像的命令一样
    $ find . | cpio -o --format=newc > ../new_rootfs.cpio

使用qemu运行内核

冲冲冲,激动的心颤抖的手,我们将使用自己配置的文件系统与内核跑起来

配置启动脚本

首先将先前的bzImage和rootfs.cpio放到同一个目录下
接下来编写启动脚本

#!/bin/sh
qemu-system-x86_64 \
    -m 128M \
    -kernel ./bzImage \
    -initrd  ./rootfs.cpio \
    -monitor /dev/null \
    -append "root=/dev/ram rdinit=/sbin/init console=ttyS0 oops=panic panic=1 loglevel=3 quiet nokaslr" \
    -cpu kvm64,+smep \
    -smp cores=2,threads=1 \
    -netdev user,id=t0, -device e1000,netdev=t0,id=nic0 \
    -nographic \
    -s

这里文件名使用boot.sh
部分参数说明如下:

  • -m:虚拟机内存大小
  • -kernel:内存镜像路径
  • -initrd:磁盘镜像路径
  • -append:附加参数选项
  • nokalsr:关闭内核地址随机化,方便我们进行调试
  • rdinit:指定初始启动进程,/sbin/init进程会默认以/etc/init.d/rcS作为启动脚本
  • loglevel=3 & quiet:不输出log
  • console=ttyS0:指定终端为/dev/ttyS0,这样一启动就能进入终端界面
  • -monitor:将监视器重定向到主机设备/dev/null,这里重定向至null主要是防止CTF中被人给偷了qemu拿flag
  • -cpu:设置CPU安全选项,在这里开启了smep保护
  • -s:相当于-gdb tcp::1234的简写(也可以直接这么写),后续我们可以通过gdb连接本地端口进行调试

运行boot.sh,我透,无敌~~

这里遇到一条报错信息:

mount: mounting none on /sys failed: No such device

坐等师傅解答

免费评分

参与人数 9吾爱币 +15 热心值 +3 收起 理由
bigluo123 + 1 我很赞同!
lsq665 + 1 我很赞同!
willJ + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
hxw0204 + 1 热心回复!
defloat + 1 + 1 我很赞同!
plasd + 1 + 1 热心回复!
zhczf + 1 我很赞同!
max2012 + 1 我很赞同!
1MajorTom1 + 1 热心回复!

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| peiwithhao 发表于 2022-11-1 08:21
gagmeng 发表于 2022-11-1 08:08
请问一下arttnab3师傅的教程链接,谢谢

https://arttnba3.cn/这是师傅的博客,评论区其他找不到的大伙都可以去看看,知识点十分的详细
gagmeng 发表于 2022-11-1 09:18
peiwithhao 发表于 2022-11-1 08:21
https://arttnba3.cn/这是师傅的博客,评论区其他找不到的大伙都可以去看看,知识点十分的详细

非常感谢
goda 发表于 2022-10-31 23:55
blawhickte 发表于 2022-11-1 00:07
好硬核的教程, 虽然编译openwrt也接触过一点点点点
Eserialize 发表于 2022-11-1 07:41
有些硬核,插眼。
gagmeng 发表于 2022-11-1 08:08
请问一下arttnab3师傅的教程链接,谢谢
jjsyx123 发表于 2022-11-1 08:45
感谢分享
hjw01 发表于 2022-11-1 09:45
谢谢分享,内核也是必须进阶的阶段
xy20200214 发表于 2022-11-1 11:20
没有bootloader吗
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-21 19:58

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表