[ pwn 学习 ] CTFshow-pwn18
2026-08-22 20:36:38
pwn18
1. 基础信息
查看二进制文件安全防护
1 | checksec pwn17 |
64 位程序,保护全开(Canary NX PIE 一个不少)和 pwn17 一样防护拉满
2.反编译分析(main 函数)
拖进 IDA F5 反编译 核心逻辑很短
1 | int __cdecl main(int argc, const char **argv, const char **envp) |
程序先问你"Which is the real flag"然后你输入一个数字
- 输入 9 调用
fake()函数 - 输入其他 调用
real()函数
最后统一执行cat /ctfshow_flag
3.fake()vsreal()
1 | // 假函数(但能拿到真 flag) |
两个函数只差一个字符:>>vs>
4.核心漏洞:>vs>>的文件重定向差异
这题漏洞不在代码逻辑,而在代码对文件系统产生的副作用
4.1 两个符号本质区别
| 符号 | 术语 | 行为描述 | 对 flag 的影响 |
|---|---|---|---|
| > | 覆盖重定向 | 覆盖写 先清空文件 再写入新内容 |
毁灭性 原来的真 flag 直接被删了 |
| >> | 追加重定向 | 追加写 保留原内容 只在末尾追加 |
保护性 真 flag 还在,只是后面多了一行废话 |
4.2 推演执行流程
靶机环境里/ctfshow_flag文件里预先存着真正的 flag
- 如果选
real()(输入非 9)
1 | ① system("echo 'flag is here' > /ctfshow_flag") |
真 flag 在你读之前就被>删掉了
- 如果选
fake()(输入 9)
1 | ① system("echo 'flag is here' >> /ctfshow_flag") |
实际操作:输入 9 即可获得 flag
5.shell 重定向符号
| 符号 | 作用 | 示例 | 什么时候用 |
|---|---|---|---|
| > | 覆盖写入文件 | echo a > flag | 要创建/覆盖一个新文件 |
| >> | 追加写入文件 | echo a >> flag | 要在文件末尾加内容,不动原来的 |
| < | 从文件读取输入 | ./pwn < input.txt | 把文件内容喂给程序 |
| 2> | 重定向 stderr | ./pwn 2> err.log | 只看错误日志 |
| &> | 同时重定向 stdout + stderr | ./pwn &> all.log | 把所有输出都存起来 |
| /dev/null | 黑洞(数据丢进去就消失) | ./pwn > /dev/null | 不想要输出,只想安静执行 |