这个 bug 在 2020 年 12 月初被发现,但发现者不是我,而是一位只看了 fbsd 15 分钟就立刻发现问题所在的天才 🙇♂️。这个 C++ 实现是在 PS5 内核加入一些堆随机化功能后,尝试提高漏洞利用可靠性时制作的。
wget http://ftp-archive.freebsd.org/pub/FreeBSD-Archive/old-releases/VM-IMAGES/11.0-RELEASE/amd64/Latest/FreeBSD-11.0-RELEASE-amd64.vhd.xz
在虚拟机中:adduser,将 sshd_enable="YES" 添加到 /etc/rc.conf,然后执行 /etc/rc.d/sshd start
必须在虚拟机中构建,因为 freebsd 构建系统与非 freebsd 系统不兼容(他们大约在 fbsd 12/13 版本启用了兼容性,但我们需要的是 11...)
参见 https://docs.freebsd.org/en/books/handbook/kernelconfig/,或者直接:
cd /usr/src/sys/amd64/conf
cp GENERIC /root/CONFIG
ln -s /root/CONFIG
编辑 CONFIG,删除 options DDB 并__添加__ options GDB
构建并安装:
cd /src/src
make buildkernel KERNCONF=CONFIG
make installkernel KERNCONF=CONFIG
reboot
将 /usr/obj/usr/src/sys/CONFIG/kernel.debug 从虚拟机中复制出来,供 gdb 使用。
git clone -b releng/11.0 https://github.com/freebsd/freebsd.git
从 https://ftp.gnu.org/gnu/gdb/ 获取最新版本并解压
mkdir build
cd build
../configure --disable-binutils --disable-ld --disable-gold --disable-gas --disable-sim --disable-gprof --target=x86_64-unknown-freebsd
make -j64
使用 https://github.com/cyrus-and/gdb-dashboard
set substitute-path /usr/src /home/shawn/freebsd
set disassembly-flavor intel
file kernel.debug
target remote /tmp/fbsd11
https://github.com/weltling/convey https://github.com/jstarks/npiperelay
#!/bin/sh
GDB_PATH=/home/shawn/gdb-10.1/build/gdb
PATH=$GDB_PATH:$PATH
gdb --data-directory=/home/shawn/gdb-10.1/build/gdb/data-directory
在虚拟机中:
sysctl debug.kdb.enter=1