2025 0penHarmonyCTF(部分)
PWN
mini-shell
一开始拿到是比较唬人的,本地启动一下就发现程序主进程就是minishell这个二进制文件,而且可以用binwalk直接分离出来二进制文件
cat能执行shellcode,但会将寄存器清空包括rsp,rbp,跟2025vnctf一道题一模一样了
1 | int __fastcall main(int argc, const char **argv, const char **envp) |
cat

exec

一开始是用的mov rsp, fs:[0x300],去恢复栈空间,构造read再读入shellcode,本地确实是通了,远程不通,就去搜了vnctf当时的题,发现了这个很短的shellcode,本地和远程都可以通
1 | from pwn import* |
ezshell(复现)
跟第一题一样,将二进制文件分离出来,首先定位到隐藏函数

检测第一部分!devmode,检测后续参数,sub_40135f中规定了参数的输入格式

1 | _QWORD *__fastcall sub_40135F(__int64 a1, int UMU) |
输入格式为
1 | /61/ #a,二位ascil码 |
ff,bc都可以读取flag


但要想执行这个需要满足v12不为空,就需要利用ad

ea功能就比较重要,就是创建快捷方式,利用shortcut可以创建参数

- 更新 UMU:LODWORD(UMU) = n9 - 1,记录刚添加的快捷方式索引。
- 打印信息:sub_4073F6(可能是 printf)输出“Shortcut %d added: %s\n”,显示索引(n9 - 1)和内容(dst)。
1 | __int64 __fastcall sub_403F9E(__int64 dst) |
sub_40127A 会将 psub_403703 赋值回 sub_403703 此时就可以在直接在 shell 中调用 cat 了
1 | __int64 __fastcall sub_403703(__int64 a1, int a2) |

先提权(个人理解为提权),然后创建好字符串的快捷方式,然后cat调用,但注意,这里对快捷方式有检测,不能是flag字符串,但可以拼接绕过
1 | __int64 __fastcall sub_403703(__int64 a1, int a2) |
没有提权的话会将快捷方式清空,在隐藏命令结尾处
sub_401211

1 | __int64 (__fastcall *sub_401211())() |
最后拼接好获取flag
我这里没有远程环境,也懒得配本地环境了,发现flag读取不出来,但快捷方式确实是创建了,而且也去执行bc部分了

1 | from pwn import* |
第三题也是一个命令执行行,js沙盒,底层只有printf函数,可以执行代码,感觉更像一个web题,可惜了,当时应该找个web佬一块帮忙看的
总结
遇到新型题目不要慌吧,可以去猜,可以去直接练远程去看看,一开始拿到都是懵逼的,本地启动都会遇到问题,就会有放弃的想法,注意定位关键函数位置,可以结合AI去分析,发现AI越来越nb了,华清未央,以及pwno,本人表示用不起
https://www.52pojie.cn/thread-2032638-1-1.html,这个还行,比较费手,整体逻辑可以分析出来
