22年长安杯电子数据取证复盘

文章发布时间:

最后更新时间:

写在前面

最终排名 81/681 二等奖

第一次正式参加取证比赛,和队友配合不当,多有遗憾。重新复盘一下整个经过,梳理一下取证思路。

案情背景

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

检材一部分

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

ip地址:172.16.80.133

  1. 检材1的SHA256值为

    将检材1.e01文件拖入火眼当中并选择计算哈希,算法为SHA256

    image-20221104111252937

    9E48BB2CAE5C1D93BAF572E3646D2ECD26080B70413DC7DC4131F88289F49E34

    PS:这次长安杯两个服务器检材当中历史记录包含了众多有用信息,所以挂载之后第一时间一定要先查看一下历史记录看看都有过什么操作,大致推断一下这个检材是干什么用的

    我们将~/.bash_history存放历史记录的文件导出,查看

    可以得到一些关于网站的信息

    (1)在/web/app目录下曾经启动过jar包,也就是有java应用在后台运行过

    什么是nohup命令?

    nohup 英文全称 no hang up(不挂起),用于在系统后台不挂断地运行命令,退出终端不会影响程序的运行。

    image-20221104112327590

    (2)在/web/app/admin目录下,另有npm启动命令。还可以看到一系列vue文件,大致可以推断出这里有网站,且以前端VUE后端java某个框架为架构(在比赛时还以为是nodejs搭建的,一直在找后端代码在哪里…)

    image-20221104112656554

    (3)在比赛时没注意这里有一个启动脚本,可以一键启动网站的,便于我们重构网站,但是它给删了。

    image-20221104112919228

    image-20221104113016760

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

    当时的思路是,首先先查看了一下检材一镜像对应的ip

    1
    ipconfig

    image-20221104113054324

    得到172.16.80.133

    搭建该服务器的技术员可能是远程连接上来的,我们看看本机开启了哪些服务

    1
    netstat -anpt

    image-20221104113323152

可以看到端口22开启了ssh服务,所以可以直接连上来。通过last验证

image-20221104113417108

于是得到了检材2的解压密码 172.16.80.100

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

    查看文件/etc/centos-release即可得到

    image-20221104113642837

    7.5.1804

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

    这里我当时是查看网卡里面写的,位于/etc/sysconfig/network-scripts

    image-20221104113847257

    查看ifcfg-ens33即可得到网卡配置信息

    image-20221104114018399

    172.16.80.133

  3. 检材1中,网站jar包所存放的目录是

    这个我们在历史记录里已经确定了,位于/web/app

    image-20221104114431787

    jar包分析

  4. 检材1中,监听7000端口的进程对应文件名为

    方法1:当时一个个查看了一下jar包中的配置文件,最终定位到cloud.jar

    从jar包的启动文件可以看出是springboot框架,配置文件在application.properties

    image-20221104115128222

    方法2:最快速的方法其实就是将jar包全启动起来,然后查看哪个监听的端口是7000就好了

    image-20221104152058149

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

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

后端定位jar包到admin-api.jar,查看配置文件。这里能看到数据库的配置(mysql、mongodb、redis)

image-20221104154813728

image-20221104154825084

image-20221104154842556

然后发现了可疑的md5 key,推断加密算法可能是md5

image-20221104154927956

因为还没重构出网站,所以我当时还去看了前端代码。结合前端接口我们可以进一步定位controller验证后台登录加密算法

image-20221104155037606

位于/controller/system/EmployeeController#doLogin()

image-20221104155607001

看下md5Key是什么,验证猜想正确

image-20221104155706887

前端部分

  1. 检材1中,网站前台页面里给出的APK的下载地址是

    前台页面的前端在/web/app/web下,其实历史记录中给出了如何跑起来,当时对前后端分离架构还不是很理解。去盲翻前端页面,还真在src/App.vue下找到了一个apk链接,但实际上已经是注释掉了,”二维码链接已修改”

    image-20221104160648209

    image-20221104160444804

    于是启动测试一下

    1
    npm run dev

    image-20221104161128636

    访问虚拟机3000端口,可以在得到一张二维码图片,扫描即可得到二维码中的apk下载地址

    image-20221104161332029

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

image-20221104161614477

得到一个apk文件我们先保存下来

  1. 检材1中,网站管理后台页面对应的网络端口为

    原来是问的前端启动的端口,后端是在6010(admin-api.jar)

    对于后台的前端我们同样测试一下

    image-20221104162608208

    1
    npm run dev

    image-20221104162713623

    访问虚拟机9090端口,可以验证

    image-20221104162847693

比赛的时候被坑了,我在config配置里看到的是8090。这里是因为npm启动时是直接启动的web-pack打包文件,而非源码(这中间可能会有修改的地方)

image-20221104163755460

或者在检材2中我们可以在浏览器浏览记录里找到后台登录时对应的访问端口

image-20221104183651956

检材2部分

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

ip地址:172.16.80.100

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

    火眼仿真看一下账户信息

    image-20221104164724230

    135790

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

    xshell中可以查看连接会话记录,里面存在两条,另一条就是检材3对应的ip地址172.16.80.133

    image-20221104170254638

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

    这里存在一个干扰项,就是在火眼分析中的系统SSH 历史输入命令。实际上,仔细看下都是linux命令,对应的是windows下wsl子系统中的命令历史记录,而非powershell中的历史记录,需要特别辨析。

    image-20221104170850643

powershell的历史记录位于分区6\Users\Web King\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadLine

查看便可得到 ipconfig

image-20221104171230331

还有一种更直接的方法就是火眼仿真中直接在powershell里按方向键上即可直接得到最后一条历史命令

image-20221104184919850

  1. 检材2中,下载的涉案网站源代码文件名为

    在Chrome浏览器的下载历史记录当中有对应几个zip包,以及对应的下载来源

    image-20221104171458984

我们之前在检材一中/web/app/admin/web/app/web下分别有一个README.md文件,里面对应着github项目下的README.md,通过比对项目https://github.com/sengeiou/ZTuoExchange_framework,可以定位文件就是ZTuoExchange_framework-master.zip

image-20221104183326111

同时在github上我们也找到了网站的架构图

image-20221104183359183

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

    在登录之后有保存的密码遗留 密码即root

    image-20221104183745851

  2. 检材2中,技术员使用的WSL子系统发行版本是

    静态分析方法:WSL位置一般在C:\Users\xxx\AppData\Local\Packages\CanonicalGroupLimited.xxx_79rhkp1fndgsc\LocalState\rootfs下,实际查看会发现有两个版本,其中20.04版本明显文件数量有多很多

    image-20221104185506549

    并且在20.04版本下的rootfs根文件系统中可以找到清晰的linux目录结构,而在22.04中是不存在的,也就是并未实际使用。

    image-20221104185635103动态仿真方法:能直观的看到就直观看,打开wsl就能看到

    image-20221104185845601

  3. 检材2中,运行的数据库服务版本号是

    在wsl历史命令当中可以看到有对mysql数据库的操作

    image-20221104190404574

    在火眼数据库解析当中可以看到8.0.30

    image-20221104190225779

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

    首先什么是debian-sys-maint用户?

    1
    正如它的字面意思(Debian System Matainence),Debian系统对MySQL维护用的,你可以理解为通过系统的某个“非常规”程序对Mysql进行备份恢复等行为时,改程序所使用的登录Mysql的账户。 ——你应该可以理解吧?你手工维护的时候同样需要用某账户登入Mysql再操作的——系统的程序也一样需要这么做,只是它通过这个账户免去了你手工操作的“麻烦”,加深了系统复杂度,让你更加难以理解mysql和Linux的工作原理。 原则上Linux系统本身与MySQL无需任何直接或间接的接触,你大可以删除,维护时使用网上大家最常用的方法来维护(这类方法可以适用于安装在任何系统上的Mysql,而此账户所对应的“便捷”方法——正如他的名字一样,仅适用于Debian)

    在windows中我们是找不到mysql相关的服务的,因为通过历史记录可以看到它是运行在wsl子系统当中

    它的默认密码存放在wsl子系统的/etc/mysql/debian.cnf

    查看可知初始密码ZdQfi7vaXjHZs75M

    image-20221104193000955

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

    在wsl历史记录当中可以看到本机有ssh连接检材3的信息,密码就是 h123456

    image-20221104193307353

其中我们再浏览一下本机可以在D盘找到一些脚本文件,这里已经可以看到在检材1中被删掉的start_web.sh,有助于我们重构网站,留住备份。(团队比赛时一定要和队友说明!)

image-20221104193654177

检材三部分

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

ip地址:172.16.80.128

检材仿真之后,首先第一时间还是浏览历史记录

(1)简单看下有zookeeper服务

image-20221104202528769

(2)有docker服务,并且使用了docker-compose插件

image-20221104202726093

(3) 在/web目录下存在启动脚本start.sh,这个我们在检材2里也找到了。同检材1一样,这个启动脚本也被删掉了

image-20221104202842433

image-20221104203010631

(4)docker启动了mysql服务

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

    我们先启动docker服务

    1
    service docker start

    然后查看网络服务监听状态

    1
    netstat -lnpt

    image-20221104203601351

    可知程序名为docker-proxy

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

    在历史记录当中我们是可以看到还有redis和mongo

    image-20221104203809964

    当然结合检材1的java配置以及我们在github上找到的架构图都是可以判断出的

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

    方法1:在检材1的admin-api.jar配置文件当中,我们是看到了mysql的连接配置信息,直接得到shhl7001

    image-20221104210229225

    方法2:查看docker-compose配置文件

    通过历史记录看到位于目录/data/mysql/

    image-20221104210630411

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

    从上一题的docker-compose.yml配置文件当中可以看到外部数据映射到了/var/lib/mysql目录下

    或者可以通过查看docker配置判断

    1
    2
    3
    docker ps
    # 8eda4cb0b452 mysql:5.7.32
    docker inspect 8eda4cb0b452

    image-20221104211035133

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

    同样在检材1的admin-api.jar配置文件中jdbcUrl为spring.datasource.url=jdbc:mysql://172.16.80.128:33050/b1?characterEncoding=utf-8

    对应数据库名为b1

  6. 勒索者在数据库中修改了多少个用户的手机号?

    我们直接在容器外部查看相应日志,对应目录/data/mysql/db

    首先我们找到了8eda4cb0b452.log日志文件,其次发现b1数据库被删掉了,我们把从检材2中找到的b1文件夹复原

    image-20221104212600227

    然后打开日志文件,可以看到大量的sql执行语句。通过关键词update可以查看到修改用户的相关信息

    image-20221104212950810

    但是有个坑点在于用户登录时也会出现update数据的操作,需要排除

    image-20221104213028054

    所以总共有效数据为3条

    1. 勒索者在数据库中删除的用户数量为

      同理,全局搜索delete关键词,总共28条数据

      image-20221104213215957

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

    接下来就是需要网站重构了,我们将检材2中的启动脚本和数据库放到对应的检材目录中

    在检材中,更新docker内的数据库

    1
    docker-compose up -d

    image-20221104213631595

    /web下,首先赋予启动脚本执行权限

    1
    chmod 777 start.sh

    然后启动脚本

    1
    sh start.sh

    image-20221104213858451

    然后在检材1中/web/app下相同操作

    image-20221104214541272

    访问网站验证,重构成功!

    image-20221104214651476

    接下来就是连接数据库查看,在admin表中可以看到 172.16.80.197

    image-20221104214846874

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

    member_wallet表中,可以看到地址cee631121c2ec9232f3a2f028ad5c89b

    image-20221104220135335

  9. 还原全部被删改数据,共有多少名用户的会员等级为’LV3’

    首先定位会员等级的字段在哪里

    可以看到在member_grade表中,等级分别对应着同数字的id

    image-20221104230147505

    member表中存在字段member_grade_id,应该就是与之对应的

    image-20221104230427331

    这块需要注意之前在日志中看到用户数据有28条是被删除了的,所以我们需要将对应的数据恢复

    数据表中显示最后一条数据id是972,因此我们从973条数据开始恢复

    image-20221104231444487

然后在表中去查询即可

1
select count(*) from member where member_grade_id

image-20221104231655847

  1. 还原全部被删改数据,哪些用户ID没有充值记录

    首先定位充值记录信息在member_transaction表中可以看到交易记录

    image-20221104232624214

    联合member表,我们就可以定位哪些用户ID没有充值记录

    1
    select member.id from member where member.id not in (select distinct (member_transaction.member_id) from member_transaction);

    image-20221104233218741

得到318 989

  1. 还原全部被删改数据,2022年10月17日总计产生多少笔交易记录?

    还是在member_transaction表,我们的交易时间对应的字段是create_time

    1
    select count(*) from member_transaction where create_time like '%2022-10-17%';

    image-20221104233539701

共计1000条

  1. 还原全部被删改数据,该网站中充值的USDT总额为

    还是在member_transaction表,我们计算一下总额即可,对应amount字段

    1
    select SUM(amount) from member_transaction;

    image-20221104233730193

    也就是408228

检材四部分

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

成功解压后得到了一个.npak格式的文件

image-20221105151439716

经过百度查询可知是V6.0.2.0版本夜神模拟器的备份文件,通过解压可以查看其中的内置备份文件,并存在vmdk后缀文件

image-20221105152424387

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

    夜神模拟器

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

    在微信聊天记录里可以找到,往后看我们也能了解到前三个检材背后的剧情,这天聊着聊着就不对劲了。。。

    image-20221105153556236

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

    同样在应用列表可以直接看到 v2rayNG

    image-20221105153726154

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

    38.68.135.18

    image-20221105153948024

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

    在应用列表中出现了两个无名软件,其中一个的包名十分可疑 com.jiadi.luping

    image-20221105154058242

    为了求证,我们可以在分区4\data\com.jiadi.luping\databases下查看其数据库信息,定位record.db,同时我们看到还存在walshm后缀的文件,这里要简单提到sqlite预写日志的工作方式

    image-20221105155408528

    原始内容保留在数据库文件中,而更改将附加到单独的WAL文件中。甲COMMIT当指示一个提交一个特殊的记录被追加到WAL发生。因此,即使不写入原始数据库也可以进行COMMIT,这允许读者在更改同时提交到WAL的同时继续从原始未更改的数据库进行操作。可以将多个事务附加到单个WAL文件的末尾。

    因此如果我们要浏览完整的数据信息,需要同时将这三个文件在同一个目录当中再去打开数据库文件

    可以看到里面确实存放着录屏录像的一些文件

    image-20221105155822945

    回到本题,安装时间即2022/10/19 10:50:27

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

    在上面record.db数据库文件的RecordFile表中可以找到记录信息

    0c2f5dd4a9bc6f34873fb3c0ee9b762b98e8c46626410be7191b11710117a12d

    image-20221105160016570

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

    AccountInfo表中的mobile字段即登录的手机号 18645091802

    image-20221105160103800

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

    在比赛时队友写成接收地址了。。一定要细心审题

    在QQ邮箱的收件箱中可以看到两封勒索邮件 skterran@163.com

    image-20221105160402983

EXE部分

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

在检材二的D盘存在两个可疑文件,其中一个是加密文档,另一个是解密程序,与第二封邮件内容相对应

image-20221105165048798

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

    使用exeinfope查看exe发现程序是pyinstaller生成的可执行文件,于是得出编译该加密程序使用的语言是python

    image-20221105183551344

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

    阅读代码即可发现在run_finall函数中会对.txt,.jpg,.xls,.docx四种文件进行加密

    image-20221105183847956

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

    阅读代码即可发现在run_finall函数中最后调用了XORCBC类的encrypt方法进行了加密

    image-20221105183847956

    而该encrypt方法对数据进行了异或运算

    image-20221105183954122

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

    同样可以在代码中发现publickey如下

    1
    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'
  5. 被加密文档中,FLAG1的值是

    同样对decrypt_file.exe进行解包与反编译后发现解密需要的密码明文写在了程序中

    image-20221105184554721

    执行decrypt_file.exe并输入密码

    image-20221105184717404

    得到解密后的文档,FLAG就在文档中

    image-20221105184531501

APK部分

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

加密勒索apk程序我们在检材1的二维码链接中可以下载得到

image-20221105165256712

  1. 恶意APK程序的包名为

    直接利用雷电APP智能分析就能查看

    cn.forensix.changancup

    image-20221105165514745

  2. APK调用的权限包括

    在静态权限当中可以查看

    image-20221105165606961

  3. 解锁第一关所使用的FLAG2值为

    雷电模拟器安装上apk,打开软件查看。很好,模拟器被锁了。

    image-20221105171139112

    将其脱壳,反编译。然后查看代码,先全局搜索一下关键词FLAG

    大致看下逻辑,其中OnClick函数这里有个明显的字符串对比,trim2是我们的输入

    image-20221106050532180

  4. 解锁第二关所使用的FLAG3值为

    接上题,注意到

    image-20221106050903845

    追踪App.OooO0O0.OooO0oo,发现在这里被初始化

    image-20221106051009626

尝试用frida进行hook,模拟器先把frida-server开起来(注意不要给ZTuoExchange root权限),跑脚本frida -U -l hook.js "ZTuoExchange"

https://blog.csdn.net/WXjzcccc/article/details/127609236

1
2
3
4
5
6
7
8
setImmediate(function () {
Java.perform(function () {
var app = Java.use("cn.forensix.cab.App"); // 指定类
var OooO0oo = app.class.getField("OooO0oo"); // 指定属性
var OooO0O0 = app.class.getField("OooO0O0").get(null); // 获取已实例化的对象
console.log(OooO0oo.get(OooO0O0));
});
})
  1. 解锁第三关所需的KEY值由ASCII可显示字符组成,请请分析获取该KEY值

关键的验证

image-20221106051914531

查看该函数声明,要求字符串长度为24,4个一组,分成6组操作。其中try块里会触发unused异常,真正的验证逻辑在catch块中。可以把需要用到的操作拿出来,每4个进行爆破。

image-20221106052132590

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
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]};
}
}

答案:a_asd./1imc2)dd1234]_+=+