-
前言
最近在学习Android,借此机会,在网上找到一个练手的apk,CTF真的是网安各方面入手的一个好比赛,找个找个apk学学对so文件的静态分析。对于我而言,更多的是学习他的思路,以及说是IDA的用法等等
-
分析
拖入后发现首先会去调用类com.example.mobicrackndk.CrackMe
对代码进行分析后,发现有个onClick,要成功执行的话,需要调用到testFlag()这个方法,这个方法,根据前面声明可以发现是在native层,因此只能通过去分析so文件来查看了
找到动态注册的函数表
跟踪进入400C,发现testFlag对应的函数是abcdefghijklmn
进入伪代码中,发现会将输入的字符串转化为Char类型
对代码进行分析,可以发现会对输入的长度进行判断,长度为 16即可进入下一步,接着是取前8位,与seed进行比对,seed的值为QflMn`fH,如果一样的话会去找类,获取方法名.....
回到函数中,发现会去获取GetStaticFieldID,静态函数中string类型key的值,在jadx中全局搜索,发现key值为c7^WVHZ, 还用到了reverse函数,要倒过来.....
然后一样会进行前面的循环
总结整个对比过程:将输入的16字节字符串进行处理,然后使用两个8字节字符串与处理过后的输入数据进行对比,根据网上的WriteUp来看,运行结果是错误的,说是.init_array中有错误,查阅资料后发现,.iniy_array中初始化了一些信息,在程序段中进行跳转
发现执行了一个__init_my函数,跟进
跟进后发现,strlen获取seed的长度,从前面可以看出,strlen的长度为8,也就是说前8位的char值还要减3
摘自网上的writeup:
using namespace std;
int main()
{
char temp[17] = "QflMn`fH,ZHVW^7c";
for(int i = 0; i < 16; i++)
{
if(i < 8)
temp[i] -= 3;
printf("%c", temp[i] + i);
}
return 0;
}
// Python
s = "QflMn`fH,ZHVW^7c"
flag = ""
for idx,c in enumerate(s):
tmp = ord(c)
if idx<8:
tmp-=3
flag +=chr(tmp+idx)
print flag
-
总结
不理解为啥最后这个因为初始化的原因,还需要-3,而不是+3,但是从此次静态分析中,学习到了调用的一些jndi结构体,对静态分析有进一步的了解,特别是对native层的分析,静态分析了解完后,希望下次能够对动态分析再次学习!!!需要练手的师傅们,可以点击公众号下方,加群后,拉进知识星球下载APK
原文始发于微信公众号(Undoubted Security):Android 2015 - 海峡两岸 - 一个 APK,逆向试试吧
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论