下面介绍两个反编译工具
对于so文件的逆向工具选择
Objection是一款移动设备运行时漏洞利用工具,该工具由Frida驱动,可以帮助研究人员访问移动端应用程序,并在无需越狱或root操作的情况下对移动端应用程序的安全进行评估检查。
安装命令
pip3 install objection
frida是一款便携的、自由的、支持全平台的hook框架,可以通过编写JavaScript、Python代码来和frida_server端进行交互
frida的安装可以参考:https://www.jianshu.com/p/60cfd3f6afde
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
/* loaded from: classes.dex */
public class MainActivity extends AppCompatActivity {
EditText etFlag;
public native String encrypt(String str);
public native String getFlag();
static {
System.loadLibrary("phcm");
}
/* JADX INFO: Access modifiers changed from: protected */
@Override // android.support.v7.app.AppCompatActivity, android.support.v4.app.FragmentActivity, android.app.Activity
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
this.etFlag = (EditText) findViewById(R.id.flag_edit);
}
public void onGoClick(View v) {
if (getSecret(getFlag()).equals(getSecret(encrypt(this.etFlag.getText().toString())))) {
Toast.makeText(this, "Success", 1).show();
} else {
Toast.makeText(this, "Failed", 1).show();
}
}
public String getSecret(String string) {
try {
byte[] hash = MessageDigest.getInstance(encrypt("KE3TLNE6M43EK4GM34LKMLETG").substring(5, 8)).digest(string.getBytes("UTF-8"));
if (hash != null) {
StringBuilder hex = new StringBuilder(hash.length * 2);
for (byte b : hash) {
if ((b & 255) < 16) {
hex.append("0");
}
hex.append(Integer.toHexString(b & 255));
}
return hex.toString();
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (NoSuchAlgorithmException e2) {
e2.printStackTrace();
}
return null;
}
}
发现
我们看到 encrypt()以及 getFlag()都在 so 文件里,所以我们IDA
encrypt()函数解析:
其实这个 encrypt()函数很简单,就是把输入的字符串每位的 ASCII 码减去 1
getFlag()函数解析:
getFlag我们就采用动态解析
第一步:安装adb
第二步:安装安卓模拟器
第三步:apktool
下载链接:https://ibotpeaches.github.io/Apktool/install/
拆包
java -jar apktool.jar d f6adc401d0eb472892a4ac4481f76a85.apk
打开AndroidManifest.xml 添加 android:debuggable=“true”
<?xml version="1.0" encoding="utf-8" standalone="no"?><manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.ph0en1x.android_crackme" platformBuildVersionCode="22" platformBuildVersionName="5.1.1-1819727">
<application android:debuggable="true" android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme">
<activity android:name="com.ph0en1x.android_crackme.MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
</application>
</manifest>
打包
java -jar apktool.jar b f6adc401d0eb472892a4ac4481f76a85
的文件夹里会出现一个 dist 文件夹,里面就是重新生成的 APK,但是此时的 APK 是不可以使用的,因为还没有签名!
生成签名
keytool -genkey -alias mykey -keyalg RSA -validity 40000 -keystore demo.keystore
注意参数:
执行命令
jarsigner -verbose -keystore demo.keystore -signedjar new.apk f6adc401d0eb472892a4ac4481f76a85.apk mykey
用JEB打开new.apk
我们在 onGoClink()方法下打断点,断点的位置即为 getFlag()返回的位置
使用 adb 查看是否已经连接上设备
在 CMD 中以 adb shell am start -D -n 包名/入口activity名
的命令格式执行以下命令开始运行程序:
adb shell am start -D -n com.ph0en1x.android_crackme/com.ph0en1x.android_crackme.MainActivity
然后模拟器运行 APP
然后 attach 进入调试模式,这时候 app 随便输入flag,成功断下
然后就得到了 getFlag()的字符串ek
fz@q2x/tfn0mF6/rbqanqntfg^E
hq|`
最后只要编写脚本即可获得 flag
flag="ek`fz@q2^x/t^fn0mF^6/^rb`qanqntfg^E`hq|"
flag_list=[]
for i in flag:
flag_list.append(chr((ord(i)+1)))
print("".join(flag_list))
flag为:flag{Ar3_y0u_go1nG_70_scarborough_Fair}