前言
把22年寒假的WP转移到blog上,这次是安卓逆向专题的,原题链接在最底下。
rev200
先把apk文件拖到jadx中打开,可以看到java源码,经过学习,程序的主要部分一般在命名为程序名的源代码部分,这题的程序主体就在ctf.crackme里
先打开FlagActivity查看,发现里面有一段疑似是flag生成的代码
再看看MainActivity,里面有一段点击操作,是把输入的字符和EYG3QMCS相比,相等就输出FlagActivity里生成的flag
用模拟器打开程序输入密码试一试,程序果然输出了flag,flag为flag{w4nn4_j4r_my_d3x}
vezel
先用jadx打开,找到主程序,结合模拟器中的程序界面,发现一段确认flag的代码
可以看出flag由0CTF{first+getCrc()}组成,而first由getSig(getPackageName())生成,关键函数为getSig()和getCrc()
分别看看这两个函数
先看看getSig()函数,经过搜索学习,此函数的主要功能是获得apk包的数字签名然后用自带的hashCode函数生成hash值,作为flag的第一部分
因为暂时还不会java,我在网上找到一段代码获得flag
package com.iromise.getsignature;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.Signature;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
private StringBuilder builder;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
PackageManager manager = getPackageManager();
builder = new StringBuilder();
String pkgname = "com.ctf.vezel";
boolean isEmpty = TextUtils.isEmpty(pkgname);
if (isEmpty) {
Toast.makeText(this, "应用程序的包名不能为空!", Toast.LENGTH_SHORT);
} else {
try {
PackageInfo packageInfo = manager.getPackageInfo(pkgname, PackageManager.GET_SIGNATURES);
Signature[] signatures = packageInfo.signatures;
Log.i("hashcode", String.valueOf(signatures[0].toCharsString().hashCode()));
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
}
}
}
得到flag的第一部分-183971537
接下来看看getCrc()函数,就是得到classes.dex文件的crc值,可以直接利用在线工具得到
转换为10进制数得到flag的第二部分
flag拼起来为0CTF{-1839715371189242199}
验证通过
mobicrackNDK
先用jadx打开,找到程序主体部分,主要是两个部分,一个是Calc,一个是CrackMe,Calc里面只有一个字符串,CrackMe里好像链接了一个外来库叫mobicrackNDK
主体的函数是tsetFlag这个函数,但是这个函数不在源码里面
搜索学习了一下,lib文件夹里放着的是用c/c++编写的so文件,程序调用的库的内容应该在里面,tsetFlag函数应该也在里面
把apk文件解压,把libmobicrackNDK.so文件用ida32打开,在string窗口搜到了tsetFlag
点进去,一路找到了可疑函数abcdefghijklmn
打开来看看,flag应该是16位,前8位联系到一个seed数组,后8位是java源码中key做了一些变换
先看看seed数组,找到一串字符
seed数组还被另外一个函数引用过,打开看看
可见flag的前半部分是先-i再与-3的seed数组QflMn`f比较
再看flag后半部分,key是字符串c7^WVHZ,的逆序,即,ZHVW^7c,key与-i的后半部分flag相等
得到flag的代码如下
#include <stdio.h>
int main()
{
char a[20] = "QflMn`fH,ZHVW^7c";
char flag[20];
for (int i = 0; i < 16; i++)
{
if (i < 8)
{
flag[i] = a[i] + i - 3;
}
else
{
flag[i] = a[i] + i;
}
printf("%c", flag[i]);
}
return 0;
}
flag为NdkMobiL4cRackEr
验证通过
不错👍🏻