电子取证

手机取证_1

打开苹果测试查看程序,搜索关键字:627604C2-C586-48C1-AA16-FF33C3022159.PNG

image-20220709172345189

然后再导出图片

image-20220709172419812

查看图片的属性

手机取证_2

直接搜索姜总,发现快递单号

image-20220709172635194

计算机取证_1

我们先使用volatility查看镜像1.dmp的信息:

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
$ vol -f 1.dmp imageinfo
Volatility Foundation Volatility Framework 2.6
INFO : volatility.debug : Determining profile based on KDBG search...
Suggested Profile(s) : Win7SP1x64, Win7SP0x64, Win2008R2SP0x64, Win2008R2SP1x64_23418, Win2008R2SP1x64, Win7SP1x64_23418
AS Layer1 : WindowsAMD64PagedMemory (Kernel AS)
AS Layer2 : FileAddressSpace (D:\Desktop\计算机取证\1.dmp)
PAE type : No PAE
DTB : 0x187000L
KDBG : 0xf80003ffa0a0L
Number of Processors : 1
Image Type (Service Pack) : 1
KPCR for CPU 0 : 0xfffff80003ffbd00L
KUSER_SHARED_DATA : 0xfffff78000000000L
Image date and time : 2022-04-28 05:54:55 UTC+0000
Image local date and time : 2022-04-28 13:54:55 +0800Volatility Foundation Volatility Framework 2.6
INFO : volatility.debug : Determining profile based on KDBG search...
Suggested Profile(s) : Win7SP1x64, Win7SP0x64, Win2008R2SP0x64, Win2008R2SP1x64_23418, Win2008R2SP1x64, Win7SP1x64_23418
AS Layer1 : WindowsAMD64PagedMemory (Kernel AS)
AS Layer2 : FileAddressSpace (D:\Desktop\计算机取证\1.dmp)
PAE type : No PAE
DTB : 0x187000L
KDBG : 0xf80003ffa0a0L
Number of Processors : 1
Image Type (Service Pack) : 1
KPCR for CPU 0 : 0xfffff80003ffbd00L
KUSER_SHARED_DATA : 0xfffff78000000000L
Image date and time : 2022-04-28 05:54:55 UTC+0000
Image local date and time : 2022-04-28 13:54:55 +0800

可以看到大概率是win7sp1x64的镜像,题目需要获得taqi7的开机密码,我们直接用volatility导出用户hash:

1
2
3
4
5
6
7
$ vol -f 1.dmp --profile=Win7SP1x64 hashdump
Volatility Foundation Volatility Framework 2.6
Administrator:500:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
taqi7:1000:aad3b435b51404eeaad3b435b51404ee:7f21caca5685f10d9e849cc84c340528:::
naizheng:1002:aad3b435b51404eeaad3b435b51404ee:d123b09e13b1a82277c3e3f0ca722060:::
qinai:1003:aad3b435b51404eeaad3b435b51404ee:1c333843181864a58156f3e9498fe905:::

导出之后复制taqi7的后面的密码哈希到网站上去查,可知密码是anxinqi

image-20220709163350227

计算机取证_2

题目是要得到制作该内存镜像的进程Pid号,我们使用volatility获取内存中的进程:

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
$ vol -f 1.dmp --profile=Win7SP1x64 pslist
Volatility Foundation Volatility Framework 2.6
Offset(V) Name PID PPID Thds Hnds Sess Wow64 Start Exit
------------------ -------------------- ------ ------ ------ -------- ------ ------ ------------------------------ ------------------------------
0xfffffa800ccc7890 System 4 0 105 623 ------ 0 2022-04-28 05:38:41 UTC+0000
0xfffffa800d9c3610 smss.exe 288 4 2 29 ------ 0 2022-04-28 05:38:41 UTC+0000
0xfffffa800e100740 csrss.exe 384 376 9 486 0 0 2022-04-28 05:38:42 UTC+0000
0xfffffa800e4a3840 wininit.exe 424 376 3 78 0 0 2022-04-28 05:38:43 UTC+0000
0xfffffa800e4a7b30 csrss.exe 436 416 10 645 1 0 2022-04-28 05:38:43 UTC+0000
0xfffffa800e50b060 winlogon.exe 492 416 5 116 1 0 2022-04-28 05:38:43 UTC+0000
0xfffffa800e523910 services.exe 532 424 6 216 0 0 2022-04-28 05:38:43 UTC+0000
0xfffffa800e52fb30 lsass.exe 544 424 6 614 0 0 2022-04-28 05:38:43 UTC+0000
0xfffffa800e489060 lsm.exe 552 424 11 209 0 0 2022-04-28 05:38:43 UTC+0000
0xfffffa800e612630 svchost.exe 660 532 11 357 0 0 2022-04-28 05:38:43 UTC+0000
0xfffffa800e638b30 svchost.exe 728 532 8 290 0 0 2022-04-28 05:38:43 UTC+0000
0xfffffa800e6553b0 svchost.exe 776 532 21 502 0 0 2022-04-28 05:38:43 UTC+0000
0xfffffa800e602750 svchost.exe 920 532 17 405 0 0 2022-04-28 05:38:44 UTC+0000
0xfffffa800e6da4e0 svchost.exe 960 532 42 1121 0 0 2022-04-28 05:38:44 UTC+0000
0xfffffa800e6f7060 audiodg.exe 1020 776 6 131 0 0 2022-04-28 05:38:44 UTC+0000
0xfffffa800e722060 svchost.exe 420 532 9 530 0 0 2022-04-28 05:38:44 UTC+0000
0xfffffa800e749b30 ZhuDongFangYu. 956 532 26 394 0 1 2022-04-28 05:38:44 UTC+0000
0xfffffa800e75a950 svchost.exe 1040 532 23 636 0 0 2022-04-28 05:38:44 UTC+0000
0xfffffa800e85b570 spoolsv.exe 1300 532 12 313 0 0 2022-04-28 05:38:45 UTC+0000
0xfffffa800e88cb30 svchost.exe 1336 532 17 321 0 0 2022-04-28 05:38:45 UTC+0000
0xfffffa800e907630 svchost.exe 1440 532 4 81 0 1 2022-04-28 05:38:45 UTC+0000
0xfffffa800e9c6740 vmtoolsd.exe 1548 532 9 276 0 0 2022-04-28 05:38:45 UTC+0000
0xfffffa800eabd060 svchost.exe 1960 532 5 101 0 0 2022-04-28 05:38:46 UTC+0000
0xfffffa800eb07b30 dllhost.exe 1612 532 13 186 0 0 2022-04-28 05:38:46 UTC+0000
0xfffffa800eb36b30 msdtc.exe 2068 532 12 144 0 0 2022-04-28 05:38:48 UTC+0000
0xfffffa800eabe980 svchost.exe 2512 532 11 146 0 0 2022-04-28 05:40:46 UTC+0000
0xfffffa800ea79b30 svchost.exe 2584 532 13 335 0 0 2022-04-28 05:40:46 UTC+0000
0xfffffa800eaa8310 SearchIndexer. 2648 532 11 658 0 0 2022-04-28 05:40:47 UTC+0000
0xfffffa800ea7a0f0 WmiPrvSE.exe 1792 660 7 114 0 0 2022-04-28 05:42:48 UTC+0000
0xfffffa800cdf4b30 taskhost.exe 916 532 9 209 1 0 2022-04-28 05:42:55 UTC+0000
0xfffffa800cdfe210 dwm.exe 972 920 3 70 1 0 2022-04-28 05:42:55 UTC+0000
0xfffffa800e585b30 explorer.exe 2044 1716 53 1335 1 0 2022-04-28 05:42:55 UTC+0000
0xfffffa800e83eb30 vmtoolsd.exe 2672 2044 7 209 1 0 2022-04-28 05:42:56 UTC+0000
0xfffffa800e84f780 ldnews.exe 2664 2044 10 363 1 1 2022-04-28 05:42:56 UTC+0000
0xfffffa800ea25580 360Tray.exe 2436 956 150 1455 1 1 2022-04-28 05:42:57 UTC+0000
0xfffffa800edc8b30 LiveUpdate360. 3500 2288 18 305 1 1 2022-04-28 05:43:13 UTC+0000
0xfffffa800ee90b30 360TptMon.exe 4012 3784 17 415 1 1 2022-04-28 05:43:22 UTC+0000
0xfffffa800ee6bb30 svchost.exe 3316 532 3 57 0 1 2022-04-28 05:43:23 UTC+0000
0xfffffa800eb76b30 SoftMgrLite.ex 3396 2436 30 360 1 1 2022-04-28 05:44:13 UTC+0000
0xfffffa800ec4b630 TrueCrypt.exe 3496 2044 5 268 1 1 2022-04-28 05:46:22 UTC+0000
0xfffffa800ea45b30 TrueCrypt Form 2964 3496 0 -------- 1 0 2022-04-28 05:46:35 UTC+0000 2022-04-28 05:47:59 UTC+0000
0xfffffa800ed78720 SearchProtocol 2548 2648 7 316 0 0 2022-04-28 05:52:53 UTC+0000
0xfffffa800ec2e6f0 notepad.exe 2872 2044 1 62 1 0 2022-04-28 05:54:13 UTC+0000
0xfffffa800f103b30 MagnetRAMCaptu 2192 2044 16 333 1 1 2022-04-28 05:54:30 UTC+0000
0xfffffa800ea7b910 360speedld.exe 3880 2436 4 94 1 1 2022-04-28 05:54:54 UTC+0000
0xfffffa800ef76b30 dllhost.exe 3604 660 6 91 1 0 2022-04-28 05:54:55 UTC+0000

一开始以为是lsass,后来在做后面的问题时发现有magnetramcapture程序,非常可疑,于是就提交了MagnetRAMCaptu的pid,答案正确:2192

计算机取证_3

题目需要bitlokcer分区某office文件中存在的flag值,那么我们肯定要找到bitlocker的密码。通过搜索发现这篇文章「王老师实操课」三种思路巧妙破解Bitlocker加密 - 知乎

于是我使用010Editor打开镜像文件,直接搜索Unicode字符:“恢复密钥:”,得出如下结果:

image-20220709164021392

bitlocker恢复密钥是由8组6个数字组成的48位数字组成的,这里的搜索结果全部相同,那么我可以肯定应该就是这个密钥。

然后题目还给出了另一个文件:G.E01,经过搜索E01是经常用在司法取证当中的磁盘镜像文件。我们使用Arsenal-Image-Mounter工具进行挂载:

image-20220709164510075

输入密码,打开有四个文件,一个pass.txt很明显是字典,然后两个加密的pptx和docx文件,还有一个新建文本文档

推测要使用字典爆破office文件,我使用Tenorshare PassFab for PPT工具爆破出了密码:image-20220709164821459

打开后得到flag:

image-20220709164903906

计算机取证_4

这题要我们提取TrueCrypt加密中存在的flag值。在之前对内存镜像的分析中我多次看到有关TrueCrypt的进程、文件等,于是我dump出了TrueCrypt.exe的进程:

1
$ vol -f 1.dmp --profile=Win7SP1x64 memdump -p 3496 -D ./

得到了一个340MB的镜像文件

image-20220709165424037

然后我使用foremost对转储文件进行提取:

1
$ foremost 3496.dmp

得到了以下文件:

image-20220709165632919

发现一个压缩包:

image-20220709165655799

怀疑伪加密,7zip打开无果,上ziperello爆破:

image-20220709165751298

很快就出来了,txt里写了flag:

image-20220709165811904

程序分析_1

这题问本程序包名,我得到apk文件后先使用apkscan等工具查看了一波,没什么信息,于是拖到jadx中反编译查看。对于查看文件信息,我们可以使用aapt工具:

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
$ D:\tools\retools\Tool\反汇编工具\AndroidKiller\AndroidKillerPlugin\apktool\aapt.exe dump badging .\EXEC.apk
package: name='exec.azj.kny.d.c' versionCode='9' versionName='5.0'
sdkVersion:'21'
targetSdkVersion:'29'
uses-permission:'android.permission.INTERNET'
uses-permission:'android.permission.WRITE_EXTERNAL_STORAGE'
uses-permission:'android.permission.CAMERA'
uses-permission:'android.permission.READ_PHONE_STATE'
uses-permission:'android.permission.READ_EXTERNAL_STORAGE'
uses-permission:'android.permission.WRITE_EXTERNAL_STORAGE'
uses-permission:'android.permission.ACCESS_NETWORK_STATE'
uses-permission:'android.permission.ACCESS_WIFI_STATE'
uses-permission:'android.permission.INTERNET'
uses-permission:'android.permission.READ_PHONE_STATE'
application: label='EXEC' icon='res/mipmap-xxhdpi-v4/ic_launcher.jpg'
launchable activity name='minmtta.hemjcbm.ahibyws.MainActivity'label='EXEC' icon=''
uses-feature:'android.hardware.camera'
uses-feature:'android.hardware.camera.autofocus'
uses-feature:'android.hardware.wifi'
uses-feature:'android.hardware.touchscreen'
main
other-activities
other-services
supports-screens: 'small' 'normal' 'large'
locales: '--_--' 'ca' 'da' 'fa' 'ja' 'ka' 'pa' 'ta' 'nb' 'be' 'de' 'ne' 'te' 'af' 'bg' 'th' 'fi' 'hi' 'si' 'vi' 'kk' 'mk' 'sk' 'uk' 'el' 'gl' 'ml' 'nl' 'pl' 'sl' 'tl' 'am' 'km' 'bn' 'in' 'kn' 'mn' 'ko' 'lo' 'ro' 'sq' 'ar' 'fr' 'hr' 'mr' 'or' 'sr' 'tr' 'ur' 'as' 'bs' 'cs' 'es' 'is' 'ms' 'et' 'it' 'lt' 'pt' 'eu' 'gu' 'hu' 'ru' 'zu' 'lv' 'sv' 'iw' 'sw' 'hy' 'ky' 'my' 'az' 'uz' 'en_CA' 'fr_CA' 'en_GB' 'en_XC' 'zh_HK' 'zh_CN' 'en_IN' 'pt_BR' 'es_US' 'pt_PT' 'en_AU' 'zh_TW'
densities: '160' '240' '320' '480' '640'

可知包名为exec.azj.kny.d.c。

程序分析_2

这题要找到本程序的入口,在上一题的aapt工具输出中就已经可以知道了,为minmtta.hemjcbm.ahibyws.MainActivity。

程序分析_3

这题需要获得本程序的服务器地址的密文,我先在jadx中打开入口函数:

image-20220709170711280

发现这里返回了一个bash64解码字符串。对它进行解码:

image-20220709170807415

发现是条url,直接提交,正确。

程序分析_4

题目问本程序实现安全检测的类的名称,那么我首先当然要知道它实现了怎样的安全检测。于是我安装apk后运行查看情况,发现进入应用时会提示手机已root,还有注意资金安全的提示。于是我推测是运行环境安全检测相关的类。于是我搜索到了这个函数:

image-20220709171056328

可以发现,这里多次调用d.a.a.c.a.a函数来进行安全检测,于是查看d.a.a.c.a类:

image-20220709171140717

发现它进行了一些环境的安全检测。介于程序的符号进行了一定程度的混淆,大胆猜测类名也就是flag就是a,提交果然正确。

网站取证_1

木马文件在/WWW/runtime/temp/

image-20220709172114925

网站取证_2

/WWW/Application/database.php中可以找到密码函数

image-20220709172302476

/WWW/Application/encrypt/encrypt.php中找到此函数,丢到PHP5.*环境跑一下就有了

image-20220709172708800

网站取证_3

先找到金额处理的地方,搜索关键字money,定位到/WWW/Application/admin/controller/chanelorder.php

image-20220709173026185

很明显就是在这个页面处理的金额,在当前页面搜索关键字money,定位到encrypt函数

image-20220709173202709

盐值就在函数里

image-20220709173250201

网站取证_4

计算张宝在北京时间2022-04-02 00:00:00-2022-04-18 23:59:59累计转账给王子豪多少RMB

一共有7个库,其中:

汇率在info_bargain

image-20220709173551077

转账信息在tab_channel_order_list

image-20220709173635372

用户id在tab_user

image-20220709173722608

搜索名字可以找到对应的id

image-20220709174326982

查询每天的转账记录

image-20220709174838918

修改每天的汇率,每天转账的金额,放到金额解密脚本

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
<?php
function decrypt($str) {

$key = md5('jyzg123456');

$str = base64_decode($str);
$len = strlen($str);

$char = '';
$x = 0;
$l = strlen($key);

for ($i = 0; $i < $len; $i++)
{
if ($x == $l)
{
$x = 0;
}
$char .= $key[$x];
$x++;
}

$data = '';

for ($i = 0; $i < $len; $i++) {
$data .= chr(ord($str[$i]) - ord($char[$i]));
}
return $data;
}

$rate = 0.05;
$file = fopen('1.txt','r');
$sum = 0;
while(!feof($file))
{
$sum += decrypt(fgets($file));
}
fclose($file);
echo $sum*$rate;

杂项

domainhacker

下载附件,一个流量包

wireshark打开,导出HTTP流

得到一个压缩包和一些payload

image-20220709164357501

url解码后发现有三个参数,其中a应该是shell

image-20220709164802290

整理一下a,理出大概逻辑,主要发现参数的传递,是截断前两位后解码

image-20220709165212814

由此可以知道其他参数的明文,主要是第二个参数,解码后发现是执行的指令,在1(16).php中发现压缩包的密码为SecretsPassw0rds

image-20220709165515020

解压后是mimikatz抓下来的windows账户和密码,里面就有机器的hash

image-20220709165914375

domainhacker2

下载附件,是一个流量包和ntds的压缩包

压缩包密码获取方法同上,不赘述

解压后有两个文件夹,共三个文件

image-20220709170536472

使用Impacket中的secretsdump可以提取ntds.dit中的hash

image-20220709171322486

Reverse

Loader

视频讲解:2022蓝帽杯loader一步步分析_哔哩哔哩_bilibili

一个用Nim写的shellcode加载器,dump出pe文件后进行逆向,使用字符串定位关键点(鉴于Nim的底层编码,很多变量都是使用引用+结构体的数据结构,向上寻找交叉引用),比赛没有做出来,其实就是利用SSE指令集进行大数计算二元二次方程的程序,flag前一半的平方减后一半的平方的11倍为9且满足一定大小

审计后的主要代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
int sub_A52850()
{
FILE *stdin; // rax
__int64 *input_len; // rax
input_len_copy_copy_tmp *input_len_copy; // rsi
__int64 v3; // rdi
__int64 *v4; // rdx
__int64 v5; // rbx
__m128i *first_4_bytes_pointer_2; // rax
__m128i *first_4_bytes_pointer_copy_2; // rdi
__m128i *v8; // rax
input_len_copy_copy_tmp *flag_info_copy_copy_tmp; // rsi
__int64 flag_index; // rbx
_18_m128 *pre_split_flag; // rbp
unsigned __int64 offseted_index; // rdi
__int64 flag_index_2; // rbx
input_len_copy_copy_tmp *input_len_copy_copy_copy; // rbp
_18_m128 *next_flag_info; // rax
unsigned __int64 offseted_index_2; // rsi
bigNumber *pre_flag_square_copy; // rdi
__int64 *v19; // rdx
unsigned __int64 v20; // rcx
__m128i next_flag_square_int128; // xmm4
bigNumber *next_flag_square_multiply_INT_copy; // rdi
__int64 *v23; // rdx
unsigned __int64 v24; // rcx
__m128i INT_loaded_tmp_2; // [rsp+20h] [rbp-78h] BYREF
__m128i INT_loaded_tmp_1; // [rsp+30h] [rbp-68h] BYREF
bigNumber *pre_flag_square; // [rsp+40h] [rbp-58h] BYREF
__int64 v28; // [rsp+48h] [rbp-50h]
bigNumber *next_flag_square[2]; // [rsp+50h] [rbp-48h] BYREF
bigNumber *next_flag_square_multiply_INT; // [rsp+60h] [rbp-38h] BYREF
__int64 v31; // [rsp+68h] [rbp-30h]

nimRegisterGlobalMarker(sub_A527A0);
nimRegisterGlobalMarker(sub_A52790);
nimRegisterGlobalMarker(sub_A52780);
nimRegisterGlobalMarker(sub_A52770);
nimRegisterGlobalMarker(sub_A52760);
nimRegisterGlobalMarker(sub_A52750);
nimRegisterGlobalMarker(sub_A52740);
nimRegisterGlobalMarker(sub_A52730);
nimRegisterGlobalMarker(sub_A52720);
printf_0(off_A56DC8, 1i64); // 打印plz的内容
stdin = (FILE *)get_io(0i64); // 获取stdin
input_len = (__int64 *)scanf(stdin); // 获取输入
input_len_copy = (input_len_copy_copy_tmp *)input_len;
if ( input_len )
*(input_len - 2) += 8i64;
if ( input_len_copy_copy )
{
v3 = *(_QWORD *)&input_len_copy_copy[-1].flag[26];
v4 = (__int64 *)&input_len_copy_copy[-1].flag[26];
*(_QWORD *)&input_len_copy_copy[-1].flag[26] = v3 - 8;
if ( (unsigned __int64)(v3 - 8) <= 7 )
addZCT__Y66tOYFjgwJ0k4aLz4bc0Q((__int64)(&qword_A61F80 + 3), v4);
}
input_len_copy_copy = input_len_copy;
v5 = 0i64;
first_4_bytes_pointer_2 = get_empty_flag_info(5i64);
first_4_bytes_pointer_copy_2 = first_4_bytes_pointer_2;
if ( !first_4_bytes_pointer_2 )
{
if ( input_len_copy )
sub_A4C420(0i64, -1i64);
sub_A4C420(0i64, -1i64);
}
if ( !input_len_copy )
{
if ( !first_4_bytes_pointer_2->m128i_i64[0] )
sub_A4C420(0i64, -1i64);
sub_A4C420(0i64, -1i64);
}
do
{
if ( first_4_bytes_pointer_2->m128i_i64[0] <= (unsigned __int64)v5 )
sub_A4C420(v5, first_4_bytes_pointer_2->m128i_i64[0] - 1);
if ( input_len_copy->char_len <= (unsigned __int64)v5 )
sub_A4C420(v5, input_len_copy->char_len - 1);
first_4_bytes_pointer_2[1].m128i_i8[v5] = input_len_copy->flag[v5];
++v5;
}
while ( v5 <= 4 );
if ( first_4_bytes_pointer_2->m128i_i64[0] != 5 )
goto fail;
v8 = first_4_bytes_pointer_2 + 1;
if ( first_4_bytes_pointer_copy_2[1].m128i_i32[0] != 'galf' )
goto fail;
if ( v8->m128i_i8[4] != '{' )
goto fail;
flag_info_copy_copy_tmp = input_len_copy_copy;
if ( !input_len_copy_copy || input_len_copy_copy->char_len != 42 || input_len_copy_copy->flag[41] != '}' )
goto fail; // 长度必须为42,并且末尾为}
flag_index = 0i64;
pre_split_flag = (_18_m128 *)get_empty_flag_info(18i64);
if ( !pre_split_flag )
sub_A4C420(0i64, -1i64);
do
{
if ( pre_split_flag->pre[0] <= (unsigned __int64)flag_index )
sub_A4C420(flag_index, pre_split_flag->pre[0] - 1);
offseted_index = flag_index + 5;
if ( flag_index + 5 < 0 || offseted_index < flag_index )
sub_A47F70();
if ( flag_info_copy_copy_tmp->char_len <= offseted_index )
sub_A4C420(flag_index + 5, flag_info_copy_copy_tmp->char_len - 1);
pre_split_flag->split_flag[flag_index++] = flag_info_copy_copy_tmp->flag[offseted_index];
}
while ( flag_index <= 17 ); // 这里对flag拆出前一半
flag_index_2 = 0i64;
string_to_int128(pre_split_flag, 10i64, &pre_split_flag_INT);
input_len_copy_copy_copy = input_len_copy_copy;
next_flag_info = (_18_m128 *)get_empty_flag_info(18i64);
if ( !next_flag_info )
{
if ( input_len_copy_copy_copy )
sub_A4C420(0i64, -1i64);
sub_A4C420(0i64, -1i64);
}
if ( !input_len_copy_copy_copy )
{
if ( !next_flag_info->pre[0] )
sub_A4C420(0i64, -1i64);
sub_A4C420(23i64, -1i64);
}
do
{
if ( next_flag_info->pre[0] <= (unsigned __int64)flag_index_2 )
sub_A4C420(flag_index_2, next_flag_info->pre[0] - 1);
offseted_index_2 = flag_index_2 + 23;
if ( flag_index_2 + 23 < 0 || offseted_index_2 < flag_index_2 )
sub_A47F70();
if ( input_len_copy_copy_copy->char_len <= offseted_index_2 )
sub_A4C420(flag_index_2 + 23, input_len_copy_copy_copy->char_len - 1);
next_flag_info->split_flag[flag_index_2++] = input_len_copy_copy_copy->flag[offseted_index_2];
}
while ( flag_index_2 <= 17 ); // 同样的,分离后一半flag到新的flaginfo结构体中
string_to_int128(next_flag_info, 10i64, &next_flag_INT);// 前18字节转数字
string_to_int128((_18_m128 *)&calced_int128_info_1, 10i64, &EightByteLenMagicNum_1_0);
string_to_int128((_18_m128 *)&calced_int128_info_2, 10i64, (bigNumber **)&EightByteLenMagicNum_2_0);// 字符串转十进制int128
INT_loaded_tmp_1 = _mm_loadu_si128((const __m128i *)&EightByteLenMagicNum_1_0);// 加载128位值
INT_loaded_tmp_2 = _mm_loadu_si128((const __m128i *)&pre_split_flag_INT);
if ( !(unsigned __int8)sub_A52080(&INT_loaded_tmp_1, &INT_loaded_tmp_2) )
goto fail;
INT_loaded_tmp_1 = _mm_loadu_si128((const __m128i *)&pre_split_flag_INT);
INT_loaded_tmp_2 = _mm_loadu_si128((const __m128i *)&EightByteLenMagicNum_2_0);
if ( !(unsigned __int8)sub_A52080(&INT_loaded_tmp_1, &INT_loaded_tmp_2) )
goto fail;
pre_flag_square = 0i64;
v28 = 0i64;
INT_loaded_tmp_1 = *(__m128i *)&pre_split_flag_INT;
INT_loaded_tmp_2 = *(__m128i *)&pre_split_flag_INT;
big_number_square(&INT_loaded_tmp_1, &INT_loaded_tmp_2, &pre_flag_square);
pre_flag_square_copy = pre_flag_square;
if ( pre_flag_square )
*(_QWORD *)&pre_flag_square[-1].number += 8i64;
if ( (_QWORD)pre_flag_square_copy_copy )
{
v19 = (__int64 *)(pre_flag_square_copy_copy - 16);
v20 = *(_QWORD *)(pre_flag_square_copy_copy - 16) - 8i64;
*(_QWORD *)(pre_flag_square_copy_copy - 16) = v20;
if ( v20 <= 7 )
addZCT__Y66tOYFjgwJ0k4aLz4bc0Q((__int64)(&qword_A61F80 + 3), v19);
}
*(_QWORD *)&pre_flag_square_copy_copy = pre_flag_square_copy;
next_flag_square[0] = 0i64;
next_flag_square[1] = 0i64;
BYTE8(pre_flag_square_copy_copy) = v28;
INT_loaded_tmp_1 = *(__m128i *)&next_flag_INT;
INT_loaded_tmp_2 = *(__m128i *)&next_flag_INT;
big_number_square(&INT_loaded_tmp_1, &INT_loaded_tmp_2, next_flag_square);
next_flag_square_int128 = _mm_load_si128((const __m128i *)next_flag_square);
next_flag_square_multiply_INT = 0i64;
v31 = 0i64;
INT_loaded_tmp_1 = next_flag_square_int128;
bit_number_multiply(&INT_loaded_tmp_1, 11u, (char *)&next_flag_square_multiply_INT);
next_flag_square_multiply_INT_copy = next_flag_square_multiply_INT;
if ( next_flag_square_multiply_INT )
*(_QWORD *)&next_flag_square_multiply_INT[-1].number += 8i64;
if ( (_QWORD)next_flag_square_multiply_INT_copy_copy )
{
v23 = (__int64 *)(next_flag_square_multiply_INT_copy_copy - 16);
v24 = *(_QWORD *)(next_flag_square_multiply_INT_copy_copy - 16) - 8i64;
*(_QWORD *)(next_flag_square_multiply_INT_copy_copy - 16) = v24;
if ( v24 <= 7 )
addZCT__Y66tOYFjgwJ0k4aLz4bc0Q((__int64)(&qword_A61F80 + 3), v23);
}
*(_QWORD *)&next_flag_square_multiply_INT_copy_copy = next_flag_square_multiply_INT_copy;
INT_loaded_tmp_1 = _mm_loadu_si128((const __m128i *)&pre_flag_square_copy_copy);
BYTE8(next_flag_square_multiply_INT_copy_copy) = v31;
INT_loaded_tmp_2 = _mm_loadu_si128((const __m128i *)&next_flag_square_multiply_INT_copy_copy);
bit_number_subtract(INT_loaded_tmp_1.m128i_i64, INT_loaded_tmp_2.m128i_i64, (char *)&subtracted_bitNumber);
string_to_int128((_18_m128 *)&xmmword_A56D10, 10i64, &9_int128);
INT_loaded_tmp_1 = _mm_loadu_si128((const __m128i *)&subtracted_bitNumber);
INT_loaded_tmp_2 = _mm_loadu_si128((const __m128i *)&9_int128);
if ( (unsigned __int8)bitNumber_compare(&INT_loaded_tmp_1, &INT_loaded_tmp_2) )
{
qword_A5A660 = 1i64;
}
else
{
fail:
if ( qword_A5A660 != 1 )
return printf_0(off_A56CC0, 1i64);
}
return printf_0(off_A56CE8, 1i64);
}

请参考第六届蓝帽杯WP

⬆︎TOP