3、基础工具链:gcc、gdb、make、cmake、vim/neovim 的安装与基本使用

做二进制漏洞利用,说白了就是跟机器语言打交道。你写的 exploit 最终要变成机器码,调试时要看寄存器状态,编译时要控制内存布局。所以,工具链就是你的武器库。这一章,我把最核心的几个工具给你捋一遍。

我个人习惯,装环境从来不用一键脚本。为什么?因为出了问题你根本不知道哪里挂了。手动装一遍,心里才有底。

3.1 gcc:编译器的灵魂

gcc 是 GNU 编译器套件,我们主要用它的 C 编译器。在漏洞利用中,你经常需要编译带有特定内存布局的测试程序。

安装

# Debian/Ubuntu 系
sudo apt update
sudo apt install build-essential

# 验证
gcc --version

build-essential 这个包会帮你装好 gcc、g++ 和 make。我在项目中遇到过有人只装了 gcc 没装 g++,结果编译 C++ 代码时一脸懵。嗯,这里要注意。

基本使用

# 最简单的编译
gcc -o hello hello.c

# 带调试信息(必加!)
gcc -g -o hello hello.c

# 关闭优化,保留符号
gcc -O0 -g -o hello hello.c

# 关闭栈保护(漏洞利用常用)
gcc -fno-stack-protector -z execstack -o vuln vuln.c

关键点:做漏洞利用时,-O0 和 -g 几乎是标配。优化开高了,调试时变量可能被优化掉,寄存器状态也乱套。

我曾经在调试一个堆溢出漏洞时,开了 -O2 编译,结果 gdb 里看到的变量地址全是错的。折腾了两小时才发现是优化搞的鬼。从那以后,我写 exploit 测试程序一律 -O0。

3.2 gdb:调试器的王者

gdb 是 GNU 调试器。没有它,你就像蒙着眼睛拆炸弹。我个人觉得,gdb 是漏洞利用工程师最重要的工具,没有之一。

安装

sudo apt install gdb

# 强烈推荐装 pwndbg 或 gef 插件
git clone https://github.com/pwndbg/pwndbg
cd pwndbg
./setup.sh

基本命令

命令 作用 我的用法
b main 在 main 函数下断点 先 b main,然后 r 跑起来
r 运行程序 配合参数:r $(python -c 'print "A"*100')
c 继续执行 断点命中后,c 继续跑
si / ni 单步指令 / 单步跳过 看汇编时用 si,看源码用 ni
x/10gx $rsp 查看栈上 10 个 8 字节 检查栈布局,找返回地址
info registers 查看所有寄存器 看 rip、rsp、rbp 就够了

注意:gdb 默认会禁用 ASLR,但不会禁用栈保护。如果你要测试漏洞,记得用前面说的 -fno-stack-protector 编译。

你想想看,调试一个缓冲区溢出时,你盯着栈上的数据,看它怎么被覆盖,怎么劫持控制流。那种感觉,就像在显微镜下看病毒入侵细胞。gdb 就是你的显微镜。

3.3 make 与 cmake:构建的艺术

写 exploit 时,你可能只需要 gcc 一条命令。但当你开始写 fuzzer、写漏洞分析框架时,项目一复杂,手动编译就是噩梦。make 和 cmake 就是来解决这个问题的。

make:简单粗暴

# 安装
sudo apt install make

# 一个简单的 Makefile
# 文件名:Makefile
all: vuln

vuln: vuln.c
	gcc -g -O0 -fno-stack-protector -o vuln vuln.c

clean:
	rm -f vuln

用 make 编译:

make        # 编译
make clean  # 清理

cmake:跨平台利器

# 安装
sudo apt install cmake

# 一个简单的 CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
project(vulnlab)

set(CMAKE_C_FLAGS "-g -O0 -fno-stack-protector")

add_executable(vuln vuln.c)

用 cmake 编译:

mkdir build && cd build
cmake ..
make

我个人习惯,小项目用 make,大项目用 cmake。为什么?make 写起来快,但跨平台麻烦。cmake 配置复杂点,但一次配置到处编译。

我在项目中遇到过,一个漏洞分析框架有 50 多个源文件,用 make 写依赖关系写到崩溃。换成 cmake 后,三行配置搞定。嗯,工具选对了,事半功倍。

3.4 vim / neovim:编辑器的信仰

编辑器之争,我站 vim。不是因为它比别的编辑器好,而是因为你在服务器上调试时,只有 vim 是标配。你想想看,SSH 到远程靶机,没有 GUI,你用什么?vim。

安装

# vim
sudo apt install vim

# neovim(推荐)
sudo apt install neovim

# 或者用 pip 装
pip install pynvim

基本配置

" 放到 ~/.vimrc 或 ~/.config/nvim/init.vim
set number          " 显示行号
set relativenumber  " 相对行号(调试时超有用)
set tabstop=4       " tab 宽度
set shiftwidth=4    " 缩进宽度
syntax on           " 语法高亮
set hlsearch        " 搜索高亮

" 漏洞利用专用
set nowrap          " 不自动换行(看汇编时)
set list            " 显示不可见字符

基本操作

模式 操作 说明
普通模式 dd 删除当前行
普通模式 yy 复制当前行
普通模式 p 粘贴
命令模式 :w 保存
命令模式 :q 退出
命令模式 :!gcc % 编译当前文件

我曾经在调试一个 ROP 链时,需要反复修改 exploit 里的偏移量。用 vim 的 :%s/old_offset/new_offset/g 一条命令全换完,比鼠标点来点去快十倍。

说实话,vim 的学习曲线确实陡。但一旦你过了那个坎,你会发现你的编辑速度跟思维速度同步了。写 exploit 时,脑子里想到什么,手指已经敲完了。这种感觉,很爽。

3.5 工具链的协同工作

这几个工具不是孤立的。我通常的工作流是这样的:

  1. 用 vim 写漏洞测试程序 vuln.c
  2. 用 make 或 cmake 编译(带调试信息)
  3. 用 gdb 调试,分析崩溃点
  4. 回到 vim 修改 exploit
  5. 重复 2-4 直到成功

你想想看,这个循环跑得越快,你挖漏洞的效率就越高。所以,花点时间把工具链配好,绝对值得。

避坑指南:我曾经在 Ubuntu 20.04 上装 neovim,结果 apt 源里的版本太老,插件全挂。后来改用官方 PPA 或者直接编译安装,问题解决。记住,工具链的版本很重要,尤其是 gcc 和 gdb 的版本。

好了,这一章就到这里。工具链装好了,下一章我们开始真正动手,写第一个缓冲区溢出 exploit。到时候你会发现,这些工具就是你的左膀右臂。

总结:gcc 编译、gdb 调试、make/cmake 构建、vim 编辑。这四个工具,是二进制漏洞利用的四大基石。别嫌基础,我见过太多人连 gdb 的 x 命令都不会用,就开始挖漏洞。嗯,那是在碰运气。

咨询更多资料,