KernelPwn Basic(持续更新)

最近发现CTF Wiki上的KernelPwn更新了,正好最近重温这方面的知识,顺便结合我之前在别的平台发布的一些笔记,重新写一下博客记录。

一、资源

二、一些常用脚本

2.1文件系统的解压与重新打包

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#/bin/sh

#注意,有时文件系统给的是一个压缩包格式,先手动解压再使用脚本。
#在题目目录下使用

#使用musl-gcc编译出来的exp体积小,必要时可去符号,进一步压缩体积。
musl-gcc -static -O2 ./exp.c -o ./exp

#创建工作目录
rm -r tmpfs
mkdir -p tmpfs

#文件系统备份
cp rootfs.cpio rootfs.cpio.bak

#在工作目录下,解包文件系统,传入exp,重新打包。
cd tmpfs
cpio -idv < ../rootfs.cpio
mv ../exp ./
find . | cpio -o --format=newc > ./rootfs.cpio
mv rootfs.cpio ../

#需要启动内核时
#./boot.sh

2.2 pwntools交互

通过py起shell传输base64的方式进行交互,打远程,exp可以用gzip打包压缩体积,传输时最好不要一次性传完,将二进制分段传输,不然容易出现base64截断的问题,导致exp不完整。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
from pwn import *
import os

root = False

if root == True:
cmd = '# '
else:
cmd = '$ '

with open("./exp", "rb") as f:
expdata = base64.b64encode(f.read())

p = process('./boot.sh', shell=True)
p.sendline()

for i in range(0, len(expdata), 0x200):
p.sendlineafter(cmd, "echo -n \"" + expdata[i:i + 0x200].decode() + "\" >> /home/ctf/b64_exp")

p.sendline("cat /home/ctf/b64_exp | base64 -d > /home/ctf/exp")
p.sendline("chmod +x /home/ctf/exp")
p.interactive()