前言:
坛友们,年轻就是资本,和我一起逆天改命吧,我的学习过程全部记录及学习资源:https://www.52pojie.cn/thread-1582287-1-1.html
立帖为证!--------记录学习的点点滴滴
0x1 界面分析
1.先查壳,可以看到没有加固。
2.在模拟器中安装app然后运行,随便输入123456,然后回车:
3.通过点击登录后返回的信息,已知的字符串信息:Just keep Trying :)。
0x2 静态分析
1.看一下反编译后的apk源码
Object localObject = MessageDigest.getInstance("MD5");
((MessageDigest)localObject).update(paramView.getBytes());
paramView = ((MessageDigest)localObject).digest();
localObject = new StringBuffer();
i = 0;
for (;;)
{
if (i >= paramView.length)
{
if ((j == 1) && (this.a.e != "unknown")) {
this.a.c.setText("Sharif_CTF(" + ((StringBuffer)localObject).toString() + ")");
}
if ((j == 1) && (this.a.e == "unknown")) {
this.a.c.setText("Just keep Trying :-)");
}
if (j != 0) {
break;
}
this.a.c.setText("Just keep Trying :-)");
return;
}
((StringBuffer)localObject).append(Integer.toString((paramView[i] & 0xFF) + 256, 16).substring(1));
i += 1;
}
2.看到这,小菜鸟心里拔凉拔凉的,还用上md5了,这么复杂啊!除了md5,关键代码在这里:((StringBuffer)localObject).append(Integer.toString((paramView[i] & 0xFF) + 256, 16).substring(1));这么长一句看不懂咋办?看我百度:
1)StringBuffer append(type b) 将 type类型参数的字符串表示附加到序列中。
2)public static String toString(int i,int radix)返回由第二个参数指定的基数中的第一个参数的字符串表示形式。
3)substring() 方法返回字符串的子字符串。substring(1)表示字符串中第二个字符到结尾的字串。
4)最后百度了& 0xFF + 256,才看到原来是byte转int字符扩展。
3.分析错了位置,在md5加密前往回看:int j = this.a.IsCorrect(paramView);如果这里j的返回值为1,后面才会出现成功的提示,看一下 public native int IsCorrect(String paramString);这个函数,发现是native层函数。
4.通过ida加载so文件看看,找到IsCorrect函数,F5反编译看看。
int __fastcall Java_com_example_ctf2_MainActivity_IsCorrect(int a1, int a2, int a3)
{
int v4; // r6
int v5; // r0
int v6; // r1
char *v9; // [sp+14h] [bp-4Ch]
int v10; // [sp+1Ch] [bp-44h]
int v11; // [sp+20h] [bp-40h]
char v12[60]; // [sp+24h] [bp-3Ch] BYREF
v9 = (char *)(*(int (__fastcall **)(int, int, _DWORD))(*(_DWORD *)a1 + 676))(a1, a3, 0);
strcpy(v12, "ef57f3fe3cf603c03890ee588878c0ec");
v4 = 0;
v12[33] = 53;
v10 = j_strcmp(v9, v12);
v5 = 1701458332;
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
v6 = v5;
v5 = 809244963;
if ( v6 <= 1701458331 )
break;
v5 = -333293478;
if ( v10 )
v5 = -158041539;
}
if ( v6 <= 809244962 )
break;
(*(void (__fastcall **)(int, int, char *))(*(_DWORD *)a1 + 680))(a1, a3, v9);
v11 = v4;
v5 = -326599761;
}
if ( v6 != -158041539 )
{
v4 = 1;
v5 = -158041539;
if ( v6 != -333293478 )
break;
}
}
return v11;
}
5.看到可疑字符串ef57f3fe3cf603c03890ee588878c0ec,可以看到strcpy函数将字符串拷贝给v12,后面没有对v12进行赋值操作,猜测这就是flag,输入验证试试,成功得到flag:Sharif_CTF(833489ef285e6fa80690099efc5d9c9d)。
0x3 总结
1.这,看到一个字符串,啊这就结束了???简直不敢相信这道3分题这么容易!
2.IDA F5功能这也太强了,看了大佬的write up里面分析的得很清楚,还写了脚本,是真的厉害!