一个旧的Android CTF,主要分析一下反解算法是怎么写的
先分析下chek()是怎么实现的,等下再去看native层。
这段代码的主要作用是从数据库中取出secret值(用hello的MD5值作为name对应的secret值)与我们输入的值(经过getSecret()方法处理)进行比较相等就返回true。
分析完check()方法之后,现在我们可知:
那接下来我们去分析一下getSecret()这个方法。
用ida打开so文件之后,通过命名惯例用java定位到函数位置,再按F5修改以下参数类型方便分析
先初步分析这段代码来猜测里面的逻辑(因为不知道参数的内容,所以猜测不一定正确)我们依旧可以知道几点
在函数开始的地方下断点,在手机上点击_TRY IT!_按钮之后我们可以中断在这里,这时候我们可以看到它的base_string字符串
_F8_继续往下跟,到获取dest[]的地方
分析后可以发现数组的内容是从0~0x44的dw数组。
最后一个循环
接下来我们就可以写这个算法的反解脚本了,写反解脚本可以从最后一个循环往前推过去。
结果字符串循环对字符进行与运算,然后再取模128确保结果不大于ASCII码的最大值->然后将计算完成的字符逐个在base_string里面找到字符对应的索引值(即dest[k]的值)->如果这个索引值小于16(dest[]中的最小值0x10)表示它对应的索引值在base_string的前16位->就把下标值加上base_string的长度->最后打印字符的时候还要把索引值([dest[i]])减去0x10
over~
static_str
=
'0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!{|}~'
now
=
'kEvKc|roAkNADgGExUeq'
for
i, each
in
enumerate
(now):
tmp
=
chr
((
ord
(each)^i)
%
128
)
index
=
static_str.find(tmp)
if
index <
16
:
index
=
index
+
len
(static_str)
print
(static_str[index
-
16
], end
=
'')
static_str
=
'0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!{|}~'
now
=
'kEvKc|roAkNADgGExUeq'
for
i, each
in
enumerate
(now):
tmp
=
chr
((
ord
(each)^i)
%
128
)
index
=
static_str.find(tmp)
if
index <
16
:
index
=
index
+
len
(static_str)
print
(static_str[index
-
16
], end
=
'')
1
2
3
4
5
6
7
8
|
static_str = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!{|}~'
now = 'kEvKc|roAkNADgGExUeq'
for i, each in enumerate (now):
tmp = chr (( ord (each)^i) % 128 )
index = static_str.find(tmp)
if index < 16 :
index = index + len (static_str)
print (static_str[index - 16 ], end = '')
|
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)