easy-so
放进雷电模拟器,是个验证界面
放进JEB,查看MainActivity
public class MainActivity extends AppCompatActivity {
public MainActivity() {
super();
}
protected void onCreate(Bundle arg3) {
super.onCreate(arg3);
this.setContentView(0x7F09001B);
this.findViewById(0x7F070022).setOnClickListener(new View$OnClickListener() {
public void onClick(View arg6) {
if(cyberpeace.CheckString(MainActivity.this.findViewById(0x7F070031).getText().toString()) == 1) {
Toast.makeText(MainActivity.this, "验证通过!", 1).show();
}
else {
Toast.makeText(MainActivity.this, "验证失败!", 1).show();
}
}
});
}
}
题目中提到so,IDA打开解压后的so文件,反汇编
v11 = (const char *)(*(int (__cdecl **)(int, int, _DWORD))(*(_DWORD *)a1 + 676))(a1, a3, 0);
v3 = strlen(v11); //v3等于v11的长度
v4 = (char *)malloc(v3 + 1); //给v4申请v3+1大小的内存空间
memset(&v4[v3], 0, v3 != -1);
memcpy(v4, v11, v3); //v11的内容复制到v4
if ( strlen(v4) >= 2 ) //v4字符串长度大于2执行
{
v5 = 0;
do
{
v6 = v4[v5];
v4[v5] = v4[v5 + 16]; //将第v6个字符和第v6+16个字符进行交换
v4[v5++ + 16] = v6;
}
while ( v5 < strlen(v4) >> 1 );
}
v7 = *v4;
if ( *v4 )
{
*v4 = v4[1];
v4[1] = v7;
if ( strlen(v4) >= 3 )
{
v8 = 2;
do
{
v9 = v4[v8];
v4[v8] = v4[v8 + 1];
v4[v8 + 1] = v9; //两两交换字符,第0个和第1个交换
//第2个和第3个交换
v8 += 2;
}
while ( v8 < strlen(v4) );
}
}
return strcmp(v4, "f72c5a36569418a20907b55be5bf95ad") == 0;
} //要进行处理的字符串,并且字符数为32个
第一段代码将第v6个字符和第v6+16个字符进行交换,第二段代码两两进行交换,逆向写脚本
string = list('f72c5a36569418a20907b55be5bf95ad')
for i in range(0,len(string),2):
string1=string[i]
string[i]=string[i+1]
string[i+1]=string1
for i in range(len(string)//2):
string2=string[i]
string[i]=string[i+16]
string[i+16]=string2
flag=''.join(string)
print(flag)
运行
90705bb55efb59da7fc2a5636549812a