安卓逆向初学

前言

把22年寒假的WP转移到blog上,这次是安卓逆向专题的,原题链接在最底下。


rev200

先把apk文件拖到jadx中打开,可以看到java源码,经过学习,程序的主要部分一般在命名为程序名的源代码部分,这题的程序主体就在ctf.crackme里

屏幕截图 2022-12-24 135810

先打开FlagActivity查看,发现里面有一段疑似是flag生成的代码

屏幕截图 2022-12-24 140032

再看看MainActivity,里面有一段点击操作,是把输入的字符和EYG3QMCS相比,相等就输出FlagActivity里生成的flag

屏幕截图 2022-12-24 140224

用模拟器打开程序输入密码试一试,程序果然输出了flag,flag为flag{w4nn4_j4r_my_d3x}

屏幕截图 2022-12-24 140430


vezel

先用jadx打开,找到主程序,结合模拟器中的程序界面,发现一段确认flag的代码

屏幕截图 2022-12-24 141216

可以看出flag由0CTF{first+getCrc()}组成,而first由getSig(getPackageName())生成,关键函数为getSig()和getCrc()

分别看看这两个函数

屏幕截图 2022-12-24 165720

先看看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值,可以直接利用在线工具得到

屏幕截图 2022-12-24 160650

转换为10进制数得到flag的第二部分

屏幕截图 2022-12-24 160621

flag拼起来为0CTF{-1839715371189242199}

验证通过

屏幕截图 2022-12-24 171433


mobicrackNDK

先用jadx打开,找到程序主体部分,主要是两个部分,一个是Calc,一个是CrackMe,Calc里面只有一个字符串,CrackMe里好像链接了一个外来库叫mobicrackNDK

屏幕截图 2022-12-24 204615

屏幕截图 2022-12-24 180619

主体的函数是tsetFlag这个函数,但是这个函数不在源码里面

搜索学习了一下,lib文件夹里放着的是用c/c++编写的so文件,程序调用的库的内容应该在里面,tsetFlag函数应该也在里面

把apk文件解压,把libmobicrackNDK.so文件用ida32打开,在string窗口搜到了tsetFlag

屏幕截图 2022-12-24 205702

点进去,一路找到了可疑函数abcdefghijklmn

屏幕截图 2022-12-24 205907

打开来看看,flag应该是16位,前8位联系到一个seed数组,后8位是java源码中key做了一些变换

屏幕截图 2022-12-24 210041

屏幕截图 2022-12-24 210358

先看看seed数组,找到一串字符

屏幕截图 2022-12-24 210543

seed数组还被另外一个函数引用过,打开看看

屏幕截图 2022-12-24 210615

可见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

屏幕截图 2022-12-24 212501

验证通过

屏幕截图 2022-12-24 212722


下载链接

评论

  1. liz
    iPhone AppleWebKit
    1 年前
    2023-9-10 14:08:03

    不错👍🏻

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇