1. 题目分析与漏洞定位
拿到这道Pwn题,我首先按照常规流程进行了初步分析。题目名为"Func_err",从名称上看可能涉及函数调用相关的错误处理。让我们一步步拆解这个二进制文件。
1.1 基础信息检查
使用file命令查看文件类型:
bash复制file func_err
输出显示这是一个64位的ELF可执行文件,动态链接且未剥离符号表。这类信息对我们后续的漏洞利用非常重要。
接着用checksec检查安全机制:
bash复制checksec --file=func_err
关键的安全机制状态如下:
- NX(No-eXecute):Disabled → 堆栈可执行
- Canary:Not found → 无栈保护
- PIE(Position Independent Executable):Enabled → 地址随机化开启
- RELRO:Partial → 部分重定位保护
这个安全配置组合非常有意思:
- NX关闭意味着我们可以在栈上执行shellcode
- 没有Canary使得栈溢出更容易实现
- PIE开启则需要我们想办法泄漏地址
1.2 关键函数分析
用IDA Pro反编译后,我重点关注了以下几个函数:
-
main函数:
- 调用了hello()和vuln()
- 在调用vuln()前打印了一个栈地址(关键泄漏点)
-
hello函数:
- 实际功能有限,主要是个干扰项
- 包含一个固定字符串的printf调用,但无法利用格式化字符串漏洞
-
gift函数:
- 包含一个看似可用的格式化字符串漏洞
- 但v1是固定字符串,无法被用户控制
- 经过验证确实无法利用
-
vuln函数:
- 使用gets()读取用户输入 → 明显的栈溢出点
- 缓冲区大小0x30,但gets()不检查输入长度
- 通过计算发现可以覆盖返回地址
提示:在PIE开启的情况下,我们需要先泄漏一个地址才能计算基址。幸运的是题目在调用vuln()前主动泄漏了栈地址。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 漏洞利用方案设计
2.1 利用思路选择
基于上述分析,可行的利用路径有:
