好友
阅读权限25
听众
最后登录1970-1-1
|
本帖最后由 HNHuangJingYU 于 2021-9-30 10:18 编辑
1.首先将Ph0en1x-100.apk拖入jeb,关键函数:
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} |
免费评分
-
查看全部评分
|
发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。 |
|
|
|
|