这次比赛我打的一坨,,,两道游戏题目还行,要点脑洞,客服小美卡了我好久,做的时候一直以为我的hmackey和aeskey提取的是错的,导致一直出不来,最后发现是对的,换个脚本就OK了。。

NepBotEvent

ai题,给的log文件喂给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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
import struct

KEY_MAP = {
1: "[ESC]", 2: "1", 3: "2", 4: "3", 5: "4", 6: "5", 7: "6", 8: "7", 9: "8", 10: "9",
11: "0", 12: "-", 13: "=", 14: "[BACKSPACE]", 15: "[TAB]", 16: "q", 17: "w", 18: "e",
19: "r", 20: "t", 21: "y", 22: "u", 23: "i", 24: "o", 25: "p", 26: "[", 27: "]",
28: "\n",
30: "a", 31: "s", 32: "d", 33: "f", 34: "g", 35: "h", 36: "j", 37: "k", 38: "l",
39: ";", 40: "'", 41: "`", 43: "\\", 44: "z", 45: "x", 46: "c", 47: "v", 48: "b",
49: "n", 50: "m", 51: ",", 52: ".", 53: "/",
57: " ",
58: "[CAPSLOCK]"
}

SHIFT_MAP = {
"1": "!", "2": "@", "3": "#", "4": "$", "5": "%", "6": "^", "7": "&", "8": "*",
"9": "(", "0": ")", "-": "_", "=": "+", "[": "{", "]": "}", ";": ":", "'": "\"",
"`": "~", ",": "<", ".": ">", "/": "?", "\\": "|"
}

def decode_keylog(filename):
result = []
shift_pressed = False
capslock_on = False

with open(filename, "rb") as f:
while True:
chunk = f.read(24) # 注意这里是24字节
if len(chunk) < 24:
break

# 事件结构: sec(8B) usec(8B) type(2B) code(2B) value(4B)
sec, usec, etype, code, value = struct.unpack("qqHHI", chunk)

if etype != 1: # 只处理按键事件
continue

# 处理左右Shift键(42左Shift,54右Shift)
if code in (42, 54):
if value == 1:
shift_pressed = True
elif value == 0:
shift_pressed = False
continue

# CapsLock切换(只在按下时切换状态)
if code == 58 and value == 1:
capslock_on = not capslock_on
continue

# 只处理按下事件
if value != 1:
continue

char = KEY_MAP.get(code, '')

if not char:
continue

if char == "[BACKSPACE]":
if result:
result.pop()
continue

if char == "\n":
result.append("\n")
continue

# 忽略其他功能键
if char.startswith('[') and char.endswith(']'):
continue

# 字母大小写处理
if char.isalpha():
if capslock_on ^ shift_pressed:
char = char.upper()
else:
char = char.lower()
else:
# 非字母字符Shift转换
if shift_pressed and char in SHIFT_MAP:
char = SHIFT_MAP[char]

result.append(char)

return ''.join(result)


if __name__ == "__main__":
keylog_file = "NepBot_keylogger" # 请根据实际文件名修改
text = decode_keylog(keylog_file)
print("解析结果:")
print(text)

flag:NepCTF{NepCTF-20250725-114514}

SpeedMino

游戏题,纯玩就行了

bba38fc5b6c2cb94546faed6ca8ac243

NepCTF{You_ARE_SpeedMino_GRAND-MASTER_ROUNDS!_TGLKZ}

MoewBle喵泡

也是游戏题,纯靠技术过关的,一到9都能发现,7是隐藏的

一到九分别是:

1
2
3
4
5
6
7
8
9
1:9472
2:1248-77
3:3d-0
4:b25-
5:0e2
6:d-db
7:隐藏
8:c29
9:9389

然后我们在打的过程中可以发现

屏幕截图 2025-07-26 212318 屏幕截图 2025-07-26 224348

也就是说flag7是隐藏在某个面板里的。

最后我们在esc的那个暂停面板上按上上下下左右左右BABA进入gmmode

面板里getflag 7得到flag7

屏幕截图 2025-07-26 234326

flag:NepCTF{94721248-773d-0b25-0e2d-db9cac299389}

客服小美

一道很有意思的cs题目。考的内容有意思

raw文件用vol分析或者rstudio打开可以的

先分析一下进程

1
vol.py -f DESKTOP.raw --profile=Win10x64_19041 pslist

看到一个这个

1753608277230

一眼可疑进程,而且这个进程的ppid(父进程)是3944,是桌面文件

dump下来得到6492.dmp

如果我们用rstudio打开raw的话可以看到(记得要扫描一下)

屏幕截图 2025-07-27 172931

这里我们能得到用户是

1
JohnDoe

然后还能发现这个木马程序:关于2025年部分节假日安排的通知.exe。

这个木马程序是cs上线的程序,点一下就能上线了。

由此可以看出来,之前的dump是这个木马的dump,这个很重要。

之后我们就要利用这个文件提取aeskey和hmackey。

使用Beta/cs-extract-key.py at master · DidierStevens/Beta提取,还需要一个加密的callback,我们随便找一个就可以

同时,这个192.168.27.132:12500是第二段flag(回连地址)

屏幕截图 2025-07-27 180152
1
python cs-extract-key.py -c 00000040ad0baebef6f64a60ecffdb0594a6f24f90e979d9b5cdecc44649cb939883b77fb1b5e021d59f9234d97ba8384f808f631e6acf73a17b1cb579651454a261ecac 6492.dmp

得到key

屏幕截图 2025-07-27 182923
1
2
AES Key:  a6f4a04f8a6aa5ff27a5bcdd5ef3b9a7
HMAC Key: 35d34ac8778482751682514436d71e09

然后得到这两个东西后正常脚本解密,不建议用cs-parse-http-traffic.py脚本,因为我的报错了出不来

找到submitdata里的加密数据,复制进脚本

先base64

1
2
3
4
5
6
7
8
9
import base64

encode_data = '00000050350ca7f4379f30cc9d6d671db886d360691c74467156e60e8356725ae2f3b880b302ea8b5556df10324e86e53ecb84046646a1758e9cb8c7fca42d660617be467627abcc3c0ce3bd3e93c02fffcb4d3a'
#任务数据

bytes_data = bytes.fromhex(encode_data)
encrypt_data = base64.b64encode(bytes_data)

print(encrypt_data.decode())

再解密(其实就是cs加密过程的反向)

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
import hmac
import binascii
import base64
import hexdump
from Crypto.Cipher import AES

SHARED_KEY = binascii.unhexlify("a6f4a04f8a6aa5ff27a5bcdd5ef3b9a7")
#AES key
HMAC_KEY = binascii.unhexlify("35d34ac8778482751682514436d71e09")
#HMAC key
encrypt_data = "AAAAUDUMp/Q3nzDMnW1nHbiG02BpHHRGcVbmDoNWclri87iAswLqi1VW3xAyToblPsuEBGZGoXWOnLjH/KQtZgYXvkZ2J6vMPAzjvT6TwC//y006"
#任务数据(解密过的)

def decrypt(encrypted_data, iv_bytes, signature, shared_key, hmac_key):
if hmac.new(hmac_key, encrypted_data, digestmod="sha256").digest()[:16] != signature:
print("message authentication failed")
return

cipher = AES.new(shared_key, AES.MODE_CBC, iv_bytes)
return cipher.decrypt(encrypted_data)

encrypt_data = base64.b64decode(encrypt_data)
encrypt_data_length = int.from_bytes(encrypt_data[:4], byteorder='big', signed=False)
encrypt_data_l = encrypt_data[4:]

data1 = encrypt_data_l[:encrypt_data_length-16]
signature = encrypt_data_l[encrypt_data_length-16:encrypt_data_length]
iv_bytes = b"abcdefghijklmnop"

dec = decrypt(data1, iv_bytes, signature, SHARED_KEY, HMAC_KEY)

print("counter: {}".format(int.from_bytes(dec[:4], byteorder='big', signed=False)))
print("任务返回长度: {}".format(int.from_bytes(dec[4:8], byteorder='big', signed=False)))
print("任务输出类型: {}".format(int.from_bytes(dec[8:12], byteorder='big', signed=False)))
print(dec[12:int.from_bytes(dec[4:8], byteorder='big', signed=False)])
print(hexdump.hexdump(dec))

解密就得到第三段flag了:5c1eb2c4-0b85-491f-8d50-4e965b9d8a43

屏幕截图 2025-07-27 184133

flag:NepCTF{JohnDoe_192.168.27.132:12580_5c1eb2c4-0b85-491f-8d50-4e965b9d8a43}