安洵杯复现——mobilego

发布于 2023-12-29  816 次阅读


1.思路:

这一个题是一个安卓题,因此得使用jadx来打开程序,打开程序后我们就得找到函数的主体在哪里,通过主体再来分析函数的加密逻辑是什么。

2.寻找:

首先在左边的资源文件里面找到AndroidManifest.xml,在里面可以找到mainactivity

点进去后就可以看见程序的主体了,因为安卓题做的比较少,所以来细致分析一下这一个题的逻辑:

public void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_main);
       this.editText = (EditText) findViewById(R.id.editText);
       Button button = (Button) findViewById(R.id.button);
       this.button = button;
       button.setOnClickListener(new View.OnClickListener() { // from class: com.example.mobilego.MainActivity$$ExternalSyntheticLambda0
           @Override // android.view.View.OnClickListener
           public final void onClick(View view) {
               MainActivity.this.m215lambda$onCreate$0$comexamplemobilegoMainActivity(view);
          }

这是Android应用程序的主活动的onCreate方法。

在这个方法中,首先调用了父类的onCreate方法,然后设置了布局文件为R.layout.activity_main。接下来通过findViewById方法获取了EditText控件,并将其赋值给了变量editText。然后又通过findViewById方法获取了Button控件,并将其赋值给了变量button。接下来通过setOnClickListener方法为button设置一个点击事件的监听器,当点击按钮时,会调用MainActivity类中的m215lambda$onCreate00comexamplemobilegoMainActivity方法。

(editText就是程序运行里面要求我们输入的那一个窗口,button就是点击确认的按钮,这里创造出了这两个)

用模拟器打开就是这个样子:

public /* synthetic */ void m215lambda$onCreate$0$comexamplemobilegoMainActivity(View v) {
       if (Game.checkflag(this.editText.getText().toString()).equals(getResources().getString(R.string.cmp))) {
           Toast.makeText(this, "yes your flag is right", 0).show();
      } else {
           Toast.makeText(this, "No No No", 0).show();
      }

这里就是比较是否输入正确的地方了,因为在这个lambda方法中,首先通过getText().toString()方法获取了EditText控件中输入的文本。然后将这个文本传递给Game类的checkflag方法进行检查。如果checkflag方法返回的结果与R.string.cmp所代表的字符串相等,那么会显示一个"yes your flag is right"的Toast提示信息。

因此,原文加密过后的形式就变成了cmp所对应的字符串。那么接下来就要寻找的是cmp了。

因为我们可以看出cmp是string类型的数据,所以我么就从如下的方法来寻找:

这样就找到了cmp对应的值:49021}5f919038b440139g74b7Dc88330e5d{6

然后就去分析加密过程了

3.分析:

点击进入checkflag方法,发现是在native层,native层通常指的是使用本机编程语言(如C++,C)编写的代码部分。本机层通常指的是java等高级语言的应用程序而言的,因此得把这个程序解压把它的lib文件夹里面的.so文件拖入IDA里面分析:

搜索java,迅速定位到checkflag函数位置,加密的逻辑就在这里面了,因为还不知道如何修改类别,这里IDA的识别可能是有误的,幸好这一道题有另外一个简便办法:

使用jadx在模拟器上调试这一个安卓程序,输入一行flag如1234567489,可以看到被转化成了如图的顺序:

所以我们可以猜测这李的加密的方法是将输入进去的字符串更改顺序,因此我们只需奥输入与cmp相同长度的一行有顺序的字符串得到被打乱的结果在将其还原就可以得到flag:

import string
cmp='49021}5f919038b440139g74b7Dc88330e5d{6'
tmp='vIlDoLjtEpkCmyzfqbshucxwiAagKFBdGHJner'
flag=''
for i in string.ascii_letters[:len(tmp)]:
flag+=cmp[tmp.find(i)]
print(flag

D0g3{4c3b5903d11461f94478b7302980e958}


The world's full of lonely people afraid to make the first move.