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 #

IDA 9.0 SP1 Torrent

先正常安装,然后打补丁激活

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 的匹配规则

https://www.cnblogs.com/basstorm/p/13454612.html

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 #

smali

除了修改 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 releases

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