LinuxCTF环境搭建
操作系统:Fedora Linux
写这篇文章是为了防止笔者哪天电脑炸了忘记怎么配回来
编译安装大部分工具都需要 通畅 的网络,如果遇到困难请用 proxychains
二进制 #
venv #
笔者用的包管理器是 uv,这边用 python 自带的 venv 包而不是 uv venv 是为了隔离 pip
uv run -p 3.10 python -m venv ~/venv/ctf && source ~/venv/ctf/bin/activate
uv pip install --index=https://mirrors.aliyun.com/pypi/simple tqdm gmpy2 numpy sympy pycryptodome monkeyhex keystone-engine capstone z3-solver patchelf matplotlib numba
pip config set global.index-url 'https://mirrors.aliyun.com/pypi/simple'
pip config set install.trusted-host 'mirrors.aliyun.com'
uv venv -p 3.10 $HOME/venv/ctf && source ~/venv/ctf/bin/activate
除非特殊说明,接下来所有的 pip 动作都在这个 venv 中
pwntools/pwncli #
pip install pwntools pwncli
angr #
angr 的 unicorn 支持只到 2.0.1
pip install angr unicorn==2.0.1
frida #
pip install frida frida-tools
代码补全功能 npm install -g @types/frida-gum
VSCode 开发注入脚本时加上 import "frida-gum" 就可享受代码补全
libdebug #
pip install libdebug
LIEF #
pip install lief
IDA Pro #
先正常安装,然后打补丁激活
cp keygen2.py /opt/ida90sp1/keygen2.py && cd /opt/ida90sp1 && python keygen2.py
mv libida.so libida.so.bak && mv libida.so.patched libida.so
mv libida32.so libida32.so.bak && mv libida32.so.patched libida32.so
如果是 Wayland 启动时候加两个环境变量来减少兼容性问题(让 Wayland 跑在 XWayland 上,让 fcitx 跑在 ibus 上)
QT_QPA_PLATFORM=xcb QT_IM_MODULE=ibus
暂时还没找到 IDA 使用 venv 环境的办法,所以就用全局 pip 用户安装了
FLAIR #
库函数签名制作工具
加环境变量 /opt/flair90/bin/x64linux
调试服务器 #
sudo install /opt/ida90/dbgsrv/linux_server /usr/local/bin/idadbgsrv
sudo install /opt/ida90/dbgsrv/linux_server32 /usr/local/bin/idadbgsrv32
adb push /opt/ida90/dbgsrv/android_server /data/local/tmp/android_server
IDA 插件 #
插件目录
mkdir -p ~/.idapro/plugins && cd ~/.idapro/plugins
VSCode 代码补全 settings.json
"python.analysis.extraPaths": [
"/opt/ida90/python"
]
findcrypt-yara #
功能:借助 yara 匹配工具来寻找常见加解密算法特征
依赖 pip install --user yara-python
wget https://raw.githubusercontent.com/polymorf/findcrypt-yara/refs/heads/master/findcrypt3.py
yara 匹配规则 wget https://raw.githubusercontent.com/polymorf/findcrypt-yara/refs/heads/master/findcrypt3.rules
添加国密 SM4 的匹配规则
rule SM4_FK {
meta:
author = "Basstorm"
description = "Look for SM4_FKbox constants"
date = "2020-08"
strings:
$c0 = { C6 BA B1 A3 50 33 AA 56 97 91 7D 67 DC 22 70 B2 }
condition:
$c0
}
rule SM4_CK {
meta:
author = "Basstorm"
description = "Look for SM4_CKbox constants"
date = "2020-08"
strings:
$c0 = { 15 0E 07 00 31 2A 23 1C 4D 46 3F 38 69 62 5B 54 85 7E 77 70 A1 9A 93 8C }
condition:
$c0
}
keypatch #
功能:借助 keystone 高效打补丁
依赖 pip install --user keystone-engine six
wget https://raw.githubusercontent.com/keystone-engine/keypatch/refs/heads/master/keypatch.py
D810 #
功能:在 F5 中消解表达式混淆和平坦化
pip install --user z3-solver
git clone https://gitlab.com/eshard/d810.git && cd d810 && cp -r d810 ~/.idapro/plugins && cp D810.py ~/.idapro/plugins
IDA MCP #
git clone git@github.com:mrexodia/ida-pro-mcp.git && cd ida-pro-mcp
uv python install 3.11
VSCode Cline 配置
"ida-pro-mcp": {
"command": "uv",
"args": [
"--directory",
"~/source/ida-pro-mcp",
"run",
"ida-pro-mcp"
],
"timeout": 1800,
"disabled": false
}
cp src/ida_pro_mcp/mcp-plugin.py ~/.idapro/plugins/
选择 Edit -> Plugins -> MCP 将会启动服务端在 13337 等待 Cline 的连接
提示词尽量写得详细一些来减少幻觉
BinDiff #
用于比对两个二进制文件的差别,类似 diff,有图形化界面,也有 IDA 插件和 BN 插件
bindiff 插件也需要 binexport 插件依赖,所以要先编译 binexport
mkdir -p build && cmake -S . -B build -G Ninja \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_INSTALL_PREFIX=build \
-DBINEXPORT_ENABLE_IDAPRO=ON \
-DIdaSdk_ROOT_DIR=$HOME/idasdk90 \
-DBINEXPORT_ENABLE_BINARYNINJA=ON
cmake --build build --config Release
然后编译 bindiff
mkdir -p build && cmake -S . -B build -G Ninja \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_INSTALL_PREFIX=build \
-DBINDIFF_BINEXPORT_DIR=$HOME/binexport \
-DIdaSdk_ROOT_DIR=$HOME/idasdk90
cmake --build build --config Release
你或许会遇到 issue 84,修复 main_portable.cc 即可
你可能还需要 ln -s ida ida64
IDA Rust Demangler #
WIP
REHex #
二进制编辑器,可取代 010-Editor
sudo dnf copr enable solemnwarning/rehex && sudo dnf install rehex
Detect It Easy #
查壳工具
先把 AppImage 放到 ~/.local/bin
die --appimage-mount 可以捞取自带的 APP 图标和 .desktop 快捷方式
Ghidra #
git clone git@github.com:NationalSecurityAgency/ghidra.git
下载依赖 gradle -I gradle/support/fetchDependencies.gradle
如果下不下来就手动下到 dependencies/downloads/
gradle buildGhidra
编译完成后解压,如果是高分辨率屏,可以修改 support/launch.properties 中的 VMARGS_LINUX=-Dsun.java2d.uiScale=2 来缩放
Ghidrathon #
Ghidrathon 下载最新的 Release
建一个新的虚拟环境 uv python -m venv ~/venv/ghidra && source ~/venv/ghidra/bin/activate
安装依赖 jep pip install -r requirements.txt
提示没 JAVA_HOME JAVA_HOME=/usr/lib/jvm/java-openjdk
提示没 Python.h sudo dnf install python3-devel
配置 ghidrathon 的 python 解释器环境 python ghidrathon_configure.py /opt/ghidra/ghidra_11.4.2_DEV
安装插件 zip 到 ghidra 即可
CodeBrowser - Window - Ghidrathon
ghidra-wasm-plugin #
反编译 WebAssembly 字节码
git clone git@github.com:nneonneo/ghidra-wasm-plugin.git
GHIDRA_INSTALL_DIR=/opt/ghidra/ghidra_11.4.2_DEV gradle buildExtension
Binary Ninja #
WIP
KVM Windows 虚拟机 #
virtio 客户机驱动 virtio-win
共享磁盘驱动 WinFsp
添加共享磁盘后需要设置 VirtIO-FS Service 为自动启用
services.msc 禁用 Windows Search
gpedit.msc 自动更新 - 已禁用
gpedit.msc Windows Defender 防病毒 & 实时保护 - 已禁用(也可以用 defendnot)
一些小游戏逆向需要添加 OpenGL 支持:Mesa 驱动
pwndbg #
笔者选择装在家目录下(-u 选项)
curl -qsL 'https://install.pwndbg.re' | sh -s -- -u -t pwndbg-gdb
websocat #
git clone git@github.com:vi/websocat.git
cargo build --release
nasm #
sudo dnf install nasm
binwalk #
sudo dnf install binwalk
upx #
sudo dnf install upx
Python 逆向 #
pycdc
cd ~/source && git clone git@github.com:zrax/pycdc.git
cd pycdc && mkdir -p build && cd build && cmake .. && cmake --build .
sudo install pycdas ~/.local/bin && sudo install pycdc ~/.local/bin\
pyinstxtractor-ng
git clone git@github.com:pyinstxtractor/pyinstxtractor-ng.git && cd pyinstxtractor-ng
echo '#!/usr/bin/env python3' | cat - pyinstxtractor-ng.py | tee ~/.local/bin/pyinstxtractor-ng >/dev/null && chmod +x ~/.local/bin/pyinstxtractor-ng
依赖 pip install xdis
Cython
pip install Cython
sudo dnf install python3-devel
移动安全 #
Android SDK #
先下载 Android Studio,官网下载发行包即可
安装依赖 sudo dnf install zlib-ng.i686 ncurses-libs.i686 bzip2-libs.i686
启动参数 -Dawt.toolkit.name=WLToolkit 来避免 Wayland 兼容问题
Vim 插件:IDEAVim
创建项目后,为了更快拉取 gradle,需要在 gradle/wrapper/gradel-wrapper.properties 修改镜像源
distributionUrl=https\://mirrors.cloud.tencent.com/gradle/gradle-8.11.1-bin.zip
通过 SDK Manager 下载 Android SDK
因为 Android SDK 的各种工具会有多版本共存,笔者给一个快速添加环境变量的办法
function _addPath() {
local binPath=$1
local binCanary=$2
command -v $binCanary >/dev/null || PATH="$binPath:$PATH"
}
ANDROID_BUILD_TOOLS_ROOT="$HOME/Android/Sdk/build-tools"
ANDROID_NDK_ROOT="$HOME/Android/Sdk/ndk"
ANDROID_CMDLINE_TOOLS_ROOT="$HOME/Android/Sdk/cmdline-tools"
_addPath "$HOME/Android/Sdk/platform-tools" adb
_addPath "$HOME/Android/Sdk/emulator" emulator
_addPath "$ANDROID_BUILD_TOOLS_ROOT/$(_findLatestVersion $ANDROID_BUILD_TOOLS_ROOT)" apksinger
_addPath "$ANDROID_NDK_ROOT/$(_findLatestVersion $ANDROID_NDK_ROOT)" ndk-build
_addPath "$ANDROID_CMDLINE_TOOLS_ROOT/$(_findLatestVersion $ANDROID_CMDLINE_TOOLS_ROOT)/bin" sdkmanager
JEB Pro #
APK 反编译工具
CXV 大神破解的 JEB Pro
制作启动项 dex-autostart -c /opt/JEB-5.30.0.202506111623/jeb_linux.sh JEB.desktop
默认设置下 jdb2 项目巨大无比,而且重新加载时经常卡死,可以尝试调整一下保存模式
选项 - 后端属性 - 项目 - 快速保存
baksmali #
除了修改 wrapper 镜像源之外,由于这个仓库很久不更新了,其使用的 gradle 6 需要老版本 jdk 才能运行,升级到 gradle 8 配置文件会报错,笔者这里用 jdk 11 编译
需要修改 gradle.properties
org.gradle.java.home=/opt/java/jdk-11
systemProp.https.protocols=TLSv1.1
./gradlew build
作者还写了一个 Android Studio 直接调试 smali 的插件 smalidea,不过也是很久没更新了,想直接调试 smali 的话还是建议 JEB
还用一种办法是用 JADX 导出源码再在 Android Studio 调试
apktool #
APK 打包解包工具
jar 启动脚本:sudo wget -q -O /usr/local/bin/apktool' https://raw.githubusercontent.com/iBotPeaches/Apktool/master/scripts/linux/apktool' && sudo chmod +x /usr/local/bin/apktool
apktool 本体:sudo wget -q -O /usr/local/bin/apktool.jar 'https://bitbucket.org/iBotPeaches/apktool/downloads/apktool_2.11.1.jar'
dex-tools (dex2jar) #
dex 工具套件,包括 dex 到 jar 的转换工具 dex-tools-v2.4
下载然后加环境变量即可
jd-gui #
jar 反编译工具 jd-gui-1.6.6.jar
jar 启动脚本,从 apktool 抄的
#!/bin/bash
# Set up prog to be the path of this script, including following symlinks,
# and set up progdir to be the fully-qualified pathname of its directory.
prog="$0"
while [ -h "${prog}" ]; do
newProg=`/bin/ls -ld "${prog}"`
newProg=`expr "${newProg}" : ".* -> \(.*\)$"`
if expr "x${newProg}" : 'x/' >/dev/null; then
prog="${newProg}"
else
progdir=`dirname "${prog}"`
prog="${progdir}/${newProg}"
fi
done
oldwd=`pwd`
progdir=`dirname "${prog}"`
cd "${progdir}"
progdir=`pwd`
prog="${progdir}"/`basename "${prog}"`
cd "${oldwd}"
jarfile=jd-gui.jar
libdir="$progdir"
if [ ! -r "$libdir/$jarfile" ]; then
# Find the highest version of jd-gui-*.jar in the directory.
highest_jarfile=$(ls "$libdir"/jd-gui-*.jar 2>/dev/null | sort -V | tail -n 1)
if [ -n "$highest_jarfile" ]; then
jarfile=$(basename "$highest_jarfile")
else
echo `basename "$prog"`": can't find $jarfile"
exit 1
fi
fi
javaOpts=""
# If you want DX to have more memory when executing, uncomment the following
# line and adjust the value accordingly. Use "java -X" for a list of options
# you can pass here.
#
javaOpts="-Xmx1024M -Dfile.encoding=utf-8 -Djdk.util.zip.disableZip64ExtraFieldValidation=true -Djdk.nio.zipfs.allowDotZipEntry=true"
# Alternatively, this will extract any parameter "-Jxxx" from the command line
# and pass them to Java (instead of to dx). This makes it possible for you to
# add a command-line parameter such as "-JXmx256M" in your ant scripts, for
# example.
while expr "x$1" : 'x-J' >/dev/null; do
opt=`expr "$1" : '-J\(.*\)'`
javaOpts="${javaOpts} -${opt}"
shift
done
if [ "$OSTYPE" = "cygwin" ] ; then
jarpath=`cygpath -w "$libdir/$jarfile"`
else
jarpath="$libdir/$jarfile"
fi
# add current location to path for aapt
PATH=$PATH:`pwd`;
export PATH;
exec java $javaOpts -jar "$jarpath" "$@"
启动脚本会提取 -J 开头的参数,然后将其转化为 jar 的参数
启动参数加上 -JDsun.java2d.uiScale=2.0 可以缩放,不然高分辨率下看不清字
JADX #
APK 反编译工具 JADX,比 JEB 更轻,可导出 Java 源码用于 Android Studio 调试
克隆之后,修改 wrapper 镜像源然后 ./gradlew dist 即可
JADX 打开之后可以在选项栏里创建快捷方式,也需要在环境变量里加入 JAVA_OPTS=-Dsun.java2d.uiScale=2.0 来放大倍率
BurpSuite Pro #
curl -OJ 'https://portswigger-cdn.net/burp/releases/download?product=pro&type=Jar&version=2025.5.6'
使用 h3110w0r1d 大佬制作的 loader
burpsuite_pro.sh
#!/bin/bash
BURP_HOME="/opt/burpsuite_pro_v2025"
BURP_VER="v2025.1.5"
java --add-opens=java.desktop/javax.swing=ALL-UNNAMED \
--add-opens=java.base/java.lang=ALL-UNNAMED \
--add-opens=java.base/jdk.internal.org.objectweb.asm=ALL-UNNAMED \
--add-opens=java.base/jdk.internal.org.objectweb.asm.tree=ALL-UNNAMED \
--add-opens=java.base/jdk.internal.org.objectweb.asm.Opcodes=ALL-UNNAMED \
-javaagent:"${BURP_HOME}/loader.jar" -noverify -jar "${BURP_HOME}/burpsuite_pro_${BURP_VER}.jar" $@ &
第一次激活时,先 java -jar loader.jar,按照提示选择手动激活,将激活请求复制到 loader 中得到响应即可激活
可以同 JEB 制作启动项
BurpSuite MCP #
先在插件市场下载 BurpSuite MCP
VSCode Cline 配置
"burp": {
"disabled": true,
"timeout": 60,
"url": "http://127.0.0.1:9876/sse",
"type": "sse"
}
真机 #
root #
首先解锁 BootLoader,小米用户可以看 Xiaomi-HyperOS-BootLoader-Bypass
然后通过 Magisk 来 root
下载 Magisk 的 apk 管理端
拷贝线刷包里的 boot.img 到手机,然后在 Magisk 里选择修补,修补完成后传回电脑
adb reboot fastboot 进 fastboot 之后 fastboot flash boot boot.img
刷写完毕后重启
adb shell 然后 su 来测试 root
Magisk 版本要够高以支持 Zygisk,Zygisk 可以注入 Zygote 进程然后暴露 API 给 XPosed 等框架使用,Zygisk 需要在管理端的设置里开启
最后还需开启整机调试 resetprop ro.debuggable 1
重启安卓框架(不是手机!)stop;start
注意该方法开启的整机调试重启手机后会失效,需要重新设置
frida-server #
安装 frida-server 需要 root
frida 更的很快,下载 server 前最好看下电脑上 frida 的版本 frida --version
adb push frida-server /data/local/tmp/
adb shell
cd /data/local/tmp/ && chmod +x frida-server
跑起来即可 ./frida-server &
配置 Burpsuite 抓包 #
WIP
unidbg #
WIP
XPosed #
WIP
LSPosed-Zygisk
密码 #
uv pip install --index=https://mirrors.aliyun.com/pypi/simple pycryptodome cryptography gmssl pyasn1 pyasn1-modules notebook
sagemath #
sagemath 比较笨重,直接放 docker 里暴露一个 jupyter 出来
docker run --name sagemath -p8888:8888 sagemath/sagemath:latest sage-jupyter
sagemath 启动之后使用 docker logs sagemath 可以查看 jupyter 的 token
建议是在容器里也装一套 pwntools,这样可以直接打
Stark #
https://github.com/SideChannelMarvels/Stark
已知轮密钥倒推全部密钥,支持 AES, DES, SM4
克隆然后 make 即可
phoenix AES #
WIP
线下赛 #
nmap/ncat #
sudo dnf install nmap nmap-ncat
KVM Kali 虚拟机 #
先换源
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak && sudo sed -i 's/http.kali.org/mirror.nju.edu.cn/' /etc/apt/sources.list && sudo apt update
客户机驱动(如果是官网的 QEMU 版 Kali,那么这三个包都自带了)
sudo apt install qemu-guest-agent spice-vdagent xserver-xorg-video-qxl
共享文件夹要麻烦一点,每次启动都要这样挂载
sudo mount -t virtiofs fedora
一些渗透/扫描/提权工具可以在 Kali 里找到,如 gobuster, PEASS, impacket, .etc
WireShark #
用来审计其他队伍的流量
sudo dnf install wireshark
免 sudo 启动:sudo gpasswd -a $USER wireshark
Metasploit Framework #
如果会写 Ruby 的话,甚至可以用来批量打 AWD
cd /tmp && curl https://raw.githubusercontent.com/rapid7/metasploit-omnibus/master/config/templates/metasploit-framework-wrappers/msfupdate.erb > msfinstall && chmod 755 msfinstall && ./msfinstall
msfconsole
第一次启动之后 msfdb 会打开,如果不想占用资源可以 msfdb stop
环境变量 /opt/metasploit-framework/bin
知识库 #
总有一些比赛是要断网的,对吧
Hacktricks #
git clone --single-branch --branch master git@github.com:HackTricks-wiki/hacktricks.git
docker run -d --platform linux/amd64 -p 3337:3000 --name hacktricks -v $(pwd)/hacktricks:/app ghcr.io/hacktricks-wiki/hacktricks-cloud/translator-image bash -c "cd /app && git config --global --add safe.directory /app && MDBOOK_PREPROCESSOR__HACKTRICKS__ENV=dev mdbook serve --hostname 0.0.0.0"
初次启动需要编译书本,大约 5 分钟
Hacktricks 比较大,启动起来会比较慢
RedTeaming-Tactics-and-Techniques #
git clone --depth=1 git@github.com:mantvydasb/RedTeaming-Tactics-and-Techniques.git
AllTheThings #
Payload 合集 https://github.com/swisskyrepo/PayloadsAllTheThings
内网/域合集 https://github.com/swisskyrepo/InternalAllTheThings
IoT/工控合集 https://github.com/swisskyrepo/HardwareAllTheThings
ctf-wiki #
docker run --name ctfwiki -p4380:80 -d ctfwiki/ctf-wiki
CyberChef #
懒人加解密必备,再也不用 Python 手搓了
docker run --name cyberchef -p4480:80 -d ghcr.io/gchq/cyberchef
vulhub #
一些公开的 exploit
git clone --depth=1 git@github.com:vulhub/vulhub.git
Linux 内核提权漏洞集合 #
git clone git@github.com:SecWiki/linux-kernel-exploits.git
SecList #
爆破用的字典
git clone --depth=1 git@github.com:danielmiessler/SecLists.git
TheKingOfDuck_fuzzDict #
另一个爆破用的字典
git clone --depth=1 git@github.com:TheKingOfDuck/fuzzDicts.git
crypto-attacks #
常见密码学攻击的 Python 实现
git clone git@github.com:jvdsn/crypto-attacks.git
Boneh-Durfee 攻击和 Coppersmith 攻击可参考下面这个库
git clone git@github.com:mimoo/RSA-and-LLL-attacks.git