首页
社区
课程
招聘
[原创]KCTF 第十题:涅槃,亦是新生 wp by SU
发表于: 2025-9-3 22:28 358

[原创]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错误后并没有退出程序(跟着动态调试会发现卡在一个无限循环上)

此外,要想爆破需要知道每次正确的字符数

所以合理的思路是:

  1. 在打印完Wrong!后打印*(a1+4576)的值
  2. 打印完还需要自己结束程序,否则没法pwntool爆破

第一条的处理方式是查找可以写入输出流的导入函数,在import中最终找到write可以使用

先写汇编代码

1
2
3
4
mov ecx, 1
lea rdx, [rsi+11E0h]
mov r8d, 4
call __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 sys
 
EXE_PATH = r"hardrock_patched1.exe"
FLAG_LENGTH = 42
 
CHARSET = "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实战!

收藏
免费 1
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回