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 工具链的协同工作
这几个工具不是孤立的。我通常的工作流是这样的:
- 用 vim 写漏洞测试程序 vuln.c
- 用 make 或 cmake 编译(带调试信息)
- 用 gdb 调试,分析崩溃点
- 回到 vim 修改 exploit
- 重复 2-4 直到成功
你想想看,这个循环跑得越快,你挖漏洞的效率就越高。所以,花点时间把工具链配好,绝对值得。
避坑指南:我曾经在 Ubuntu 20.04 上装 neovim,结果 apt 源里的版本太老,插件全挂。后来改用官方 PPA 或者直接编译安装,问题解决。记住,工具链的版本很重要,尤其是 gcc 和 gdb 的版本。
好了,这一章就到这里。工具链装好了,下一章我们开始真正动手,写第一个缓冲区溢出 exploit。到时候你会发现,这些工具就是你的左膀右臂。
总结:gcc 编译、gdb 调试、make/cmake 构建、vim 编辑。这四个工具,是二进制漏洞利用的四大基石。别嫌基础,我见过太多人连 gdb 的 x 命令都不会用,就开始挖漏洞。嗯,那是在碰运气。
咨询更多资料,