[ pwn 学习 ] CTFshow-pwn16
2026-08-22 20:36:38

pwn16(没写完

1. 题目目标

已知文件:flag.s(汇编文件)
目标:

  1. 在 Ubuntu 虚拟机里用 gcc 编译成可执行文件。
  2. 运行程序拿到 ctfshow{} 格式的 flag。
  3. 理解它为什么是这个 flag。

2. 最终答案(先给结果)

本题可见 flag:

ctfshow{daniuniuda}

说明:程序会输出 16 个字节,其中后面有若干 \x00(空字符,不可见),所以人眼可见部分就是上面这段。

3. Ubuntu 虚拟机准备(第一次做题必看)

如果你已经有 Ubuntu 虚拟机,直接跳到第 4 节。

推荐环境:

  1. Ubuntu 20.04 / 22.04(64 位)。
  2. 终端(Terminal)。
  3. 已联网(用于安装工具)。

安装编译工具:

1
2
sudo apt update
sudo apt install -y build-essential gdb file binutils

检查是否安装成功:

1
gcc --version

如果能看到 gcc 版本号,说明环境 OK。

4. 把 flag.s 放进 Ubuntu 虚拟机

下面给你最常见的两种方法,选一种就行。

方法 A:共享文件夹(推荐)

  1. 在虚拟机软件里设置共享目录(把 Windows 放 flag.s 的目录共享给 Ubuntu)。
  2. 进入 Ubuntu 终端,创建题目目录:
1
2
mkdir -p ~/ctfshow/pwn16
cd ~/ctfshow/pwn16
  1. 从共享目录复制文件(把 YOUR_SHARE_NAME 换成你的共享名):
1
cp /media/sf_YOUR_SHARE_NAME/flag.s ~/ctfshow/pwn16/

方法 B:直接拖拽

  1. flag.s 从主机拖到 Ubuntu 桌面。
  2. 打开终端:
1
2
3
mkdir -p ~/ctfshow/pwn16
mv ~/Desktop/flag.s ~/ctfshow/pwn16/
cd ~/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

你会看到输出中包含:

  1. 63 74 66 73 68 6f 77 7b(即 ctfshow{
  2. 64 61 6e 69 75 6e 69 75 64 61(即 daniuniuda
  3. 后面有若干 00
  4. 最后是 7d(即 }

所以提交时写可见 flag:ctfshow{daniuniuda}

7. 汇编逻辑解析(新手友好)

这题本质不是爆破,而是还原字符串。

7.1 ctfshow() 函数在做什么

从汇编能看出它的行为:

  1. printf("ctfshow{")
  2. 循环 16 次,每次 putchar(s[i])
  3. putchar('}')

意思很简单:它把传入的 16 字节按字符打印在大括号中。

7.2 main() 在做什么

main 里先放入几段常量:

  1. 4122593792332543030
  2. 3834596513518335287
  3. 825635894

然后用循环配合 sscanf("%2hhx") 做转换:

  1. 每次取 2 个十六进制字符。
  2. 转成 1 个字节。
  3. 共循环 16 次。

这就是典型的“hex 字符串解码”套路。

7.3 还原出可读内容

这些常量按小端序拼起来对应:

64616e69756e69756461

每 2 位一组转 ASCII:

  1. 64 -> d
  2. 61 -> a
  3. 6e -> n
  4. 69 -> i
  5. 75 -> u
  6. 6e -> n
  7. 69 -> i
  8. 75 -> u
  9. 64 -> d
  10. 61 -> a

得到:daniuniuda

拼上固定前后缀就是:ctfshow{daniuniuda}

8. 常见报错与解决(Ubuntu 虚拟机)

8.1 gcc: command not found

没装编译器,执行:

1
2
sudo apt update
sudo apt install -y build-essential

8.2 flag.s: No such file or directory

你不在文件所在目录,先:

1
2
pwd
ls

确认路径后再 cd 到正确目录。

8.3 Permission denied 运行不了 ./flag

给执行权限:

1
2
chmod +x ./flag
./flag

8.4 运行输出有怪字符

正常现象,是 \x00 不可见字符。用 ./flag | xxd 看字节即可。

9. 一次性复现命令(可直接抄)

假设你已经在 flag.s 所在目录:

1
2
3
4
5
sudo apt update
sudo apt install -y build-essential
gcc flag.s -o flag
./flag
./flag | xxd

10. 结论

最终提交:

ctfshow{daniuniuda}


相关笔记

  • pwn13 — GCC 编译 + ASCII 码转换
  • pwn14 — C 编译 + 文件中的二进制数据处理
  • pwn15 — 汇编 sys_write 系统调用 + nasm 工具链
  • pwn5 — ELF / 汇编基础概念
上一页
2026-08-22 20:36:38
下一页