|
| 1 | +--- |
| 2 | +title: DASCTF 2024金秋十月 WhereIsMySauce 出题博客 |
| 3 | +date: 2024/10/22 23:44:00 |
| 4 | +updated: 2024/10/23 19:03:00 |
| 5 | +tags: |
| 6 | + - tricks |
| 7 | +sticky: 90 |
| 8 | +--- |
| 9 | + |
| 10 | +## 前言 |
| 11 | + |
| 12 | +**debuginfod** 是二进制调试当中非常好用的工具,可以从网上自动拉取调试符号和源码, |
| 13 | +无需预先下载好,具体请看[我早前写的博客](/2024/05/08/debuginfod/) |
| 14 | + |
| 15 | +## 出题思路 |
| 16 | + |
| 17 | +题目名叫做`WhereIsMySauce`,小小玩了一个谐音梗,`Sauce`谐音`source`, |
| 18 | +实际上是在暗指flag就放在源码里。由于`debuginfod`是可以分发源码的, |
| 19 | +而源码是最便于显示flag的方式,因此这道题的终极目标就是找到藏有flag的源码 |
| 20 | + |
| 21 | +pwner一般都知道,pwndbg是可以在有调试符号的情况下显示源码的,并且在程序崩溃时会停在崩溃的地方, |
| 22 | +因此这也是我设计的切入点。直接把flag放在顶层文件里有点简单了,于是我设计了让程序崩溃的机制: |
| 23 | +只要不加酱油就崩溃,因此正确做法就是打开debuginfod,并设置服务器为靶机,然后打开gdb, |
| 24 | +直接让程序崩溃即可打印flag(没有pwndbg插件就手动`l`一下) |
| 25 | + |
| 26 | +我对这道题的预期难度是中等甚至简单,最后却只有一位师傅做出来了,也不知道大家卡在哪里了 |
| 27 | + |
| 28 | +wp中也提到了可能存在的坑点是debuginfod的缓存机制,如果先前已经设置过服务器, |
| 29 | +那么debuginfod会在服务器中查找相关符号,未找到则会创建空文件,导致后续就算服务器设置正确, |
| 30 | +debuginfod也不会自动拉取符号,这时候就需要将这题的缓存先清空一下再运行 |
| 31 | + |
| 32 | +```sh |
| 33 | +rm -rf ~/.cache/debuginfod_client/$(readelf -n cook | grep Build | awk '{print $3}') |
| 34 | +echo 'set debuginfod enabled on' >> ~/.gdbinit |
| 35 | +DEBUGINFOD_URLS=$REMOTE gdb cook -q |
| 36 | +r |
| 37 | +6 |
| 38 | +``` |
| 39 | + |
| 40 | + |
| 41 | + |
| 42 | +## 做题之外 |
| 43 | + |
| 44 | +这道题的所有源码可以在[这里](https://github.com/RocketMaDev/CTFWriteup/tree/main/dasx0rays2024/sources/WhereIsMySauce)找到。 |
| 45 | +当时在起server的时候还遇到了点麻烦,要想debuginfod server能提供源代码, |
| 46 | +不能简单将代码放在某个文件夹里,而是必须放在统一的`/usr/src`下, |
| 47 | +只是单单把源码放在家目录下并用`debuginfod -F ~`是无效的,只能分发其中的debuginfo。 |
| 48 | +与此同时,debuginfo中的源代码路径也不能是相对的,必须是绝对路径,以`/usr/src/`开始, |
| 49 | +想用debuginfod来分发源码的师傅可以注意一下。 |
| 50 | + |
| 51 | +## 参考 |
| 52 | + |
| 53 | +[摆脱调试符号的困扰:使用debuginfod拉取libc的调试符号](/2024/05/08/debuginfod/) |
| 54 | + |
0 commit comments