[ pwn 学习 ] CTFshow-pwn16
2026-08-22 20:36:38
pwn16(没写完
1. 题目目标
已知文件:flag.s(汇编文件)
目标:
- 在 Ubuntu 虚拟机里用
gcc编译成可执行文件。 - 运行程序拿到
ctfshow{}格式的 flag。 - 理解它为什么是这个 flag。
2. 最终答案(先给结果)
本题可见 flag:
ctfshow{daniuniuda}
说明:程序会输出 16 个字节,其中后面有若干 \x00(空字符,不可见),所以人眼可见部分就是上面这段。
3. Ubuntu 虚拟机准备(第一次做题必看)
如果你已经有 Ubuntu 虚拟机,直接跳到第 4 节。
推荐环境:
- Ubuntu 20.04 / 22.04(64 位)。
- 终端(Terminal)。
- 已联网(用于安装工具)。
安装编译工具:
1 | sudo apt update |
检查是否安装成功:
1 | gcc --version |
如果能看到 gcc 版本号,说明环境 OK。
4. 把 flag.s 放进 Ubuntu 虚拟机
下面给你最常见的两种方法,选一种就行。
方法 A:共享文件夹(推荐)
- 在虚拟机软件里设置共享目录(把 Windows 放
flag.s的目录共享给 Ubuntu)。 - 进入 Ubuntu 终端,创建题目目录:
1 | mkdir -p ~/ctfshow/pwn16 |
- 从共享目录复制文件(把
YOUR_SHARE_NAME换成你的共享名):
1 | cp /media/sf_YOUR_SHARE_NAME/flag.s ~/ctfshow/pwn16/ |
方法 B:直接拖拽
- 把
flag.s从主机拖到 Ubuntu 桌面。 - 打开终端:
1 | mkdir -p ~/ctfshow/pwn16 |
检查文件是否在当前目录:
1 | ls -l |
5. 正式编译和运行
先确认它是汇编源码文本:
1 | file flag.s |
用 gcc 编译:
1 | gcc flag.s -o flag |
运行:
1 | ./flag |
你会看到类似:
1 | ctfshow{daniuniuda......} |
其中 . 只是终端对不可见字符的表现,真正可见内容是 ctfshow{daniuniuda}。
6. 如果看不清输出,怎么“看字节真相”
有些终端会把 \x00 直接吞掉,建议用十六进制查看:
1 | ./flag | xxd |
你会看到输出中包含:
63 74 66 73 68 6f 77 7b(即ctfshow{)64 61 6e 69 75 6e 69 75 64 61(即daniuniuda)- 后面有若干
00 - 最后是
7d(即})
所以提交时写可见 flag:ctfshow{daniuniuda}。
7. 汇编逻辑解析(新手友好)
这题本质不是爆破,而是还原字符串。
7.1 ctfshow() 函数在做什么
从汇编能看出它的行为:
printf("ctfshow{")- 循环 16 次,每次
putchar(s[i]) putchar('}')
意思很简单:它把传入的 16 字节按字符打印在大括号中。
7.2 main() 在做什么
main 里先放入几段常量:
41225937923325430303834596513518335287825635894
然后用循环配合 sscanf("%2hhx") 做转换:
- 每次取 2 个十六进制字符。
- 转成 1 个字节。
- 共循环 16 次。
这就是典型的“hex 字符串解码”套路。
7.3 还原出可读内容
这些常量按小端序拼起来对应:
64616e69756e69756461
每 2 位一组转 ASCII:
64 -> d61 -> a6e -> n69 -> i75 -> u6e -> n69 -> i75 -> u64 -> d61 -> a
得到:daniuniuda。
拼上固定前后缀就是:ctfshow{daniuniuda}。
8. 常见报错与解决(Ubuntu 虚拟机)
8.1 gcc: command not found
没装编译器,执行:
1 | sudo apt update |
8.2 flag.s: No such file or directory
你不在文件所在目录,先:
1 | pwd |
确认路径后再 cd 到正确目录。
8.3 Permission denied 运行不了 ./flag
给执行权限:
1 | chmod +x ./flag |
8.4 运行输出有怪字符
正常现象,是 \x00 不可见字符。用 ./flag | xxd 看字节即可。
9. 一次性复现命令(可直接抄)
假设你已经在 flag.s 所在目录:
1 | sudo apt update |
10. 结论
最终提交:
ctfshow{daniuniuda}