Skip to content

GNU Debugger

本题考查 GDB 的的使用。

本题开始之前,你可以先参考 0x01. Pwn 环境搭建 来搭建做题环境。若已经安装好 pwndbg(pwndbg 是一个集成到 GDB 调试器中的插件),这里建议使用最原始的 gdb 来完成这道题目。

进入题目附件所在目录,直接运行程序以开始,这里仅对预期解法进行说明。

bash
./gdb_challenge

输入 run <ip> <port> 开始游戏,其中 ipport 通过开启容器得到。

举例

首先要做的就是开启题目容器。

初始容器

nc 后面的 8.147.132.32 就是 IP,而 39543 则是端口,使用 run 8.147.132.32 39543 命令开始游戏。

关卡 1:已验丁真

plaintext
向导:
我放了一个随机数在 'r12' 寄存器里面哦, 你可以借助 GDB 的力量一眼丁真吗?
找到 r12 的 16 进制值就按下 c (continue) 来告诉我答案吧!

需要查看 r12 寄存器的值,这里有很多方法,简单列举其中两个:

  1. info r:显示所有寄存器的值,包括 16 进制以及 10 进制
  2. p/x $r12p 指打印,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 了。