DASCTF 2024金秋十月 WhereIsMySauce 出题博客

DASCTF 2024金秋十月 WhereIsMySauce 出题博客

RocketDev

前言

debuginfod 是二进制调试当中非常好用的工具,可以从网上自动拉取调试符号和源码, 无需预先下载好,具体请看我早前写的博客

出题思路

题目名叫做WhereIsMySauce,小小玩了一个谐音梗,Sauce谐音source, 实际上是在暗指flag就放在源码里。由于debuginfod是可以分发源码的, 而源码是最便于显示flag的方式,因此这道题的终极目标就是找到藏有flag的源码

pwner一般都知道,pwndbg是可以在有调试符号的情况下显示源码的,并且在程序崩溃时会停在崩溃的地方, 因此这也是我设计的切入点。直接把flag放在顶层文件里有点简单了,于是我设计了让程序崩溃的机制: 只要不加酱油就崩溃,因此正确做法就是打开debuginfod,并设置服务器为靶机,然后打开gdb, 直接让程序崩溃即可打印flag(没有pwndbg插件就手动l一下)

我对这道题的预期难度是中等甚至简单,最后却只有一位师傅做出来了,也不知道大家卡在哪里了

wp中也提到了可能存在的坑点是debuginfod的缓存机制,如果先前已经设置过服务器, 那么debuginfod会在服务器中查找相关符号,未找到则会创建空文件,导致后续就算服务器设置正确, debuginfod也不会自动拉取符号,这时候就需要将这题的缓存先清空一下再运行

1
2
3
4
5
rm -rf ~/.cache/debuginfod_client/$(readelf -n cook | grep Build | awk '{print $3}')
echo 'set debuginfod enabled on' >> ~/.gdbinit
DEBUGINFOD_URLS=$REMOTE gdb cook -q
r
6

flag

做题之外

这道题的所有源码可以在这里找到。 当时在起server的时候还遇到了点麻烦,要想debuginfod server能提供源代码, 不能简单将代码放在某个文件夹里,而是必须放在统一的/usr/src下, 只是单单把源码放在家目录下并用debuginfod -F ~是无效的,只能分发其中的debuginfo。 与此同时,debuginfo中的源代码路径也不能是相对的,必须是绝对路径,以/usr/src/开始, 想用debuginfod来分发源码的师傅可以注意一下。

参考

摆脱调试符号的困扰:使用debuginfod拉取libc的调试符号

  • 标题: DASCTF 2024金秋十月 WhereIsMySauce 出题博客
  • 作者: RocketDev
  • 创建于 : 2024-10-22 23:44:00
  • 更新于 : 2024-10-23 19:03:00
  • 链接: https://rocketmadev.github.io/2024/10/22/WhereIsMySauce/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论
目录
DASCTF 2024金秋十月 WhereIsMySauce 出题博客