ᕦʕ •ᴥ•ʔᕤ

第一次 CTF 比赛

前言

算是第一次参加CTF比赛吧:https://2024.justctf.team/ 。找了一个队伍一起做,结果还不错,最终做出来一道简单的逆向题

分析

运行程序后会得到

JCTF COMMANDER v0.1
1. create file
2. rename file
3. print file
4. delete file
5. edit file
6. exit

虚拟了一个文件系统,根据选项可以创建,修改,打印,删除文件等。再把程序放进 IDA 中看一下

函数有很多,而且每个函数里嵌套层数也特别多,很多都是没用的函数。由于我不知道 IDA 中如何清理这些没用的函数,只好用 gdb 从头跑一遍看看都是干啥的,gdb 里也没符号信息,不好下断点

第一个 sub_5840() 的作用是创建文件夹 “fs” 当作虚拟文件系统,后面的一系列方法是将不同选项对应的函数地址赋值到栈上的变量,格式很类似,从 v5 到 v13 。但是注意到程序只给了六个选项,而这里分配了 9 个,那么多出来的三个是什么呢?试验得知 6 和 8 都会报参数错误,7 是一个 archive 选项,9 或其它数字会导致段错误。再进一步观察选项 7,它会调用 system("tar cf "archive_name" *") !解题入口应该就在这里了

从网上搜索得知,如果可以创建文件 --checkpoint=1--checkpoint-action=exec=sh,那么 tar 命令里的 * 就会展开成那两个特殊的文件名并当作 tar 的参数解析,作用就是可以执行 shell。但是创建文件时发现它有一个文件名检查,只能包含字母数字或者 - . ,不能存在 = 或者 \ ,然后卡在这里快一天

后来尝试了创建链接,其它各种参数,不带 = 的写法,都没成功。就在比赛快结束的时候,我突然想到要不试试第 2 个重命名选项吧,结果重命名里没有检查文件名!接下来就简单了,新建文件,重命名文件,最后选择隐藏选项 7,拿到 shell。看来任一个函数都要仔细检查不能跳过

结论

再接再厉