GNU Debugger
本题考查 GDB 的的使用。
本题开始之前,你可以先参考 0x01. Pwn 环境搭建 来搭建做题环境。若已经安装好 pwndbg(pwndbg 是一个集成到 GDB 调试器中的插件),这里建议使用最原始的 gdb 来完成这道题目。
进入题目附件所在目录,直接运行程序以开始,这里仅对预期解法进行说明。
bash
./gdb_challenge输入 run <ip> <port> 开始游戏,其中 ip 和 port 通过开启容器得到。
举例
首先要做的就是开启题目容器。

nc 后面的 8.147.132.32 就是 IP,而 39543 则是端口,使用 run 8.147.132.32 39543 命令开始游戏。
关卡 1:已验丁真
plaintext
向导:
我放了一个随机数在 'r12' 寄存器里面哦, 你可以借助 GDB 的力量一眼丁真吗?
找到 r12 的 16 进制值就按下 c (continue) 来告诉我答案吧!需要查看 r12 寄存器的值,这里有很多方法,简单列举其中两个:
info r:显示所有寄存器的值,包括 16 进制以及 10 进制p/x $r12:p指打印,x指 16 进制的形式,$指后面的是寄存器

复制后使用 continue 指令 c 让程序继续执行,随后提交即可。
关卡 2:义眼丁真
plaintext
向导:
这次是内存捏, 我留了一句话在某个地方捏.
偷偷告诉你这个地方在哪里 QwQ -> 0x555555557c27
猜猜我要对你说什么。找到了就按下 c (continue) 来告诉我答案吧!这关使用 x 指令来查看内存,使用 x/ 后面加上不同的参数就能用不同的形式来展示内存,这里稍微列举一些:
x按十六进制格式显示变量。o按八进制格式显示变量。s按字符串显示。i显示汇编指令。
使用 x/s 0x555555557c27 查看对应字符串即可。

关卡 3:犹豫丁真
plaintext
向导:
啊,程序中有个函数跑得太快了,他的身上有最后一关的钥匙!我们要抓住他,用 GDB 让他停下来!
如果没能抓住他的话,我们就没办法继续往前走了.
让他停下来拿到钥匙之后,按下一次 c 把钥匙拿过来,然后再次按下 c 继续我们的旅程吧. 注意需要慢慢来,不要按得这么快哦
偷偷告诉你这个函数在 -> 0x555555555779这关需要给函数下一个断点,使用 break 指令 b 即可,注意使用时需要在地址前加上 * 来告诉 GDB 这是一个地址,使用指令:b *0x555555555779.
关卡 4:应用丁真
plaintext
来到最后一关了,由于环境影响,已经听不清楚向导说的话了。
向导:
我们的 '(&(……¥&¥#!¥&……&&!@¥#' 现在只有 1 个.....但是要过关的话一共需要 0xdeadbeef 个
你知道葫芦侠的传说吗,好在 GDB 有一个强大的功能,他可以 *&¥&@34#! 改.
地 $^&!$ 址 -> `0x7fffffffdd04` …*&这关使用 set 指令来修改数据,同样需要在地址前加上 * ,使用指令 set *0x7fffffffdd04 = 0xdeadbeef 即可,最后使用 c 命令让程序继续执行就能看到 FLAG 了。