main^2
em0 8 months ago
parent a536af6e16
commit cac59dc845

@ -33,24 +33,31 @@
# task.
#
# 输出脚本的作者信息
echo "cgroup tool for afl-fuzz by <samir.hakim@nyu.edu> and <dwheeler@ida.org>"
echo
# 清除NEW_USER变量的值
unset NEW_USER
# 设置默认内存限制为50MB
MEM_LIMIT="50"
# 解析命令行参数
while getopts "+u:m:" opt; do
case "$opt" in
# -u 参数用于指定运行fuzzer的用户
"u")
NEW_USER="$OPTARG"
;;
# -m 参数用于设置内存限制单位为MB
"m")
MEM_LIMIT="$[OPTARG]"
MEM_LIMIT="$OPTARG"
;;
# 如果遇到未知参数,退出脚本
"?")
exit 1
;;
@ -59,17 +66,22 @@ while getopts "+u:m:" opt; do
done
# 检查内存限制是否低于安全阈值
if [ "$MEM_LIMIT" -lt "5" ]; then
echo "[-] Error: malformed or dangerously low value of -m." 1>&2
exit 1
fi
# 移除已解析的选项保留fuzz命令
shift $((OPTIND-1))
# 获取目标二进制文件路径
TARGET_BIN="$1"
# 检查是否提供了必要的参数
if [ "$TARGET_BIN" = "" -o "$NEW_USER" = "" ]; then
# 输出使用说明
cat 1>&2 <<_EOF_
Usage: $0 [ options ] -- /path/to/afl-fuzz [ ...afl options... ]
@ -89,75 +101,81 @@ conjunction with '-m none' passed to the afl-fuzz binary itself, say:
_EOF_
# 因为缺少必要的参数,退出脚本
exit 1
fi
# Basic sanity checks
# 基本的系统检查
# 检查是否为Linux系统
if [ ! "`uname -s`" = "Linux" ]; then
echo "[-] Error: this tool does not support non-Linux systems." 1>&2
exit 1
fi
# 检查是否以root用户运行脚本
if [ ! "`id -u`" = "0" ]; then
echo "[-] Error: you need to run this script as root (sorry!)." 1>&2
exit 1
fi
# 检查是否安装了cgroup工具
if ! type cgcreate 2>/dev/null 1>&2; then
echo "[-] Error: you need to install cgroup tools first." 1>&2
# 根据包管理器提供安装命令建议
if type apt-get 2>/dev/null 1>&2; then
echo " (Perhaps 'apt-get install cgroup-bin' will work.)" 1>&2
elif type yum 2>/dev/null 1>&2; then
echo " (Perhaps 'yum install libcgroup-tools' will work.)" 1>&2
fi
# 因为缺少必要的工具,退出脚本
exit 1
fi
# 检查指定的用户是否存在
if ! id -u "$NEW_USER" 2>/dev/null 1>&2; then
echo "[-] Error: user '$NEW_USER' does not seem to exist." 1>&2
exit 1
fi
# Create a new cgroup path if necessary... We used PID-keyed groups to keep
# parallel afl-fuzz tasks separate from each other.
CID="afl-$NEW_USER-$$"
# 创建一个新的cgroup路径如果必要使用PID键值组来确保并行的afl-fuzz任务相互独立
CID="afl-$NEW_USER-$"
CPATH="/sys/fs/cgroup/memory/$CID"
# 如果路径不存在则创建cgroup
if [ ! -d "$CPATH" ]; then
cgcreate -a "$NEW_USER" -g memory:"$CID" || exit 1
fi
# Set the appropriate limit...
# 设置内存限制
# 如果系统支持交换空间限制,则同时设置内存和交换空间限制
if [ -f "$CPATH/memory.memsw.limit_in_bytes" ]; then
echo "${MEM_LIMIT}M" > "$CPATH/memory.limit_in_bytes" 2>/dev/null
echo "${MEM_LIMIT}M" > "$CPATH/memory.memsw.limit_in_bytes" || exit 1
echo "${MEM_LIMIT}M" > "$CPATH/memory.limit_in_bytes" || exit 1
# 如果系统有启用交换空间,则要求先禁用交换空间
elif grep -qE 'partition|file' /proc/swaps; then
echo "[-] Error: your system requires swap to be disabled first (swapoff -a)." 1>&2
exit 1
# 如果系统不支持交换空间限制,则仅设置内存限制
else
echo "${MEM_LIMIT}M" > "$CPATH/memory.limit_in_bytes" || exit 1
fi
# All right. At this point, we can just run the command.
# 运行fuzz命令并确保其在设置的cgroup内存限制下执行
cgexec -g "memory:$CID" su -c "$*" "$NEW_USER"
# 删除cgroup以清理资源
cgdelete -g "memory:$CID"

Loading…
Cancel
Save