public class FirstTest extends Cocos2dxActivity {
static {
System.loadLibrary("cocos2dcpp");
}
public FirstTest() {
super();
}
protected void onCreate(Bundle arg5) {
super.onCreate(arg5);
new a(((Context)this), "flag").d("YmF6aW5nYWFhYQ==");
new a(((Context)this), "Cocos2dxPrefsFile").d("N0");
}
public Cocos2dxGLSurfaceView onCreateView() {
Cocos2dxGLSurfaceView v0 = new Cocos2dxGLSurfaceView(((Context)this));
new a(((Context)this), "Cocos2dxPrefsFile").d("MG");
v0.setEGLConfigChooser(5, 6, 5, 0, 16, 8);
return v0;
}
}
public class a {
private SharedPreferences editor;
public a(Context arg2, String arg3) {
super();
this.editor = null;
this.editor = arg2.getSharedPreferences(arg3, 0);
}
public void b() {
this.editor.edit().putString("DATA", "").commit();
}
public String c() {
return this.editor.getString("DATA", "");
}
public void d(String arg5) {
this.editor.edit().putString("DATA", String.valueOf(String.valueOf(this.c())) + arg5).commit();
}
}
a类:sharePreferences是android的一种数据存储机制,它会在/data/data/com.example.plane/下生成一个xml文件,并将数据存储在其中。
getSharedPreferences有两个参数
第一个参数getSharedPreferences(第一个参数,第二个参数);
第一个参数是存储时的名称,第二个参数则是文件的打开方式~
两个参数,第一个参数是preferece的名称(比如:MyPref),第二个参数是打开的方式(一般选择private方式)
可以用Android studio打开/data/data/com.example.plane/
,也可以用MT管理器
base64进行解码
得到0ctf{C0coS2d_AnDro1gs�
JAVA层中刚好有对应的字符串YmF6aW5nYWFhYQ==
IDA中so层分析一下,查找关键函数名
对应的不同的case事件是达到不同的分数,会得到不同的base64编码,连起来再去进行解码MWRfRzBtRv9Zb1VfS24wT
1d_G0mE YoU_Kn0
strcpy(v32, "data");
v2 = 0;
v34 = 0;
v18 = this;
v33 = 0;
do
{
*((_BYTE *)&v33 + v2) = v32[v2] ^ 0x20;
++v2;
}
while ( v2 != 4 );
if ( (unsigned int)a2 <= 0x3B9ACA00 )
{
v4 = cocos2d::CCUserDefault::sharedUserDefault(this);
sub_3A34D8(&v21, &byte_3F92A0, v19);
cocos2d::CCUserDefault::getStringForKey(&v20, v4, &v33, &v21);
v5 = (cocos2d::CCUserDefault *)sub_3A1DDC(&v21);
switch ( a2 )
{
case 100:
v6 = cocos2d::CCUserDefault::sharedUserDefault(v5);
std::operator+<char>(v22, &v20, "MW");
cocos2d::CCUserDefault::setStringForKey(v6, &v33, v22);
v7 = v22;
break;
case 600:
v8 = cocos2d::CCUserDefault::sharedUserDefault(v5);
std::operator+<char>(v23, &v20, "Rf");
cocos2d::CCUserDefault::setStringForKey(v8, &v33, v23);
v7 = v23;
break;
case 700:
v9 = cocos2d::CCUserDefault::sharedUserDefault(v5);
std::operator+<char>(v24, &v20, "Rz");
cocos2d::CCUserDefault::setStringForKey(v9, &v33, v24);
v7 = v24;
break;
default:
if ( (unsigned __int32 *)a2 == &stru_BB4.st_value )
{
v10 = cocos2d::CCUserDefault::sharedUserDefault(v5);
std::operator+<char>(v25, &v20, "Bt");
cocos2d::CCUserDefault::setStringForKey(v10, &v33, v25);
v7 = v25;
}
else if ( a2 == 5600 )
{
v11 = cocos2d::CCUserDefault::sharedUserDefault(v5);
std::operator+<char>(v26, &v20, "RV");
cocos2d::CCUserDefault::setStringForKey(v11, &v33, v26);
v7 = v26;
}
else if ( (unsigned __int32 *)a2 == &stru_26A4.st_size )
{
v12 = cocos2d::CCUserDefault::sharedUserDefault(v5);
std::operator+<char>(v27, &v20, "9Z");
cocos2d::CCUserDefault::setStringForKey(v12, &v33, v27);
v7 = v27;
}
else if ( (unsigned __int8 *)a2 == &stru_4644.st_info )
{
v13 = cocos2d::CCUserDefault::sharedUserDefault(v5);
std::operator+<char>(v28, &v20, "b1");
cocos2d::CCUserDefault::setStringForKey(v13, &v33, v28);
v7 = v28;
}
else if ( (unsigned __int8 *)a2 == &stru_15AD4.st_info )
{
v14 = cocos2d::CCUserDefault::sharedUserDefault(v5);
std::operator+<char>(v29, &v20, "Vf");
cocos2d::CCUserDefault::setStringForKey(v14, &v33, v29);
v7 = v29;
}
else if ( (unsigned __int8 *)a2 == &stru_18694.st_info )
{
v15 = cocos2d::CCUserDefault::sharedUserDefault(v5);
std::operator+<char>(v30, &v20, "S2");
cocos2d::CCUserDefault::setStringForKey(v15, &v33, v30);
v7 = v30;
}
else
{
if ( a2 != 1000000000 )
{
连起来0ctf{C0coS2d_AnDro1d_G0mE_YoU_Kn0w?}