-
-
[原创]KCTF 第十题:涅槃,亦是新生 wp by SU
-
发表于: 2025-9-3 22:28 358
-
第十题:涅槃,亦是新生
搜索关键词KCTF没有搜到,只好一点点动态调试找逻辑
最后在一个比较大的switch-case中找到核心逻辑

case0逐个双击查看unk可以看到KCTF 2025的字符,后面还有个putchar打印了Flag:
case4里有correct!和Wrong!,需要满足*(a1+4576)==42(由此可知长度为42)

搜索4576字节在case9中发现比较逻辑,相等才++

由此可以合理猜测单字节加密可以尝试爆破,输入42个a、42个b等等,动态调试发现*(a1+4576)确实变化
输入KCTF,发现正确的正好4

很好,下面可以尝试爆破思路,先前的测试发现Wrong错误后并没有退出程序(跟着动态调试会发现卡在一个无限循环上)
此外,要想爆破需要知道每次正确的字符数
所以合理的思路是:
- 在打印完
Wrong!后打印*(a1+4576)的值 - 打印完还需要自己结束程序,否则没法pwntool爆破
第一条的处理方式是查找可以写入输出流的导入函数,在import中最终找到write可以使用


先写汇编代码
1 2 3 4 | mov ecx, 1lea rdx, [rsi+11E0h]mov r8d, 4call __imp__write |
然后找合适点,下图sub_7FF67B3F90E0运行完会打印Wrong!

所以可以nop掉sub_7FF67B3F90E0后面几条指令

然后可以开始右键借助ida插件来写汇编代码


apply patch看下发现确实打印了东西,只是数太小不可见字符

其实到这里不知道啥原因可以自动exit了,如果想额外实现exit直接写call __imp__exit即可
接下来可以开始借助pwntools写自动化爆破,前期测试发现flag格式应该是KCTF{uuid}(全是十六进制字符和-)

可以发现output第一个数就是前几位正确的数,但是有时候
好,上ai辅助完的脚本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | from pwn import *import sysEXE_PATH = r"hardrock_patched1.exe"FLAG_LENGTH = 42CHARSET = "0123456789abcdef-"context.log_level = 'error'context.arch = 'amd64'context.os = 'windows'def main(): known_flag = "KCTF{84e322" for i in range(FLAG_LENGTH): found_char_for_pos = False print(f"[{i + 1}] ") for char_to_test in CHARSET: time.sleep(1) # 貌似不太稳定 test_flag = known_flag + char_to_test print(f"\r[*] 测试: {test_flag}") p = process(EXE_PATH) p.sendline(test_flag.encode()) output = p.recvline() print(output) if int(output[0]) == len(known_flag) + 1: known_flag += char_to_test sys.stdout.write(f"\r{' ' * 80}\r") sys.stdout.flush() print(f"[+] 找到第 {i + 1} 位: '{char_to_test}'") print(f"[+] 当前 Flag: {known_flag}") found_char_for_pos = True break if not found_char_for_pos: print(f"\n[-] 未能找到第 {i + 1} 位的字符,请检查字符集或程序逻辑。") break print("\n" + "="*40) if len(known_flag) == FLAG_LENGTH: print("[+] 爆破成功!") print(f"[+] 完整 Flag: {known_flag}") else: print("[-] 爆破未能完成。") print(f"[+] 已找到部分 Flag: {known_flag}")if __name__ == "__main__": main() |
脚本前几位不太稳定,可以结合output和其他不一样的来试

最终flag为KCTF{84e3229c-310b-4a9b-9977-b20db689d701}
有意愿加入SU的大佬请联系:suers_xctf@126.com
[培训]Windows内核深度攻防:从Hook技术到Rootkit实战!