HNHuangJingYU 发表于 2021-9-29 20:24

《攻防世界》MOBILE--Ph0en1x-100

本帖最后由 HNHuangJingYU 于 2021-9-30 10:18 编辑

1.首先将Ph0en1x-100.apk拖入jeb,关键函数:

2.就是将getFlag()这个native函数返回的字符串加密,和我们输入的字符串经过encrpt()native函数进行加密对比,嗯,思路出来了就很简单了首先用frida对getFlag()函数进行Hook得到返回值,脚本如下:Java.perform(function(){
    Interceptor.attach(Module.findExportByName("libphcm.so", "Java_com_ph0en1x_android_1crackme_MainActivity_encrypt"), {
      onEnter: function (args) {
            var String_java = Java.use('java.lang.String');
            var args_3 = Java.cast(args, String_java);   //打印JNI字符串参数
            console.log("参数为:", args_3);

            // //打印int
            // console.log("args int value : " + args.toInt32()); //打印JNI int参数
            // //修改int
            // args = ptr(88);
   
      },
      onLeave: function (retval) {
            //修改返回值
            var String_java = Java.use('java.lang.String');
            var result = Java.cast(retval, String_java);   //打印JNI字符串参数
            console.log("encrypt返回值:", result);
            // retval.replace(999);
      }
    });

    //
   
    Interceptor.attach(Module.findExportByName("libphcm.so", "Java_com_ph0en1x_android_1crackme_MainActivity_getFlag"), {
      onEnter: function (args) {
   
      },
      onLeave: function (retval) {
            //修改返回值
            var String_java = Java.use('java.lang.String');
            var result = Java.cast(retval, String_java);   //打印JNI字符串参数
            console.log("getFlag返回值:{", result+"}");
            console.log("=================end================");
      }
    });
   
});3.得到getFlag返回值: ek`fz@q2^x/t^fn0mF^6/^rb`qanqntfg^E`hq|然后再经过java层的getSecret()进行加密就得到了这个字符串:ce8fb3a6438ee5bc323da995e425545e但是我发现这个getSecret()也太难逆向了吧是通过消息摘要进行加密,好像还是不可逆的,果断放弃进而猜测一波,但是发现两个字符串对比的值都是通过getSecret()进行加密,那么是不是只要让getFlag() == encrypt(this.etFlag.getText().toString())就可以了?所以只要让我们输入的字符串进过encrypt()后等于 ek`fz@q2^x/t^fn0mF^6/^rb`qanqntfg^E`hq|就可以了逆向还原的encrypt()如下:
#include <iostream>
#include <cstring>

using namespace std;

int main() {
    char v4;// r4
    char *i;// r5

    strcpy(v4, " ek`fz@q2^x/t^fn0mF^6/^rb`qanqntfg^E`hq|");
    for (i = v4; i - v4 < strlen(v4); ++i)
      cout << ++*i;

    return 0;
}
输出结果 :!flag{Ar3_y0u_go1nG_70_scarborough_Fair}

无名氏wyw 发表于 2021-9-30 06:56

最后的那个解密函数是什么意思,v4 还没有初始化,在我的电脑上也跑不出来。

HNHuangJingYU 发表于 2021-9-30 09:11

本帖最后由 HNHuangJingYU 于 2021-9-30 10:16 编辑

无名氏wyw 发表于 2021-9-30 06:56
最后的那个解密函数是什么意思,v4 还没有初始化,在我的电脑上也跑不出来。
之前写的第一个版本测试后,忘记改了,我重新上传了

无名氏wyw 发表于 2021-9-30 17:29

本帖最后由 无名氏wyw 于 2021-9-30 17:31 编辑

HNHuangJingYU 发表于 2021-9-30 09:11
之前写的第一个版本测试后,忘记改了,我重新上传了
好的,话说为什么strcpy之后字符串会改变?
页: [1]
查看完整版本: 《攻防世界》MOBILE--Ph0en1x-100