BlueBird_apk2
萧禾财 Lv4

观察题目

是一个apk文件,用jadx打开 好像是native层逆向

解压apk文件打开lib文件夹 找 .so文件

image-20220731153549157

用IDA打开

找到两个关键函数 proc01 和 verify

image-20220731153652436

verify有核实验证之意可能是check flag的函数

还原这两个函数逻辑

proc01

此函数中调用了微软的一些库函数

image-20220731154238516

大概是一些格式化函数,不是关键

image-20220731154529742

这个操作就是交换 一个字节的高四位与低四位

还原代码:

1
2
3
4
5
6
for (size_t i = 0; i < 32; i++)
{
/* code */
unsigned char n = d[i] >> 4;
d[i] = n + (n ^ (d[i] << 4)) - (n & ~(d[i] << 4));
}

verify

有按位与 有按位或 有取反 操作,并不懂最后的操作是干啥

但是影响不大 IDA生成的伪代码可以直接借来利用

原函数是从0~31的顺序操作并且和后一位操作有关 因此我们要逆向的话要反着操作才对

代码:

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
char *input; // edi
int len; // eax
int v3; // ebx
char v4; // cl
char v5; // cl
char v6; // cl
char v7; // dl
char v8; // al
char v9; // cl
int v11; // [esp+10h] [ebp-1Ch]
int v12; // [esp+14h] [ebp-18h]

input = d;
// proc01(s);
len = 32;

v3 = 31;
v11 = len;
do
{
v6 = input[v3];
v12 = v3 + 1;
v7 = input[(len + v3 + 1) % len];
v8 = v6 | v7;
v9 = ~v6;
if ( (v3 & 1) != 0 )
{
v8 -= v7;
v4 = v7 & v9;
}
else
{
v4 = v9 - (v9 | v7);
}
v5 = v8 + v4;
input = d;
len = v11;
d[v3--] = v5;
}
while ( v3>=0 );

完整脚本

最后根据密文d

image-20220731160543851

我们完成脚本

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
#include <stdio.h>
void main()
{
unsigned char d[32] = {0x86, 0x96, 0x12, 0xC1, 0x03, 0x73, 0x05, 0x96, 0x20, 0x21,
0xC2, 0x33, 0xF2, 0x82, 0x06, 0xF7, 0xC7, 0x80, 0xC6, 0x43,
0x52, 0xA0, 0x82, 0x03, 0xC2, 0x83, 0xB3, 0x43, 0xA1, 0x50,
0x43, 0xE0};
char *input; // edi
int len; // eax
int v3; // ebx
char v4; // cl
char v5; // cl
char v6; // cl
char v7; // dl
char v8; // al
char v9; // cl
int v11; // [esp+10h] [ebp-1Ch]
int v12; // [esp+14h] [ebp-18h]

input = d;
len = 32;
v3 = 31;
v11 = len;
do
{
v6 = input[v3];
v12 = v3 + 1;
v7 = input[(len + v3 + 1) % len];
v8 = v6 | v7;
v9 = ~v6;
if ( (v3 & 1) != 0 )
{
v8 -= v7;
v4 = v7 & v9;
}
else
{
v4 = v9 - (v9 | v7);
}
v5 = v8 + v4;
input = d;
len = v11;
d[v3--] = v5;
}
while ( v3>=0 );



for (size_t i = 0; i < 32; i++)
{
/* code */
unsigned char n = d[i] >> 4;
d[i] = n + (n ^ (d[i] << 4)) - (n & ~(d[i] << 4));
}
for (size_t i = 0; i < 32; i++)
{
/* code */
printf("%c",d[i]);
}

}

跑出结果为:X0YxdTc3ZXJfUzR2M19UaDNfVzByMWRf

直接提交不对 base64解码

1
_F1u77er_S4v3_Th3_W0r1d_

要去除两端的下划线才行

1
F1u77er_S4v3_Th3_W0r1d

不知为何

最后MD5加密一下就得到了flag

flag{03cd6eb78a6c70f16bfbfd3508f7065f}

  • 本文标题:BlueBird_apk2
  • 本文作者:萧禾财
  • 创建时间:2022-07-31 14:38:24
  • 本文链接:https://ipartmentxhc.github.io/2022/07/31/BlueBird-apk2/
  • 版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!