吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2996|回复: 3
收起左侧

[Android CTF] 《攻防世界》MOBILE--Ph0en1x-100

[复制链接]
HNHuangJingYU 发表于 2021-9-29 20:24
本帖最后由 HNHuangJingYU 于 2021-9-30 10:18 编辑

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

1

1

2.就是将getFlag()这个native函数返回的字符串加密,和我们输入的字符串经过encrpt()native函数进行加密对比,嗯,思路出来了就很简单了首先用frIDA对getFlag()函数进行Hook得到返回值,脚本如下:
[JavaScript] 纯文本查看 复制代码
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[2], String_java);   //打印JNI字符串参数
            console.log("参数为:", args_3);

            // //打印int
            // console.log("args[2] int value : " + args[2].toInt32()); //打印JNI int参数
            // //修改int
            // args[2] = 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()如下:
[C++] 纯文本查看 复制代码
#include <iostream>
#include <cstring>

using namespace std;

int main() {
    char v4[50];  // 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}

免费评分

参与人数 2吾爱币 +2 热心值 +2 收起 理由
shiyucj + 1 + 1 我很赞同!
GGRyan + 1 + 1 我很赞同!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

无名氏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之后字符串会改变?
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 16:37

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表