攻防世界Mobile-黑客精神解题思路分享
下载附件,使用JEB加载apk,首先看一下Mainfest配置
大致有个初步印象,这个apk有两个Activity,一个是MainActivity 主入口,另一个是 RegActivity,应该是从主入口某个按钮拉起。
我们先分析 MainActivity 入口初始化函数 OnCreate
这里重点在于 会先判断 MyAPP.m 的变量值,是否为0,如果为0 ,就说明没有注册,会进入到注册环节,调用 doRegister, 如果m为1,说明已经注册过了,直接进入work环节。
m的取值就是本题的解题关键了,我们来看一下m在哪里被定义,已经在哪里被调用的。
根据MyApp类的定义,m为静态变量,MyAPP在 onCreate函数里进行初始化动作,可能会影响到变量m的值。
这里调用了native 函数 initSN()。后续我们会在libmyjni.so文件中进行深入分析。
在回到我们刚刚的主入口MainActivity ,我们还需要分析一下 doRegister函数和 work函数的逻辑
先来看 doRegister 函数,其实就是按钮注册点击事件,拉起注册页面。
在注册页面中,有个输入框和一个按钮,给按钮添加点击事件,将用户的输入sn,作为saveSN函数的入参,进行处理。
具体如何处理用户输入的sn,就需要进一步的分析 saveSN函数,这个saveSN函数也属于native层函数,待会也一并分析。
再看MainActivity中的work函数,当m=1时,会进入到work分支,它的逻辑也是在native层。接下来我们就需要分析so文件了
IDA加载 libmyjni.so文件
JNI_Onload 入口可以看到进行了动态函数注册。
我们可以看到 initSN函数实际上就是n1, saveSN函数实际上就是n2, work函数实际上就是n3
为了方便分析,我们将n1,n2,n3 分别换个变量名
n1 -> realinitsn
n2 -> realsavesn
n3 -> realwork
首先分析一下 initsn函数
这个函数非常的简单,就是将/sdcard/reg.dat文件中的内容取出来,和EoPAoY62@ElRD 进行对比。如果相同 v10=1 ,如果不同v10=0 。
注意这里的setValue函数,其实就是对变量m进行赋值操作的
现在再来看native函数 savesn
这个saveSN函数逻辑也很清晰,用户输入的字符sn,会进行字符计算操作,得到了新的字符串,再保存到 /sdcard/reg.dat 文件中。
至此,我们已经非常清晰知道了整个应用的逻辑。
第一次用户打开apk时,会进行注册,用户输入的注册字符,会经过字符计算操作, 然后存入到/sdcard/reg.dat文件中。以后用户再次打开app时,会对m值进行判断,就是通过对比/sdcard/reg.dat文件内容和
EoPAoY62@ElRD 是否相同。
那么我们的任务就根据字符串常量 EoPAoY62@ElRD 来反推出用户的输入字符。
我们依旧使用frida来进行解题。先测试一下我们的输入,输出
从这个输入输出的结果来看,我们总结了一个规律:
1、输入的字符个数和输出字符个数是 一一对应的。
2、将三个输入字符分为一组,对应一个输出字符。
我们可以利用frida快速的爆破出所有的字符,不需要去研究saveSN函数里的字符加密操作。不过此道题saveSN里的字符加密操作比较简单,很容易逆推出来。如果对于很复杂的加密算法,我们的爆破方法会非常简单。
20秒内就可以爆破出第一个三字符元组,输入201 -> 输出 EoP
第二个元组输入 608 -> AoY
第三个元组 输入Am! ->62@
第四个元组输入233 -> ElR
第五个元组 输入3 -> D
最终的flag为 201608Am!2333
注册时输入 201608Am!2333 ,弹出提示框,给出flag的格式提示,也就是work函数的内容,我们不需要深究了。
frida hook 代码
var flag = false;
imports = Module.enumerateImportsSync("libmyjni.so");
for(var i=0;i<imports.length;i++){
console.log(imports.name);
if(imports.name =="fputs")
{
console.log(imports.name);
console.log(imports.address);
targetfunc = imports.address;
break;
}
}
if(targetfunc != undefined)
{
Interceptor.attach(targetfunc,{
onEnter: function(args){
//console.log("strlen enter!");
var data = Memory.readCString(args);
//console.log(data);
if(data == "D")
{
flag = true;
console.log("[+]Found: "+Memory.readUtf8String(args));
}
}
});
}
console.log("[*] hook android.os.Process");
var Process = Java.use("android.os.Process");
Process.killProcess.implementation = function () {
console.log("[*]get in android.os.Process killProcess");
};
var dict = "abcdefghijklmnopqrstuvwxyz1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ!@#$%^&*()";
var result = "EoPAoY62@ElRD";
var plaint = "";
console.log("[*] hook com.gdufs.xman.MyApp")
var MyApp = Java.use("com.gdufs.xman.MyApp");
var myapp = MyApp.$new()
/*
console.log("input: 11");
myapp.saveSN("11");
console.log("input: 111");
myapp.saveSN("111");
console.log("input: 1111");
myapp.saveSN("1111");
console.log("input: 11111");
myapp.saveSN("11111");
console.log("input: 111111");
myapp.saveSN("111111");
console.log("input: 111111111");
myapp.saveSN("111111111");
*/
/*
for(var k =0; k <dict.length; k++)
{
myapp.saveSN(dict);
if(flag)
{
console.log("[+]Found dict : "+dict);
return;
}
}
*/
for(var j =0; j <dict.length; j++)
{
for(var i =0; i <dict.length; i++)
{
for(var k =0; k <dict.length; k++)
{
myapp.saveSN(dict+dict+dict);
if(flag)
{
console.log("[+]Found dict : "+dict+dict+dict);
return;
}
}
}
}
大神,9月6号下午我在京东拍拍被骗了钱(华中师范大一一年所有费用(生活费,学费,杂费,学分费,其它费)(22990元)父母要我自己还学费。呜呜呜呜呜呜呜呜。
我已经报警了,但是别人刑警都帮查到6级了,大同刑警四队6号说帮我立案了,骗我立了,删了我的报警记录,不笔录,半个小时内钱在了,让冻结一直不冻。我被骗后1,2分钟就打电话了。连续打了1个小时,电话也不接,1个刑警在打游戏,另1个在玩抖音。
然后15号我就去了,一开始装不认识我,说我没来过大同刑警四队,因为我记得人长什么样子才承认来过。宁和我聊3个小时,拖到9月23号后,又和我说,还得10来天。我向110催促了,也不能算是举报。免强给个授案回执单。反正也不查案。拖到现在。
骗子平台虚拟银行账号我有(他把钱转给别人的卡了)
买上的QQ号,微信号,就买上2或3天最多10天就还给号主了。
①骗子QQ号:1953691864
②京东号jd_KyLzAo9hJuEq
③中国建设银行高飞柱 6217 0029 2015 1401 636
(好像这3个号的使用者是同一个人身份。下面这个人他就是收集卡,给犯罪团伙卖的。他不加陌生人。
卖卡号人Vx号:zhenxuan1315。
一开始的时候就查了这个QQ(注册地云南,[流泪][流泪][流泪]“登陆地是缅北”存在争议[流泪][流泪][流泪]
这个人的真实ip地址,他用的服务器没有查清。(国内外),登陆地并不一定是在缅北。现在已经还给原来的主人。怎么查代{过}{滤}理器,真实ip。[流泪][流泪][流泪][流泪][流泪]
怎么通过卖卡人,找到6号登陆这个QQ号真实的骗子下的那些受害人们(就是骗我的这个骗子同时骗的受害人们)。我好全国联名投诉。[流泪][流泪][流泪][流泪][流泪][流泪][流泪][流泪][流泪][流泪]
顶风能尿三丈远 发表于 2021-1-4 09:36
应该要不了多久,我是2018年接触Android的,中间断断续续的,没有花太多时间,还是比较容易上手的
我学几个月了,中间也是断断续续,现在勉强能做些ctf题,高级逆向题看都看不懂 看看, 谢谢分享! 不错的分析,支持分享 不错的分析,支持分享 很好的解题思路啊 分析得不错。 精彩!!!! 嗯,很厉害很精彩,请问这么厉害,我可以学会吗 学学一波,感谢分享 感谢分享