1. 二进制漏洞利用实战入门
最近在练习CTF中的pwn类题目,发现很多新手在入门时容易卡在基础题目上。今天我就以攻防世界平台上的三个经典入门题(get_shell、hello_pwn、level0)为例,带大家手把手走一遍解题流程,顺便分享些我在实战中总结的技巧。
这三个题目虽然简单,但涵盖了栈溢出、函数调用约定、ROP等基础知识点,特别适合刚接触二进制安全的同学练手。下面我会分别从题目分析、漏洞定位、利用脚本编写三个维度详细讲解,最后还会附上我调试时记录的笔记。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. get_shell题目解析
2.1 基础环境准备
首先我们需要配置好调试环境:
- Ubuntu 18.04虚拟机(建议用这个版本,兼容性最好)
- pwntools工具包(pip install pwntools)
- gdb-peda插件(增强调试功能)
- checksec工具(检测程序保护机制)
用checksec检查get_shell程序:
bash复制checksec get_shell
[*] '/home/user/get_shell'
Arch: amd64-64-little
RELRO: Partial RELRO
Stack: No canary found
NX: NX disabled
PIE: No PIE (0x400000)
RWX: Has RWX segments
关键点在于NX disabled和No canary,这意味着我们可以直接执行栈上的代码,而且不需要绕过栈保护。
2.2 漏洞分析与利用
反编译后可以看到极其简单的逻辑:
c复制int main() {
char buf[16];
gets(buf);
return 0;
}
典型的栈溢出漏洞,gets函数不检查输入长度。通过计算可知:
- buf到返回地址的偏移量是16字节(buf大小)+8字节(保存的rbp)=24字节
利用步骤:
- 用cyclic生成测试字符串确定偏移
- 构造payload:24字节垃圾数据 + shellcode地址
- 由于NX关闭,可以直接在栈上布置shellcode
