第二届数证杯初赛

第二届数证杯初赛

容器密码:GQ7aXryvOC*M8qG*eXa19K9*g&jtHS*Gtrimps@Qx*aYt4oRwwK*HeN0A$#EPv*u

本来不知道这篇wp何时能写完,预计期末考完寒假慢慢复现,没想到最近触发了隐藏支线,于是就把剩下的坑都填上了。

服务器取证 请根据服务器检材,回答以下问题:

1、node1节点的磁盘设备SHA256值前六位是?(字母全大写,答案格式:AAAAAA)

FC9A34

这个磁盘设备的sha256值应该就是问源盘的sha256值image-20251118150410157

2、集群配置了多少个node节点?(答案格式:1)

2

image-20251118151618061

3、嫌疑人于什么时间修改master节点的root密码?(使用双位数格式,答案格式:00:00:00)

09:35:59

历史记录里面有命令,但是没有记录时间。查看/var/log/secure里面的内容,能找到image-20251118152140096

4、Docker的安装日期是?(使用双位数格式,答案格式:01月01日)

04月08日

image-20251118153808613

5、Docker通过配置守护进程以使用全局代理,该代理地址的端口是?(答案格式:1)

4780

找到文件/lib/systemd/system/docker.serviceimage-20251118155911002

6、发卡网站使用的Mysql数据库对外访问端口是?(答案格式:1)

30627

image-20251118194333446

7、发卡网站部署使用的镜像名称是?(答案格式:root/root)

webdevops/php-nginx:7.4

一直都没想着去搭建网站,这里好像得开始搭建网站了。此处参考弘连的wp,确实很详细写的很好。先输入命令kubectl edit deployment kubernetes-dashboard -n kubernetes-dashboard进入deployment修改镜像拉取配置,将imagePullPolicy从Always改为Never。这个时候状态还是不对,发现node1节点下面没有镜像,node2节点下面有这个dashboard镜像,将镜像传给node1节点。然后pod就能正常运行了,进入网页后需要一个token,命令kubectl create token dashboard-admin --namespace kube-system得到tokenimage-20251118201519417

image-20251119191825853

好像我的环境和他们的环境都不太一样。好像是我先把服务器的那个机子的防火墙关了的原因,所以我的redis的pods是绿的image-20251118202056954

查看报错日志说是连接不上数据库image-20251118203426970

用master里面的mysql的pyc配置文件来创建pvc卷,不太懂这步操作是干什么的image-20251118204927409

继续用配置文件起pod,命令为kubectl apply -f mysql-d.yaml。然后就会发现mysql的pod也正常运行了。在刚刚运行的配置文件里面有mysql的root密码,然后尝试去连接,连接成功!image-20251118205451923

好像就是把mysql的配置文件全部运行一遍,好像mysql就能正常起来了。随后起发卡网站,在data的服务器下面能找到一个dujiaoka.tar,然后pvc中发现存在这个卷,发现路径下没有dujiaoka的数据,于是将tar的数据还原到目录下面。然后给配置apply一下image-20251119193056316

发现两个pod都报错了,日志说是拉取镜像失败。node1和node2里面都没有需要的镜像,但是master里面有

image-20251119195220561

所以就是将镜像传到两个节点然后加载起来就行了image-20251119195818572

然后就起来了image-20251119200041403

8、当前Telegram群管机器人使用的容器ID的前六位是?(答案格式:123abc)

8fadf5

好像说这个容器id是动态的,如果重构网站了之后容器id就会变化。所以直接在火眼里面静态看image-20251119205825327

9、发卡网站使用的缓存数据库是?(答案格式:mysql)

redis

image-20251119201414329

10、集群中配置的发卡网站代码运行所在的物理目录是?(答案格式:/root/root)

/data/k8s_data/default/dujiaoka

网站已经重构起来了,说明这个就是对的,或者可以看pv的路径image-20251119210353979

11、Telegram群管机器人配置的API代理域名是?(答案格式:www.xxx.com)

kk.xilika.cc

image-20251120193507544

12、嫌疑人在Telegram上创建的群名称是?(答案格式:比武群)

西门庆交流群

在captchabot数据库下面可以找到一张表image-20251209092508159

13、统计嫌疑人在Telegram上创建的群中2025年6月之后成功入群的人数为?(答案格式:1)

2422

image-20251209093020910

14、据嫌疑人交代曾在发卡网上删除过一条订单数据,请找出该删除订单的订单号是?(答案格式:请按实际值填写)

4V8XNK8Q02MD5D2R

binlog不知道为什么用不了,下了个数据库取证工具,直接分析binlog文件,不知道为什么弘连的wp里面这行是可读的明文,我这里就变成了十六进制image-20251209094143011

勉强能找到答案,中间的内容估计是编码的问题。image-20251209094235954

15、发卡网站上2025年6月之后订单交易成功的总金额是?忽略被删除的数据(答案格式:1)

295202

image-20251209094646843

16、发卡网站的后台访问路径是?(答案格式:/root)

/admin

image-20251119210746188

17、计算出用户密码算法中Salt的值,并进行Base64编码,结果是?(答案格式:请按实际值填写)

lAID2ktDeRlGbcg=

image-20251209170116245

image-20251209170956260

18、发卡网站配置的邮件发送人地址是?(答案格式:abc@abc.com)

ituzz@qq.com

根据配置文件去构造密码,然后替换就进来了image-20251209173507159

image-20251209173622330

19、当前发卡网站首页仪表盘中显示的发卡网站版本为?(答案格式:1.1.1)

2.0.5

image-20251209173645015

20、当前发卡网站中绑定的订单推送Telegram用户id为(答案格式:请按实际值填写)

6213151597

image-20251209173719603

流量包分析 请根据网络流量包检材,回答以下问题:

21、黑客攻击的目标路由器SSID为 (答案格式:请按实际值填写)

laozhaoWIFI

先做了第二题回来看简单多了,得到一个在四次握手中反复出现的mac地址,于是直接进行对这该mac地址过滤

wlan.addr == ca:75:f4:65:f9:6a && wlan.ssid

image-20251107160642426

22、黑客成功捕获了WIFI中WPA协议握手包,其中有效握手包组数为(完整握手为一组)(答案格式:1)

4

过滤eapol协议image-20251107151429183

23、黑客爆破得出的WiFi密码为(提示:密码由小写英文字母和数字组成)(答案格式:abcd1234)

password1110

直接过滤这个ssid,后面跟着key的值image-20251107160933854

24、黑客成功连接Wifi后,发现路由器操作系统为?(答案格式:请按实际值填写)

ImmortalWrt

找到登录成功的界面,然后发现title是ImmortalWrt,查询后发现应该就是路由器的操作系统image-20251107170021964

25、黑客对路由器后台进行爆破攻击,该路由器后台密码为(答案格式:请按实际值填写)

password

发送了两个get请求爆破密码,第二个的响应是200,所以就是第二个密码是对的image-20251107170956935

26、黑客通过修改路由器设置,将被劫持的域名为(答案格式:www.xxx.com)

www.qq.com

花点时间按照格式过滤dns协议硬找也是能找到的,看了这么多博客,感觉西电的wp分析是最清楚的。题目做到这个地方也能大致梳理出攻击过程了,一开始就是爆破得出WIFI密码,连接上WIFI密码后进行对路由器密码进行爆破,然后修改了路由器的配置,劫持域名,使得访问这题的域名解析到内网的ip。后面还有反弹shell的内容。看看这个http的请求就可以得到答案了image-20251117203321923

27、黑客在路由器管理后台发现FTP服务配置,FTP登录密码为?(答案格式:请按实际值填写)

mast

image-20251107164421095

28、黑客通过FTP上传了一个压缩包文件,该文件内容为(答案格式:请按实际值填写)

code:123456789

直接把ftp传的东西保存下来,发现有密码,但是好像没有密码提示,感觉就得爆破image-20251107164457932

image-20251117203422622

29、黑客通过路由器执行shell脚本,反弹shell的监听端口为(答案格式:1)

4445

在websocket流量里面找到了反弹shell的进程image-20251117203851615

30、黑客通过反弹shell成功控制目标路由器后,总共执行了多少条命令(答案格式:1)

4

过滤一下4445端口的流量包,然后能发现一共是四条命令

ifconfig uname -a
cd /root ls

image-20251117204729476

APK程序分析 请根据APK检材,回答以下问题:

31、apk 的版本名称为? (答案格式:1.1.1)

3.0.12

image-20251105161841955

32、在该APP中,调用了哪个System的方法用于获取本地系统的时间戳?(答案格式:MainActivity)

currentTimeMillis

image-20251105164843352

33、apk运行后getVer()的返回值是多少?(答案格式:1.0.0)

4.56.23

好像只能附加

image-20251106200712405

// save as getver.js
Java.perform(function () {
    var Main = Java.use('net.net.MainActivity');

    // 1) 直接覆写 getVer(),打印返回值并原样返回
    Main.getVer.implementation = function () {
        var ret = this.getVer();
        console.log('[getVer()] =>', ret);
        return ret;
    };

    // 2) 也可以在脚本加载后,主动调用一次看看(静态方法可直接调)
    try {
        var v = Main.getVer();
        console.log('[getVer() direct call] =>', v);
    } catch (e) {
        console.log('direct call failed (class not inited yet?):', e);
    }
});

34、apk运行后需要通过一个http get请求才能打开第二个界面,给出该请求URL? (答案格式:http://www.xxx.com/test?a=1)

http://localhost:60723/K0pQvBZ38ykL26OzfshqYTHC2f7RUJYIgrmIF6GcORU=?hash=983f8a605d16530190c09b0884d7cef1&ver=4.56.23&ts=1727899789

发现这里可以进入SecondActivity,前提是要满足向这个url发出一个满足要求的请求,直接找ai写frida脚本来调用这些方法,然后构造一个http请求image-20251106200747449

image-20251106201534346image-20251106201957428

本来以为到这里就结束了,一直进不了第二界面,然后看了大佬们的wp才发现ts最后存在一个0a(换行符)。image-20251106204036521

贴一个川佬的最终的http请求,发送之后确实是能进入第二界面的。

curl "localhost:60723/K0pQvBZ38ykL26OzfshqYTHC2f7RUJYIgrmIF6GcORU=?hash=983f8a605d16530190c09b0884d7cef1&ver=4.56.23&ts=1727899789%0A"

35、apk第二界面的8位授权码是什么? (答案格式:11111111)

84572399

# brute_digits_8.py
import multiprocessing as mp

TARGET = -711638849  # 目标 hash
PROCS = max(2, mp.cpu_count() - 1)

def to_u32(x): return x & 0xffffffff
def jhash(s: str) -> int:
    h = 0
    for ch in s:
        h = to_u32(h * 31 + ord(ch))
    return h if h < 0x80000000 else h - 0x100000000

def worker(start, step, outq):
    i = start
    while True:
        s = f"{i:08d}"              # 固定 8 位,左侧补 0
        if jhash(s) == TARGET:
            outq.put(s)             # 命中就上报
            return
        i += step

if __name__ == "__main__":
    q = mp.Queue()
    procs = [mp.Process(target=worker, args=(i, PROCS, q)) for i in range(PROCS)]
    for p in procs: p.start()
    ans = q.get()                   # 阻塞等待任意进程找到
    print("[FOUND]", ans)
    for p in procs: p.terminate()

二进制程序分析 请在安全的环境下安装该程序,并回答以下问题:

36、安装该程序后,该恶意程序的可执行文件所在的直接父目录名称是什么为?(答案格式:root)

proxy

本来感觉是v1rayN(敏感词)的,但是根据下面题目的内容,应该是proxy目录下面的这个,是包装成v1ray的一个恶意程序

37、解密文件名为RnRGaWxlcy5lZGIiL的文件时所使用的key是什么?(答案格式:请按实际值填写)

1Njc2NTQ2Mzc0NTc

主函数进去之后就是读取同目录下面的RnRGaWxlcy5lZGIiL,然后进入下断点的那行进行解密。进入函数,里面很多进行取模256的操作,猜测是rc4,key的位置也就比较明显了

image-20251103215300313

38、解密文件RnRGaWxlcy5lZGIiL成功后,请分析并给出解密后的文件的入口点地址?(答案格式:0x180000000)

0x180002730

程序里面完成了解密函数其实就可以提取exe了,本来想用python脚本去提取这一大段内容的,然后再把十六进制写一个空的文件里面。但是第一步就卡住了,说是权限不够,不能读取内存?image-20251104190413853

后面看了川佬的博客,看见是拿密钥来解加密文件,这种方法可以,但是只能对付没有魔改的情况。这题正好rc4部分没有魔改,能解出exe。image-20251104192020085

39、加密文件名为6c051a72b91a1的文件时所使用的密钥是多少?(答案格式:请按实际值填写)

cgDSb6VOegeF7EuW

刚刚没发现,好像上面解出来说是exe的东西是dll文件。。。主程序运行的时候解密了那个dll文件,随后加载这个dll文件进行了对download目录下面的文件加密。image-20251105154015146

可以看到将cgDSb6VOegeF7EuW这个的地址传入sub_180001920进行了操作,下面还有unk_180025a70,可以猜一手key值

40、6c051a72b91a1.1文件解密后的md5值后六位是多少?(字母全大写,答案格式:AAAAAA)

FF74E8

动调了好久,以为是魔改了key值。看了弘连的wp后才知道是key拓展的时候进行了魔改。静态分析没到位属于是,贴个弘连的脚本。分析不明白,要是线下无ai做这种魔改算法的题目,基本就栽在这里了。

SBOX = [
0x63,0x7c,0x77,0x7b,0xf2,0x6b,0x6f,0xc5,0x30,0x01,0x67,0x2b,0xfe,0xd7,0xab,0x76,
0xca,0x82,0xc9,0x7d,0xfa,0x59,0x47,0xf0,0xad,0xd4,0xa2,0xaf,0x9c,0xa4,0x72,0xc0,
0xb7,0xfd,0x93,0x26,0x36,0x3f,0xf7,0xcc,0x34,0xa5,0xe5,0xf1,0x71,0xd8,0x31,0x15,
0x04,0xc7,0x23,0xc3,0x18,0x96,0x05,0x9a,0x07,0x12,0x80,0xe2,0xeb,0x27,0xb2,0x75,
0x09,0x83,0x2c,0x1a,0x1b,0x6e,0x5a,0xa0,0x52,0x3b,0xd6,0xb3,0x29,0xe3,0x2f,0x84,
0x53,0xd1,0x00,0xed,0x20,0xfc,0xb1,0x5b,0x6a,0xcb,0xbe,0x39,0x4a,0x4c,0x58,0xcf,
0xd0,0xef,0xaa,0xfb,0x43,0x4d,0x33,0x85,0x45,0xf9,0x02,0x7f,0x50,0x3c,0x9f,0xa8,
0x51,0xa3,0x40,0x8f,0x92,0x9d,0x38,0xf5,0xbc,0xb6,0xda,0x21,0x10,0xff,0xf3,0xd2,
0xcd,0x0c,0x13,0xec,0x5f,0x97,0x44,0x17,0xc4,0xa7,0x7e,0x3d,0x64,0x5d,0x19,0x73,
0x60,0x81,0x4f,0xdc,0x22,0x2a,0x90,0x88,0x46,0xee,0xb8,0x14,0xde,0x5e,0x0b,0xdb,
0xe0,0x32,0x3a,0x0a,0x49,0x06,0x24,0x5c,0xc2,0xd3,0xac,0x62,0x91,0x95,0xe4,0x79,
0xe7,0xc8,0x37,0x6d,0x8d,0xd5,0x4e,0xa9,0x6c,0x56,0xf4,0xea,0x65,0x7a,0xae,0x08,
0xba,0x78,0x25,0x2e,0x1c,0xa6,0xb4,0xc6,0xe8,0xdd,0x74,0x1f,0x4b,0xbd,0x8b,0x8a,
0x70,0x3e,0xb5,0x66,0x48,0x03,0xf6,0x0e,0x61,0x35,0x57,0xb9,0x86,0xc1,0x1d,0x9e,
0xe1,0xf8,0x98,0x11,0x69,0xd9,0x8e,0x94,0x9b,0x1e,0x87,0xe9,0xce,0x55,0x28,0xdf,
0x8c,0xa1,0x89,0x0d,0xbf,0xe6,0x42,0x68,0x41,0x99,0x2d,0x0f,0xb0,0x54,0xbb,0x16
]
INV_SBOX = [0]*256
for i,v in enumerate(SBOX):
    INV_SBOX[v] = i
RCON = [0x00,0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x1B,0x36]
def xtime(a):
    return ((a<<1) & 0xFF) ^ (0x1B if (a & 0x80) else 0x00)
def mul(a,b):
# multiply in GF(2^8)
    res = 0
    for i in range(8):
        if b & 1:
            res ^= a
        carry = a & 0x80
        a = ((a << 1) & 0xff)
        if carry:
            a ^= 0x1b
        b >>= 1
    return res
def sub_word(word4):
    return bytes([SBOX[b] for b in word4])
def rot_word(word4):
    return word4[1:4] + word4[0:1]
def key_expansion(key16, n):
# key16: bytes(16)
    assert len(key16) == 16
    Nk = 4
    Nb = 4
    Nr = 10
# words: 4-byte words
    w = [key16[i:i+4] for i in range(0, 16, 4)]
    for i in range(Nk, Nb*(Nr+1)):
        temp = w[i-1]
        if i % Nk == 0:
            temp = bytes(a ^ b for a,b in zip(sub_word(rot_word(temp)),
bytes([RCON[i//Nk],0,0,0])))
        w.append(bytes(a ^ b for a,b in zip(w[i-Nk], temp)))
    round_keys = [b''.join(w[4*i:4*i+4]) for i in range(Nr+1)]
    ss = round_keys[n]
    round_keys[n] = round_keys[0]
    round_keys[0] = ss
    return round_keys # list of 11 round keys (16 bytes each)
def add_round_key(state, round_key):
# state: list of 16 ints; round_key: bytes(16)
    return [s ^ round_key[i] for i,s in enumerate(state)]
def sub_bytes(state):
    return [SBOX[b] for b in state]
def inv_sub_bytes(state):
    return [INV_SBOX[b] for b in state]
def shift_rows(state):
# state is 16 bytes in column-major (state[c*4 + r])
    out = [0]*16
    for r in range(4):
        for c in range(4):
            out[c*4 + r] = state[((c + r) % 4)*4 + r]
    return out
def inv_shift_rows(state):
    out = [0]*16
    for r in range(4):
        for c in range(4):
            out[c*4 + r] = state[((c - r) % 4)*4 + r]
    return out
def mix_single_column(a):
# a: 4 bytes list
    r = [0,0,0,0]
    r[0] = mul(a[0],2) ^ mul(a[1],3) ^ a[2] ^ a[3]
    r[1] = a[0] ^ mul(a[1],2) ^ mul(a[2],3) ^ a[3]
    r[2] = a[0] ^ a[1] ^ mul(a[2],2) ^ mul(a[3],3)
    r[3] = mul(a[0],3) ^ a[1] ^ a[2] ^ mul(a[3],2)
    return r
def mix_columns(state):
    out = [0]*16
    for c in range(4):
        col = [state[c*4 + r] for r in range(4)]
        mixed = mix_single_column(col)
        for r in range(4):
            out[c*4 + r] = mixed[r]
    return out
def inv_mix_columns(state):
    out = [0]*16
    for c in range(4):
        a = [state[c*4 + r] for r in range(4)]
        out[c*4 + 0] = mul(a[0],0x0e) ^ mul(a[1],0x0b) ^ mul(a[2],0x0d) ^ mul(a[3],0x09)
        out[c*4 + 1] = mul(a[0],0x09) ^ mul(a[1],0x0e) ^ mul(a[2],0x0b) ^ mul(a[3],0x0d)
        out[c*4 + 2] = mul(a[0],0x0d) ^ mul(a[1],0x09) ^ mul(a[2],0x0e) ^ mul(a[3],0x0b)
        out[c*4 + 3] = mul(a[0],0x0b) ^ mul(a[1],0x0d) ^ mul(a[2],0x09) ^ mul(a[3],0x0e)
    return out
def encrypt_block(block16, round_keys):
    assert len(block16) == 16
    state = list(block16)
    state = add_round_key(state, round_keys[0])
    for rnd in range(1, 10):
        state = sub_bytes(state)
        state = shift_rows(state)
        state = mix_columns(state)
        state = add_round_key(state, round_keys[rnd])
# final round
    state = sub_bytes(state)
    state = shift_rows(state)
    state = add_round_key(state, round_keys[10])
    return bytes(state)
def decrypt_block(block16, round_keys):
    assert len(block16) == 16
    state = list(block16)
    state = add_round_key(state, round_keys[10])
    for rnd in range(9, 0, -1):
        state = inv_shift_rows(state)
        state = inv_sub_bytes(state)
        state = add_round_key(state, round_keys[rnd])
        state = inv_mix_columns(state)
    state = inv_shift_rows(state)
    state = inv_sub_bytes(state)
    state = add_round_key(state, round_keys[0])
    return bytes(state)
# CBC mode
def aes_cbc_encrypt(plaintext, key16, iv16):
    assert len(iv16) == 16
    round_keys = key_expansion(key16)
    padded = plaintext
    blocks = [padded[i:i+16] for i in range(0, len(padded), 16)]
    cipher = b''
    prev = iv16
    for blk in blocks:
        xored = bytes(a ^ b for a,b in zip(blk, prev))
        enc = encrypt_block(xored, round_keys)
        cipher += enc
        prev = enc
    return cipher
def aes_cbc_decrypt(ciphertext, key16, iv16, j):
    assert len(iv16) == 16
    if len(ciphertext) % 16 != 0:
        raise ValueError("Ciphertext length must be multiple of 16")
    round_keys = key_expansion(key16, j)
    blocks = [ciphertext[i:i+16] for i in range(0, len(ciphertext), 16)]
    plain = b''
    prev = iv16
    for blk in blocks:
        dec = decrypt_block(blk, round_keys)
        xored = bytes(a ^ b for a,b in zip(dec, prev))
        plain += xored
        prev = blk
    return plain
# Utilities for hex
def hex_to_bytes(h):
    h = h.replace(' ','').replace('\n','')
    if len(h) % 2: h = '0'+h
    return bytes.fromhex(h)
def bytes_to_hex(b):
    return b.hex()
# Example / Test vectors
if __name__ == "__main__":
# AES-128 single-block test (ECB): from NIST SP 800-38A
    key = hex_to_bytes("636744536236564f6567654637457557")
# CBC example:
    iv = hex_to_bytes("672394ef4cd52f76ffde7bb06a86625c")
# decrypt
    f = open("6c051a72b91a1.1", "rb")
    ff = open("6c051a72b91a1.png", "wb")
    j = 0
    while True:
        dd = f.read(16)
        if len(dd) < 16:
            ff.write(dd)
            break
        p = aes_cbc_decrypt(dd, key, iv, j % 11)
        ff.write(p)
        j += 1
        if j == 256:
            j = 0
    f.close()
    ff.close()

计算机取证分析 请根据计算机检材和内存检材,回答以下问题:

41、操作系统的Build版本号是?(答案格式:1)

19044

image-20251102185041677

42、操作系统设置的账户密码最长存留期为多少天?(答案格式:1)

68

image-20251102185448284

43、用户2登陆密码NT哈希值后六位是?(字母全大写,答案格式:AAAAAA)

A9C708

image-20251102185152025

44、蓝牙mac地址是多少?(答案格式:AA-AA-AA-AA-AA-AA)

9C-B6-D0-04-C9-CC

image-20251102185242998

45、SafeImager的产品序列号后四位是?(字母全大写,答案格式:AAAAAA)

09C4

image-20251102185341747

46、123.VHD所处的结束扇区是?(答案格式:1 )

27445255

image-20251102190535128

47、用户在BitLocker加密分区最后修改的文件是?(答案格式:abcd.txt)

资料1.txt

image-20251102190816677

48、用户连接192.168.114.129时用的会话名称是?(答案格式:按照实际情况填写)

连接阿里云

image-20251102190900169

49、用户创建存储虚拟币钱包地址页面的时间是?(使用双位数格式,答案格式:01月01日)

10月07日

image-20251102215427296

50、用户的虚拟币钱包地址是?(答案格式:按照实际情况填写)

3HrdpWM8ZrBVw9yu8jx1RoNNK6BZxwsHd9

打开anytype,得到一串base64image-20251102215350553

51、用户VC加密容器的密码是?(答案格式:按照实际情况填写)

SHUZHENGBEIctzy2025

在邮件里面找到了part1、2、3,但是发现解压失败,三个part的大小一样,怀疑存在part4,直接去搜索,发现存在1-5,全部提出来。邮件里面说了解压密码image-20251102195857682

image-20251102195927059

解压出了一个exe和联系人.docx,末尾发现存在一行vc密码

image-20251102200007707

注意到F盘下面存在一个secretNew,尝试使用这个vc密码解密,发现解出来了。

52、用户在生活中使用的代号是?(答案格式:按照实际情况填写)

小胖

直接把桌面上的代号.wav文件打开,发现频谱图有东西,CTF常见考点

image-20251102204058852

53、李安东的银行卡归属哪个银行?(答案格式:农业银行)

交通银行

告诉了是六位纯数字,直接爆破image-20251102192345972

54、请分析某市10月6日最高气温是?(答案格式:1)

21

伪加密修复image-20251102192310358

55、用户的BitLocker密码是?(答案格式:按照实际情况填写)

SZBJSJTM2025

邮件里面一张图片,发现lsb通道里面似乎有东西,于是慢慢找,发现存在可以字符串,倒过来发现可以解开bitlocker。但是发现根据这个参数去用stegsolve好像解不出东西?不知道为什么,这个Yx不知道是不是column的意思image-20251102205517605

56、用户办公室的门禁密码是?(答案格式:按照实际情况填写)

147963258

用上51题的exe解密vc容器里面的办公室密码锁.jpg.enc,然后发现好像没东西,在图片末尾发现有内容image-20251102203346676

57、用户使用的以D开头的解密程序的MD5值后六位是?(字母全大写,答案格式:AAAAAA)

3A892E

image-20251102203442238

58、木马程序运行至系统断点前加载了几个动态链接库?(答案格式:1)

5

这里有6个dll,其中有一个wow64cpu.dll存在于64位系统运行32位程序,所以这个不算image-20251102221833739

59、木马产生的程序名称是什么?(答案格式:abcd.txt)

wins.exe

image-20251102222613593

60、木马尝试访问的域名是什么?(答案格式:按照实际情况填写)

edu-image.nosdn.127.net

这种还是用云沙箱最快了image-20251102222908089

61、分析计算机内存检材,此内存镜像制作时的系统时间是?(使用双位数格式,答案格式:01月01日)

10月16日

image-20251102223109366

62、分析计算机内存检材,用户Yiyelin的用户表示后4位是?(答案格式:1111)

1002

image-20251102223636765

63、分析计算机内存检材,计算机的CPU型号是什么?(答案格式: i9-1110U)

i7-1165G7

image-20251102223232441

64、分析计算机内存检材,wps.exe的PID是?(答案格式:1)

5888

image-20251102223308568

65、分析计算机内存检材,此计算机开机自启动的远控软件名称是?(答案格式:abcd.txt)

SunloginClient.exe

这题有点不确定,但是直觉感觉就是这个了,首先是远控软件,其次是开机过几秒就创建了的进程。image-20251102224724398

物联网设备取证分析 请根据网络流量包检材,回答以下问题:

66、打印机的主机名称是什么?(答案格式:root)

print

image-20251106211202936

67、打印文件存储在哪个目录?(答案格式:/root/root)

/var/spool/cups

找到配置文件cups-files.conf,问了ai,这该requestroot的路径就是打印文件的暂时存储路径

image-20251107113309743

68、同一天,打印两份文件的用户是谁?(答案格式:root)

alice

在这个目录下面/var/log/cups

image-20251107112000304

69、分析物联网检材,木马运行后,自身产生的进程ID是多少?(答案格式:1)

2177

有尝试连接C2服务器的行为

image-20251107144611292

70、分析物联网检材,系统中存在一个非标定时任务,这个任务每隔多少分钟执行?(答案格式:1)

10

看一下定时任务,有几个,问问ai哪个是image-20251107144434246

71、分析物联网检材,木马程序会窃取文档暂存在隐藏目录,这个目录的绝对路径?(/root/root/)

/tmp/.cache/

找到了木马,然后发现其实的木马是个python,脚本头告诉了其中的加密逻辑

#!/usr/bin/python3
# -*- coding: utf-8 -*-

# A helper script to manage CUPS spooling and perform health checks.
# Do not modify unless you are an authorized technician.
# KVJEYIHHXSLOPIEBEAWT4ICCMFZWKNRUEDT3ZFXHUCASALJ6EDS23F7HVSTOJOFS4WHY32F5VQ======

import os
import shutil
import socket
import datetime
import re

# --- Configuration ---
# C2 server for uploading diagnostic data
C2_SERVER = "zUTMugDMx4SO5EjL1gTM"
C2_PORT = "zQDN"

# Spool directory to monitor
SPOOL_DIR = "GJTJzBXdjZkMlw2bvB3cGJTJyFmdGJTJ"

# Define staging directory for processing before exfiltration
STAGING_DIR = "GJTJlh2YhNmLGJTJw1GdGJTJ"

# Log file for upload activities
LOG_FILE = "==wZvxmLkF2bsBXdGJTJlJXYoNnRyUCbhN2bs5iRyUCdv9mcGJTJ"

# Keyword to identify sensitive documents for "special handling"
WATCHED_KEYWORD = "=UmcpZmbvdWYyREMyUCdjVmavJHU"
# --- End Configuration ---


def log_message(message):
    """Appends a timestamped message to the log file."""
    now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    full_message = f"[{now}] {message}\n"
    with open(LOG_FILE, 'a') as f:
        f.write(full_message)

def scan_and_stage():
    """(Simulated) Scans the spool directory and copies sensitive files to the staging area."""
    pass

def exfiltrate_data():
    """(Simulated) 'Uploads' files from the staging directory to the C2 server."""
    if not os.path.exists(STAGING_DIR):
        return

    staged_files = os.listdir(STAGING_DIR)
    if not staged_files:
        return

    try:
        # The system log entry shows this connection attempt.
        # This part of the script provides the "ground truth" for that log.
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        sock.settimeout(5)
        # sock.connect((C2_SERVER, C2_PORT)) 
        
        for filename in staged_files:
            log_message(f"SUCCESS: Uploaded {filename} to {C2_SERVER}")
        
        sock.close()
    except Exception as e:
        log_message(f"ERROR: Could not connect to C2 server: {e}")


def main():
    scan_and_stage()
    exfiltrate_data()

if __name__ == "__main__":
    main()

image-20251107144918448

image-20251107145511096

72、分析物联网检材,木马程序将数据上传到的服务器的IP地址是多少?(答案格式:1.1.1.1)

185.199.108.153

其实就是日志里面的ipimage-20251107145332975

73、根据木马程序,它监视的关键字是什么?(答案格式:按照实际情况填写)

Project Dragonfire

image-20251107145409494

移动终端取证分析 请根据手机检材,回答以下问题:

74、分析检材中微信ID:wxid_f4s0jmpvrc522对应的手机号后四位为(答案格式:1111)

8390

image-20251103082817732

75、分析检材中“华为应用市场”第一次安装日期为(使用双位数格式,答案格式:01月01日)

09月24日

有些许存疑,不知道这个安装是不是第一次安装。image-20251103083018623

76、找出检材中钱包APP,请列出该APP中ETH地址后六位是(字母全大写,答案格式:AAAAAA)

3FE61F

image-20251103083111829

77、分析出检材中包含“南昌西站”的图片,计算该图片的MD5后六位?(字母全大写,答案格式:AAAAAA)

85A51D

image-20251103083803552

78、手机相册中有张“imtoken助记词1.PNG”图片被破坏,请修复该图片,列出该图片中第三个单词。(答案格式:按照实际情况填写)

boost

提取出来发现是被改了宽高,直接用工具梭了image-20251103083946506

79、找出一张PNG图片,该图片上显示“助记词2”,请列出该图片上显示的第二个单词。(答案格式:按照实际情况填写)

delay

和上一题一起搜出来的image-20251103084031807

80、找出检材中显示“助记词3”的文档,列出该文档中记录的第三个助记词单词。(答案格式:按照实际情况填写)

quarter

image-20251103084747649

81、分析出该组助记词正常顺序中最后一个单词(已知助记词1、助记词2、助记词3中的单词顺序有被调整)。(答案格式:按照实际情况填写)

segment

似乎做不了?因为好像得知道助记词对应的地址,然后才能进行爆破或者其他的办法,或者就是imtoken里面的三个地址之一?但是试过了一遍没有对的

助记词1 movie unlock boost segment

助记词2 foil delay paddle obtain

助记词3 student electric quarter clerk

后续直接使用了川佬的妙妙小工具,直接恢复了

image-20251117205122677

82、分析出邮箱中收件人QQ号为“850563586”的姓名(答案格式:按照实际情况填写)

刘佳雨

image-20251103091947491

83、得知机主通过某个应用给HHshAL发送了一个文档,该应用的数据包名是什么?(答案格式:com.test)

dingtong.saichuang

有两个小众app直接仿,看看是哪个image-20251103103259119

84、接上题,该应用聊天记录数据库的打开密码是什么?(答案格式:按照实际情况填写)

@1@#!aajsk1*JKJ

想了半天,没想到直接是明文存储写在apk里面了。。。image-20251103105214483

85、接上题,机主发送的这个加密文档,打开密码是什么?(答案格式:按照实际情况填写)

QWERT666

image-20251103103500907

86、厉明的身份证地址登记的门牌号是多少??(答案格式:1)

722

先做下一题image-20251103111543107

87、分析出“important1.xlsx”文件中体现的“金达欣”银行卡后六位?(答案格式:111111)

935629

挺奇怪的,先把密信助手仿真起来了,里面反而是空的,数据库里面能找到存储的密码。明文存储的密码...好像这题不用仿也能做image-20251103111328839

image-20251103111419824

88、接上题,保存“important1.xlsx”打开密码数据的应用,该应用的启动密码是什么?(答案格式:按照实际情况填写)

1596

image-20251103105852527

数据分析 请根据数据分析检材,回答以下问题:

89、通过对检材“01-lott.sql”文件进行分析,统计庄家"188"在2021-05-10当日的电子投注总笔数(答案格式:1)

2299

image-20251103113933415

90、通过对检材“01-lott.sql”文件进行分析,统计t_trade_betrecord中庄家"188"记录中彩票类型为"jnd28"且期号在t_lottery_jnd表中存在的记录数。(答案格式:1)

92842

那个表的彩票期号应该是连续的,所以只需要筛好这个表就行了image-20251103114553645

91、通过对检材“01-lott.sql”文件进行分析,统计庄家"188"的玩家在2021-05-10当日:电子投注内容出现频率最高的电子投注内容是什么?(答案格式:按照实际情况填写)

500单

image-20251103115058669

92、通过对检材“01-lott.sql”文件进行分析,关联t_trade_betrecord与t_lottery_jnd表,分析庄家"188"在2021-05-10投注"jnd28"时:当开奖结果为"大"时,玩家投注包含"小"的笔数占比(使用双位数格式,答案格式:11.11%)

44.88%

521/1161*100%=44.88%

image-20251103144016163

image-20251103144109764

93、通过对检材“02-crime_records.sql”分析,统计相邻两次作案时间间隔在1天之内的城市和该城市两次作案时间间隔在1天之内的案件总数量,找出案件总数最多的城市名。(答案格式:按照实际情况填写)

苏州

image-20251103195011246

SELECT `city`, COUNT(*) AS `within_1d_count`
FROM (
  SELECT `city`,
         DATEDIFF(`crime_time`, LAG(`crime_time`) OVER (PARTITION BY `city` ORDER BY `crime_time`)) AS d
  FROM `crime_records`
) t
WHERE d IS NOT NULL AND d <= 1
GROUP BY `city`
ORDER BY `within_1d_count` DESC
LIMIT 1;

94、通过对检材“02-crime_records.sql”分析,根据案件的损失金额和伤情等级,将案件分为 “轻微案件”“一般案件”“重大案件”“其他”四类(分类规则如下),并统计 2023 年各类型案件的数量。轻微案件:损失金额≤10000 元且无人员受伤(injury_level 为空或未提及);一般案件:损失金额 10001-50000 元,或有轻微伤;重大案件:损失金额 > 50000 元,或有轻伤或有重伤;其他:非上述情况。(按照案件数量的降序输出答案,答案格式为:40/30/20/10)

13107/4590/2058/222

WITH `x` AS (
  SELECT
    `loss_amount`,
    REPLACE(REPLACE(TRIM(IFNULL(`injury_level`, '')), ' ', ''), ' ', '') AS `inj_raw`,
    COALESCE(
      STR_TO_DATE(REPLACE(REPLACE(TRIM(`crime_time`), '-', '/'), '.', '/'), '%Y/%c/%e %H:%i:%s'),
      STR_TO_DATE(REPLACE(REPLACE(TRIM(`crime_time`), '-', '/'), '.', '/'), '%Y/%c/%e %H:%i')
    ) AS `ct`
  FROM `crime_records`
),
`norm` AS (

  SELECT
    `loss_amount`,
    `ct`,
    CASE
      WHEN `inj_raw` = '' OR `inj_raw` IN ('未提及','未说明','未知','不详','暂无')
           OR `inj_raw` LIKE '%无受伤%' OR `inj_raw` LIKE '%未受伤%'
           OR `inj_raw` LIKE '%无伤%'   OR `inj_raw` LIKE '%无伤亡%'
        THEN 'NONE'
      WHEN `inj_raw` LIKE '%轻微%' THEN '轻微伤'
      WHEN `inj_raw` LIKE '%重伤%' THEN '重伤'
      WHEN `inj_raw` LIKE '%轻伤%' THEN '轻伤'
      ELSE '其他说明'
    END AS `inj_norm`
  FROM `x`
  WHERE `ct` IS NOT NULL AND YEAR(`ct`) = 2023
),
`mapped` AS (
  SELECT
    CASE
      WHEN (`loss_amount` IS NOT NULL AND `loss_amount` <= 10000) AND (`inj_norm` = 'NONE')
        THEN '轻微案件'
      WHEN ( (`loss_amount` BETWEEN 10001 AND 50000) OR (`inj_norm` = '轻微伤') )
        THEN '一般案件'
      WHEN ( (`loss_amount` > 50000) OR (`inj_norm` IN ('轻伤','重伤')) )
        THEN '重大案件'
      ELSE '其他'
    END AS `case_type`
  FROM `norm`
),
`stat` AS (
  SELECT `case_type`, COUNT(*) AS `cnt`
  FROM `mapped`
  GROUP BY `case_type`
),
`cats` AS (
  /* 保证四类都有(就算为 0) */
  SELECT '轻微案件' AS `case_type` UNION ALL
  SELECT '一般案件' UNION ALL
  SELECT '重大案件' UNION ALL
  SELECT '其他'
)
SELECT
  /* 题面要“按数量降序用 A/B/C/D 输出” */
  GROUP_CONCAT(COALESCE(`stat`.`cnt`,0) ORDER BY COALESCE(`stat`.`cnt`,0) DESC SEPARATOR '/') AS `answer`
FROM `cats`
LEFT JOIN `stat` USING (`case_type`);

95、通过对检材“02-crime_records.sql”分析,统计 2021-2023 年期间(含2021年和2023年),每年处理结果为 “移送起诉” 的案件里,每一年中损失总额最高的案件类型对应的损失总额为?(按 2021 - 2023 年顺序连接损失总额,连接符号使用/,小数点保留2位,答案格式为 :1.37/2.21/3.45)

325806042.91/344804883.98/352132431.37

WITH `u` AS (
  SELECT
    COALESCE(
      STR_TO_DATE(REPLACE(REPLACE(TRIM(`crime_time`), '-', '/'), '.', '/'), '%Y/%c/%e %H:%i:%s'),
      STR_TO_DATE(REPLACE(REPLACE(TRIM(`crime_time`), '-', '/'), '.', '/'), '%Y/%c/%e %H:%i')
    ) AS `ct`,
    IFNULL(`loss_amount`, 0) AS `loss_amount`,
    TRIM(`crime_type`) AS `crime_type`,
    REPLACE(REPLACE(TRIM(IFNULL(`handling_result`, '')), ' ', ''), ' ', '') AS `hr`
  FROM `crime_records`
),
`f` AS (
  SELECT
    YEAR(`ct`) AS `y`,
    `crime_type`,
    SUM(`loss_amount`) AS `sum_loss`
  FROM `u`
  WHERE `ct` IS NOT NULL
    AND YEAR(`ct`) BETWEEN 2021 AND 2023
    AND `hr` = '移送起诉'
  GROUP BY YEAR(`ct`), `crime_type`
),
`m` AS (
  SELECT `y`, MAX(`sum_loss`) AS `max_sum`
  FROM `f`
  GROUP BY `y`
),
`years` AS (
  SELECT 2021 AS `y` UNION ALL SELECT 2022 UNION ALL SELECT 2023
)
SELECT
  GROUP_CONCAT(REPLACE(FORMAT(COALESCE(`m`.`max_sum`, 0), 2), ',', '') ORDER BY `years`.`y` SEPARATOR '/') AS `answer`
FROM `years`
LEFT JOIN `m` ON `m`.`y` = `years`.`y`;

96、通过对检材“03-案件卡串号数据”表分析,该表每条数据的“卡串号(IMSI)”字段值存在问题,不可信。真实可信的卡串号值在“溯源”字段中(溯源字段的值格式均为“{手机号=[待获取的卡串号->手机卡串号(IMSI)使用过的手机号->当前]}”),请统计分析出该表中哪个真实卡串号出现过的次数最多?(答案格式:按照实际情况填写)

460017709683511

97、通过对检材“04-涉诈案件信息表“分析,统计每个分局2024-2025年每月被骗总额环比大于30%的月份个数(环比定义:(这个月的数据-上个月的数据)/上个月数据。特殊情况,例如某分局2025年1月被骗金额总和为100,若该分局2024年12月没有被骗金额,则该分局2025年1月也符合题目要求,应增加一个月份。2024年1月不需要计算与上个月的环比情况),请写出环比大于30%的月份个数最多的分局ID名称为?(答案格式:按照实际情况填写)

A675

image-20251103203021732

98、通过对检材“05-人像卡口信息表”和“06-涉毒前科人员信息表”(两表均无重复数据,直接要求答题即可。感知时间字段格式均为yyyy-MM-dd HH:mm:ss;传感器ID(人像卡口点位)值不同则代表不同的摄像点位),为摸排疑似涉毒的窝点,请分析出在00:00:00~06:00:00(含0点跟6点)人像记录中,哪个传感器点位ID抓拍到最多的不同涉毒前科人员?(答案格式:按照实际情况填写)

350203103

image-20251103204212315

99、接上题,为摸排潜在的涉毒人员,请分析出有多少个非涉毒前科人员至少跟3个不同的涉毒前科人员同行过?(本题的“同行”指:两人在同一个人像卡口点位感知时间差在10(含)秒内)(答案格式:1)

4

AI跑的

100、近几年架设简易GOIP设备进行群呼诈骗的案件屡见不鲜。架设和维护该设备的人员通常会频繁更换酒店【即只住一天然后更换酒店】以此躲避公安的侦察打击。请根据”07-旅店住宿信息表“(该表无重复数据,直接要求答题即可。时间相关的字段格式均为yyyy-MM-dd HH:mm:ss),筛选出2024和2025年的住宿记录(以“入住时间”为准),频繁更换酒店的人员有几个?(答案格式:1)

7

依旧ai脚本,已经不会做了。。。

import pandas as pd

p07 = "/mnt/data/07-旅店住宿信息表.xlsx"
sheets = pd.read_excel(p07, sheet_name=None)
df = pd.concat(sheets.values(), ignore_index=True)

def find_col(df, keywords, default=None):
    for c in df.columns:
        s = str(c).strip()
        for kw in keywords:
            if kw in s:
                return c
    return default

col_pid = find_col(df, ["身份证", "人员ID", "证件号", "人员编号", "person", "ID"], df.columns[0])
col_hotel = find_col(df, ["酒店", "旅店", "宾馆", "旅馆", "客栈", "旅业", "hotel", "店名", "场所"], df.columns[1])
col_checkin = find_col(df, ["入住", "checkin", "入店"], df.columns[2])

d = df[[col_pid, col_hotel, col_checkin]].copy()
d.columns = ["pid","hotel","checkin"]
d["pid"] = d["pid"].astype(str).str.strip()
d["hotel"] = d["hotel"].astype(str).str.strip()
d["checkin"] = pd.to_datetime(d["checkin"], errors="coerce")
d = d.dropna(subset=["pid","hotel","checkin"])

# Filter by check-in in 2024-2025
mask = (d["checkin"] >= pd.Timestamp("2024-01-01")) & (d["checkin"] <= pd.Timestamp("2025-12-31"))
d = d[mask].copy()

# Reduce to calendar date of check-in
d["day"] = d["checkin"].dt.normalize()

suspects = set()
for pid, g in d.sort_values(["pid","day","checkin"]).groupby("pid"):
    # For each calendar day, if multiple check-ins exist, keep the last one of that day (more likely the final chosen hotel)
    gg = g.sort_values("checkin").drop_duplicates(subset=["day"], keep="last").reset_index(drop=True)
    # Look for any consecutive-day switch: day[i+1] == day[i] + 1 day, and hotel differs
    if len(gg) >= 2:
        day_series = gg["day"].values
        hotel_series = gg["hotel"].values
        for i in range(len(gg)-1):
            if (day_series[i+1] - day_series[i]).astype("timedelta64[D]").astype(int) == 1:
                if hotel_series[i+1] != hotel_series[i]:
                    suspects.add(pid)
                    break

len(suspects)
posted @ 2025-11-02 22:52  zzpu213  阅读(634)  评论(15)    收藏  举报