算法还原实战练习4
分析样例下载:链接: https://pan.baidu.com/s/1Mb6U4D24SlG_K6n1dxszOQ 密码: ikpe
第一题algorithmbase_40.apk
直接ida打开libnative-lib.so。找到Java_com_kanxue_algorithmbase_MainActivity_encodeFromJni_140。然后根据返回值看来源。最后v15是返回的。然后v8=&v15。然后v8的值是v17逐个字节赋值的。所以关键在于v17。关键函数直接定位出来在sub_AB90.另外看v16的值。和MD5的算法有点像。可能也是一个hash算法。
接着看到里面只有一个函数sub_9AFC。直接进去看看。
进去后也只有一个函数sub_9BA4。继续进去看看是不是算法的部分
果然看到熟悉的算法部分。搜索一下常量看看有啥收获不
看到直接就是sha1的关键常量。我们验证下看看
先frida抓一下计算的结果
1 | input: cKGiDKZnhktnzCxsXzGP output: ec048f770484aee853187e413d1dd4f478ce842e |
然后验证一下kanxue_imyang_40_cKGiDKZnhktnzCxsXzGP的sha1值是否和结果一致。第一题搞定
==========================================================================================
第二题algorithmbase_41.apk
先ida简单看下关键函数处
然后frida打印一下结果
1 | input: fgfPLREXkGWWzfVPvtSjGxkkBsFP output: d58aa1c17830271e523dcc59808ec75e1f6660ad |
然后再用sha1标准的计算一下kanxue_imyang_41_fgfPLREXkGWWzfVPvtSjGxkkBsFP的结果是b5d3a0ebffb5eb1048e19455bcea310068833c0e
说明可能是sha1算法是经过修改的或者是input值还有其他的拼接。先排查下sha1标准算法的常量是否被修改了。
然后用ida在sub_9BA4函数中挨个搜索一遍。然后发现0x8f1bbcdc和0xca62c1d6搜索不到。估计是被修改了。在ida中找0x6ed9eba1的下一个常量是0x70E44324。再下一个常量是0x359D3E2A。发现这个变动后。我们找个sha1的算法来修改常量测试一下结果。我随便找个项目测试下https://github.com/vog/sha1.git
1 | int main(int /* argc */, const char ** /* argv */) |
输出和标准的一样。确定人家这个sha1算法没问题。
1 | input:kanxue_imyang_41_fgfPLREXkGWWzfVPvtSjGxkkBsFP output:b5d3a0ebffb5eb1048e19455bcea310068833c0e |
继续找几个常量是否发生了变动
1 | digest[0] = 0x67452301; |
然后ida搜索一下
果然发生了变动。按照对应的值修改一下
1 | inline static void reset(uint32_t digest[], std::string &buffer, uint64_t &transforms) |
输出结果
1 | input:kanxue_imyang_41_fgfPLREXkGWWzfVPvtSjGxkkBsFP output:d58aa1c17830271e523dcc59808ec75e1f6660ad |
=============================================================================
第三题algorithmbase_42.apk
直接ida先检查下常量是否正确。然后init里面的常量是没有修改的。我们再看看算法内部用来计算的常量是否一致
对比后发现不单单值发生了变化。并且也从+变成了-。
用frida来取一个计算结果先
1 | input: FbeBTeatDdikDjhyV output: c603885c6817b5e15919d9b50d6d951eb1fd11fc |
然后参考ida的4个常量的值修改一下sha1的代码。留意第一个和第二个的运算要改成减号
1 | inline static void R0(const uint32_t block[BLOCK_INTS], const uint32_t v, uint32_t &w, const uint32_t x, const uint32_t y, uint32_t &z, const size_t i) |
最后计算结果一致。第三题搞定
1 | input:kanxue_imyang_42_FbeBTeatDdikDjhyV output:c603885c6817b5e15919d9b50d6d951eb1fd11fc |
=============================================================================
第四题algorithmbase_43.apk
直接ida打开。结果发现字符串被加密了。没法直接看到前面固定加的字符串了。不要紧。先拿去用unidbg或者AndroidNativeEmu来生成一个解密的so
下面贴上解密后的结果
然后frida打印下输出
1 | input: gkoOrszvENhJEgIFcmnccPtUkAPG output: 4b3ed910435a1b7231cd01ff7b8ddab64926ee75 |
先验证下sha1标准的对不对。结果是正确的。没有任何修改。第4题搞定