2019看雪CTF-Q2-丛林的秘密

2019看雪CTF-Q2-丛林的秘密

题目说是一个Android相关的题,结果却和Android没太大关系。
运行环境为Android8.0以上,手上没有符合条件的机器,于是开始用IDA静态分析。
从so里面解密出一个html文件:


key检验逻辑是用WebAssembly实现的。

大概逻辑:

  1. 将输入的32字节的字符串分成8组,每组的4个字节做不同的变换。
  2. 将变换后生成的32个字节做最终校验,最终的校验是一个多元方程组。

逻辑清楚了,解题思路也就有了:

  1. 把方程组还原,求出变换后的32字节。
  2. 使用暴力破解的方式求出变换前的值。

最终校验逻辑在wasm-370270be-12中,使用以下Python代码可以解析出方程组:

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
stack = []
memory = {}
with open('wasm-370270be-12') as fi:
for line in fi:
line = line.strip()

if 'func' in line or '(local' in line or 'end' in line or 'br_if' in line or 'block' in line:
# 忽略无关指令、标记
continue
elif 'set_local' in line:
offset = int(line.split()[1])
data = stack.pop()
memory[offset] = data
elif 'i32.load8_s' in line:
offset = line.split()[1].split('=')[1]
offset = int(offset)
stack.pop()
stack.append('a%d'%(offset-1024))
elif 'i32.const' in line:
data = line.split()[1]
stack.append(data)
elif 'get_local' in line:
offset = line.split()[1]
offset = int(offset)
data = memory[offset]
stack.append(data)
elif 'i32.mul' in line:
num1 = stack.pop()
num2 = stack.pop()
result = num2+'*'+num1
stack.append(result)
elif 'i32.add' in line:
num1 = stack.pop()
num2 = stack.pop()
result = '('+num2+'+'+num1+')'
stack.append(result)
elif 'i32.shl' in line:
# 把移位转换为乘法
num1 = stack.pop()
num2 = stack.pop()
result = num2+'*%d'% 2**int(num1)
stack.append(result)
elif 'tee_local' in line:
offset = line.split()[1]
offset = int(offset)
memory[offset] = stack[-1]
elif 'i32.ne' in line or 'i32.eq' in line:
# 比较指令,在此处输方程
num1 = stack.pop()
num2 = stack.pop()
result = num2+'='+num1
stack.append(result)
print result
else:
print line
raise Exception('Invalid instruction')

```解析出的方程组:
```plain
((a30*48+a31*174)+(((((((((((((((((((((((((((((a1*111+a0*108)+a2*92)+a3*194)+a4*124)+a5*240)+a6*126)+a7*81)+a8*144)+a9*103)+a10*161)+a11*50)+a12*67)+a13*15)+a14*127)+a15*232)+a16*188)+a17*19)+a18*233)+a19*153)+a20*231)+a21*40)+a22*112)+a23*106)+a24*135)+a25*90)+a26*67)+a27*20)+a28*248)+a29*45))=359512
((a30*13+a31*101)+(((((((((((((((((((((((((((((a1*78+a0*227)+a2*195)+a3*81)+a4*10)+a5*248)+a6*186)+a7*171)+a8*148)+a9*194)+a10*40)+a11*180)+a12*17)+a13*212)+a14*104)+a15*90)+a16*178)+a17*26)+a18*225)+a19*209)+a20*32)+a21*169)+a22*94)+a23*156)+a24*154)+a25*56)+a26*244)+a27*149)+a28*120)+a29*131))=387514
((a30*240+a31*53)+((((((((((((((((((((((((((((a1*44+a0*83)+a2*95)+a3*131)+a4*30)+a5*55)+a6*46)+a7*36)+a8*67)+a9*109)+a10*69)+a12*8)+a13*248)+a14*40)+a15*154)+a17*86)+(a16+a11)*251)+a18*112)+a19*9)+a20*174)+a21*197)+a22*38)+a23*14)+a24*202)+a25*60)+a26*117)+a27*188)+a28*136)+a29*145))=301487
(((a30+a17)*234+(a31+a29)*25)+(((((((((((((((((((((((((((a1*162+a0*152)+a2*112)+a3*57)+a4*102)+a5*182)+a6*10)+a7*139)+a8*30)+a9*7)+a10*145)+a11*127)+a12*148)+a13*5)+a14*165)+a15*109)+a16*110)+a18*113)+a19*33)+a20*192)+a21*45)+a22*65)+a23*105)+a24*140)+a25*116)+a26*35)+a27*48)+a28*155))=296549
((a30*82+a31*113)+((((((((((((((((((((((((((((a1*189+a0*101)+a2*236)+a3*118)+a4*141)+a5*148)+a6*197)+a7*7)+a9*104)+a10*45)+a11*130)+a12*39)+a13*164)+a14*88)+a15*241)+a17*107)+(a16+a8)*108)+a18*76)+a19*34)+a20*210)+a21*29)+a22*156)+a23*90)+a24*139)+a25*151)+a26*10)+a27*97)+a28*209)+a29*46))=344514
((a30*179+(a31+a16)*72)+((((((((((((((((((((((((((((a1*13+a0*182)+a2*50)+a3*102)+a4*155)+a5*230)+a6*3)+a7*225)+a8*237)+a9*163)+a10*38)+a11*176)+a12*115)+a13*105)+a14*203)+a15*26)+a17*111)+a18*96)+a19*240)+a20*139)+a21*117)+a22*153)+a23*120)+a24*151)+a25*25)+a26*49)+a27*90)+a28*98)+a29*7))=346892
((a30*156+a31*61)+((((((((((((((((((((((((((a1*150+a0*170)+a4*110)+a5*99)+a6*127)+(a7+a3)*101)+a8*203)+a9*209)+a11*100)+(a12+a2)*226)+a13*186)+a14*252)+a15*39)+a16*65)+a17*67)+a18*225)+a19*174)+a20)+a22*214)+(a21+a10)*187)+a23*22)+a24*74)+a25*99)+a26*129)+a27*254)+a28*13)+a29*97))=386678
((a30*154+a31*117)+(((((((((((((((((((((((((((((a1*88+a0)+a2*118)+a3*232)+a4*60)+a5*252)+a6*133)+a7*177)+a8*185)+a9*222)+a10*32)+a11*48)+a12)+a13*242)+a14*240)+a15*218)+a16*81)+a17*22)+a18*73)+a19*171)+a20*139)+a21*72)+a22*106)+a23*62)+a24*156)+a25*134)+a26*220)+a27*19)+a28*77)+a29*94))=348667
((a30*220+a31*151)+(((((((((((((((((((((((((((((a1*173+a0*189)+a2*41)+a3*39)+a4*26)+a5*232)+a6*75)+a7*75)+a8*95)+a9*7)+a10*117)+a11*96)+a12*211)+a13*130)+a14*228)+a15*143)+a16*91)+a17*247)+a18*43)+a19*122)+a20*131)+a21*52)+a22*48)+a23*29)+a24*111)+a25*38)+a26*19)+a27*242)+a28*162)+a29*70))=316884
((a30*231+a31*92)+(((((((((((((((((((((((((((((a1*136+a0*236)+a2*147)+a3*104)+a4*79)+a5*204)+a6*220)+a7*25)+a8*38)+a9*233)+a10*165)+a11*20)+a12*174)+a13*120)+a14*214)+a15*18)+a16*233)+a17*119)+a18*244)+a19*143)+a20*126)+a21*226)+a22*77)+a23*33)+a24*189)+a25*5)+a26*150)+a27*160)+a28*14)+a29*112))=372620
((a30*50+a31*203)+((((((((((((((((((((((((((((a1*38+a0*191)+a2*193)+a3*250)+a4*212)+a5*175)+a6*39)+a7*94)+a8*183)+a9*172)+a10*171)+a11*163)+a12*129)+a13*165)+a14*64)+a15*170)+a16*199)+a18*167)+a20*216)+(a19+a17)*2)+a21*252)+a22*184)+a23*187)+a24*97)+a25*109)+a26*98)+a27*135)+a28*192)+a29*88))=413102
((a30*43+a31*196)+(((((((((((((((((((((((((((a1*81+a0*203)+a2*252)+a3*104)+a4*248)+a5*156)+a6*199)+a7*46)+a9*240)+a10*149)+a11*155)+a12*102)+a13*95)+a14*51)+a17*62)+a18*58)+((a15+a8)+a16)*208)+a19*117)+a20*72)+a21*23)+a22*193)+a23*193)+a24*226)+a25*217)+a26*106)+a27*147)+a28*136)+a29*16))=428661
((a30*80+a31*49)+(((((((((((((((((((((((((((((a1*69+a0*144)+a2*224)+a3*107)+a4*225)+a5*83)+a6*15)+a7*10)+a8*214)+a9*152)+a10*24)+a11*136)+a12*165)+a13*208)+a14*38)+a15*67)+a16*201)+a17*180)+a18*158)+a19*75)+a20*111)+a21*65)+a22*211)+a23*220)+a24*135)+a25*125)+a26*216)+a27*105)+a28*122)+a29*112))=371484
((a30*76+a31*129)+((((((((((((((((((((((((((((a1*68+a0*143)+a2*127)+a3*51)+a5*88)+a6*153)+a7*9)+a8*149)+a9*107)+a10*178)+a11*166)+a12*190)+a13*177)+a14*99)+a15*71)+a16*63)+a17*233)+a18*58)+a19*132)+a20*109)+a21*75)+a23*95)+(a22+a4)*152)+a24*74)+a25*195)+a26*90)+a27*251)+a28*205)+a29*8))=350848
((a30*31+a31*102)+((((((((((((((((((((((((((((a1*146+a0*209)+a2*59)+a3*38)+a4*40)+a5*56)+a6*182)+a7*245)+a8*67)+a9*202)+a10*177)+a12*26)+a13*126)+a14*161)+a15*95)+a16*133)+a17*123)+a18*163)+a19*30)+a20*88)+a21*219)+a22*5)+a23*86)+a25*156)+(a24+a11)*183)+a26*253)+a27*97)+a28*43)+a29*128))=334408
((a30*91+a31*136)+(((((((((((((((((((((((((((((a1*223+a0*146)+a2*137)+a3*228)+a4*226)+a5*155)+a6*170)+a7*92)+a8*77)+a9*17)+a10*22)+a11*128)+a12*20)+a13*171)+a14*142)+a15*170)+a16*192)+a17*49)+a18*200)+a19*178)+a20*154)+a21*42)+a22*5)+a23*159)+a24*251)+a25*152)+a26*7)+a27*247)+a28*145)+a29*39))=382822
((a30*121+(a31+a7)*205)+((((((((((((((((((((((((((((a1*204+a0*169)+a2*244)+a3*26)+a4*77)+a5*134)+a6*221)+a8*149)+a9*47)+a10)+a11*197)+a12*82)+a13*195)+a14*123)+a15*219)+a16*116)+a17*80)+a18*13)+a19*231)+a20*173)+a21*192)+a22*220)+a23*224)+a24*108)+a25*104)+a26*56)+a27*152)+a28*84)+a29*226))=420160
((a30*73+a31*95)+(((((((((((((((((((((((((((a1*45+a0*184)+a2*176)+a5*161)+a6*142)+a7*171)+a8*215)+a9*83)+a10*233)+a11*184)+a12*171)+a13*182)+(a14+a3)*126)+a15*111)+(a16+a4)*118)+a17*67)+a18*92)+a19*219)+a20*70)+a21*252)+a22*194)+a23*21)+a24*245)+a25*204)+a26*48)+a27*150)+a28*39)+a29*85))=402263
((a30*170+a31*120)+(((((((((((((((((((((((((((((a1*224+a0*48)+a2*164)+a3*138)+a4*92)+a5*3)+a6*191)+a7*94)+a8*19)+a9*50)+a10*34)+a11*167)+a12*75)+a13*72)+a14*238)+a15*15)+a16*111)+a17*216)+a18*84)+a19*40)+a20*145)+a21*112)+a22*140)+a23*204)+a24*154)+a25*195)+a26*175)+a27*250)+a28*202)+a29*169))=366968
((a30*170+a31*68)+(((((((((((((((((((((((((((a2*189+a0*112)+a3*50)+a4*247)+a5*240)+a6*164)+a7*5)+a8*139)+a9*56)+(a10+a1)*19)+a11*4)+a12*23)+a14*96)+a15*254)+a16*63)+a17*247)+a18*149)+a19*183)+a20*128)+a21*147)+a22*213)+a23*243)+(a24+a13)*172)+a25*144)+a26*246)+a27*25)+a28*106)+a29*176))=384909
((a31*31+(a30+a24)*41)+((((((((((((((((((((((((((a1*22+a0*184)+a2*183)+a3*128)+a4*149)+a6*227)+a7*113)+a8*65)+a9*159)+a10*74)+a11*170)+a12*186)+(a13+a5)*174)+a14*211)+a15)+a17*156)+a18*253)+(a19+a16)*223)+a20*241)+a21*252)+a22*148)+a23*93)+a25*125)+a26*27)+a27*136)+a28*78)+a29*248))=425203
((a30*82+a31*39)+((((((((((((((((((((((((((a1*237+a0*155)+a2*242)+a4*145)+a5*99)+a6*239)+a8*3)+a9*43)+a10*46)+a11*155)+a12*208)+a13*75)+a15*181)+a16*197)+(a17+a14)*140)+(a18+a3)*10)+a19*170)+a20*142)+a21*212)+a22*186)+a23*27)+(a24+a7)*105)+a25*118)+a26*198)+a27*243)+a28*13)+a29*113))=372162
((a31*50+(a30+a23)*136)+(((((((((((((((((((((((((((a1*206+a0*207)+a2*127)+a3*58)+a4*91)+a6*7)+a7*17)+a8*63)+a9*180)+a10*40)+a11*96)+a12*202)+a13*185)+a14*68)+a15*72)+a16*240)+a17*36)+a18*139)+a19*199)+a20*76)+a21*229)+a22*159)+a24*94)+a25*19)+a26*3)+a28*45)+(a27+a5)*87)+a29*6))=297509
((a30*90+a31*12)+((((((((((((((((((((((((((((a1*215+a0*115)+a2*40)+a3*166)+a4*87)+a5*83)+a6*74)+a7*202)+a9*149)+a10*114)+a11*76)+a12*204)+a13*218)+a14*63)+a15*123)+a16*9)+a17*172)+a18*38)+a19*138)+a20*35)+a21*200)+a22*221)+a23*144)+a25*108)+a26)+(a24+a8)*235)+a27*245)+a28*153)+a29*184))=372215
((a30*114+a31*36)+((((((((((((((((((((((((((((a1*190+a0*123)+a2*55)+a3*180)+a4*84)+a5*231)+a6*81)+a7*116)+a8*61)+a9*3)+a10*94)+a12*190)+a13*187)+a14*142)+a15*62)+a16*225)+a17*240)+a18*179)+a19*150)+a20*77)+a22*196)+(a21+a11)*85)+a23*12)+a24*144)+a25*122)+a26*28)+a27*224)+a28*248)+a29*143))=370337
((a30*190+(a31+a11)*122)+((((((((((((((((((((((((((a1*202+a0*2)+a2*40)+a3*224)+a4*154)+a5*65)+a7*241)+a8*13)+a9*213)+a10*176)+(a12+a6)*30)+a14*14)+a15*191)+a16*80)+a17*116)+a18*74)+a19*70)+a20*32)+a21*189)+a22*76)+a23*95)+a25*103)+(a24+a13)*158)+a26*7)+a27*201)+a28*204)+a29*91))=314564
((a30*5+a31*176)+((((((((((((((((((((((((((((a1*154+a0*42)+a2*223)+a3*165)+a4*155)+a5*101)+a6*75)+a7*95)+a8*253)+a9*14)+a10*158)+a11*199)+a12*110)+a13*89)+a14*205)+a15*202)+a17*162)+a18*67)+a19*30)+a20*115)+a22*27)+(a21+a16)*83)+a23*31)+a24*118)+a25*160)+a26*248)+a27*66)+a28*88)+a29*44))=325974
((a31*84+(a30+a16)*125)+(((((((((((((((((((((((((a1*168+a0*34)+a3*160)+a4*243)+a5*41)+a6*146)+a8*62)+a9*235)+a10*185)+a11*180)+a12*10)+a13*150)+a15*140)+a17*114)+a18*35)+a19*34)+a20*38)+a21*123)+a22*163)+a24*5)+(a23+a14)*208)+(a25+a7)*29)+a26*207)+a27*111)+(a28+a2)*72)+a29*65))=307088
((a30*140+a31*197)+((((((((((((((((((((((((((a1*11+a0*18)+a3*175)+a4*44)+a5*128)+a6*32)+a7*100)+a9*116)+a10*253)+a11*213)+a12*67)+a13*16)+a14*171)+a15*178)+a17*7)+a18*162)+a19*152)+a20*78)+a21*167)+a22*177)+(a23+a16)*97)+(a24+a2)*26)+a25*155)+a26*127)+(a27+a8)*21)+a28*243)+a29*188))=322340
((a30*152+(a31+a27)*7)+(((((((((((((((((((((((((((a1*110+a0*140)+a2*164)+a3*208)+a4*72)+a5*113)+a6*9)+a7*47)+a8*179)+a9*166)+a10*51)+a11*34)+a12*91)+a13*184)+a14*89)+a15*162)+a16*233)+a18*156)+a20*244)+(a19+a17)*127)+a21*183)+a22*193)+a23*138)+a24*242)+a25*90)+a26*193)+a28*252)+a29*113))=380716
((a30*197+(a31+a2)*75)+((((((((((((((((((((((((((((a1*105+a0*133)+a3*146)+a4*173)+a5*27)+a6*97)+a7*142)+a8*164)+a9*15)+a10*10)+a11*177)+a12*239)+a13*141)+a14*189)+a15*67)+a16*153)+a17*108)+a18*206)+a19*210)+a20*171)+a21*252)+a22*84)+a23*249)+a24*7)+a25*168)+a26*100)+a27*30)+a28*196)+a29*244))=393331
((a30*53+a31*79)+((((((((((((((((((((((((((((a1*221+a0*147)+a2*57)+a3*186)+a4*69)+a5*230)+a6*167)+a7*3)+a8*220)+a9*63)+a11*235)+a12*156)+a13*146)+a14*75)+a15*198)+a16*204)+a17*197)+a18*59)+a19*61)+a20*179)+a21*47)+a22*221)+a23*127)+a24*210)+a26*241)+(a25+a10)*218)+a27*135)+a28*196)+a29*185))=430295

使用MATLAB解出的结果:

1
[83, 48, 109, 51, 116, 105, 109, 101, 95, 108, 49, 116, 116, 49, 101, 95, 99, 48, 100, 101, 95, 49, 115, 95, 117, 115, 51, 102, 117, 108, 51, 51]

接下来就是暴力破解了,在原html文件中添加一个暴力破解函数,并调用。

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
function bruteforce() {
var a, b, c, d;
var start = 32;
var end = 127;
var value;
var s = "";
var flag = true
var expected_list = [83, 48, 109, 51, 116, 105, 109, 101, 95, 108, 49, 116, 116, 49, 101, 95, 99, 48, 100, 101, 95, 49, 115, 95, 117, 115, 51, 102, 117, 108, 51, 51];
for (var i = 0; i < 8; ++i) {
var flag = true
for (a = start; a < end; ++a) {
for (b = start; b < end; ++b) {
for (c = start; c < end; ++c) {
value = s + String.fromCharCode(a) + String.fromCharCode(b) + String.fromCharCode(c);
value = padding(value);
instance.exports.set_input_flag_len(value.length);
for (var ii = 0; ii < value.length; ii++) {
instance.exports.set_input_flag(value[ii].charCodeAt(), ii);
}
var ret = instance.exports.check_key();
var buf = new Uint8Array(instance.exports.memory.buffer);
if (buf[1024 + i * 4 + 0] == expected_list[i * 4 + 0] && buf[1024 + i * 4 + 1] == expected_list[i * 4 + 1] && buf[1024 + i * 4 + 2] == expected_list[i * 4 + 2]) {
for (d = start; d < end; ++d) {
value = s + String.fromCharCode(a) + String.fromCharCode(b) + String.fromCharCode(c) + String.fromCharCode(d);
value = padding(value);
instance.exports.set_input_flag_len(value.length);
for (var ii = 0; ii < value.length; ii++) {
instance.exports.set_input_flag(value[ii].charCodeAt(), ii);
}
var ret = instance.exports.check_key();
var buf = new Uint8Array(instance.exports.memory.buffer);
if (buf[1024 + i * 4 + 0] == expected_list[i * 4 + 0] && buf[1024 + i * 4 + 1] == expected_list[i * 4 + 1] && buf[1024 + i * 4 + 2] == expected_list[i * 4 + 2] && buf[1024 + i * 4 + 3] == expected_list[i * 4 + 3]) {
s += String.fromCharCode(a) + String.fromCharCode(b) + String.fromCharCode(c) + String.fromCharCode(d);
console.log(value);
a = b = c = end;
break;
}
}
}
}
}

}
}
}
function padding(s){
var len = s.length;
for (var i = s.length ; i < 32; ++i) {
s += ' '
}
return s;
}

最终结果:
K9nXu3_2o1q2_w3bassembly_r3vers3