小菜鸟吹牛的一天,标题不知道叫啥,app2

4857 1
小菜鸟一枚 2022-4-16 11:07:26 | 显示全部楼层 |阅读模式
## 0x2 app2
  1.还是jadx工具打开,看到提示信息,可以看到这里动态绑定SecondActivity。
```
public void onClick(View view) {
        switch (view.getId()) {
            case R.id.button1 /* 2131165187 */:
                if (this.c.getText().length() == 0 || this.d.getText().length() == 0) {
                    Toast.makeText(this, "不能为空", 1).show();
                    return;
                }
                String obj = this.c.getText().toString();
                String obj2 = this.d.getText().toString();
                Log.e("test", obj + " test2 = " + obj2);
                Intent intent = new Intent(this, SecondActivity.class);
                intent.putExtra("ili", obj);
                intent.putExtra("lil", obj2);
                startActivity(intent);
                return;
            default:
                return;
        }
    }

```

  2.在apk里面安装程序,可以看到是2个文本框,输入内容,结合上面的代码可以知道,文本框的内容最终会给到SecondActivity这个类,intent.putExtra添加进去。



  3.说明关键在SecondActivity这个类,看看他的java源码,取出两个文本框的内容进行拼接执行doRawData函数,然后和VEIzd/V2UPYNdn/bxH3Xig==进行比较,按正常逻辑,肯定得相等才会让我成功吧。
```
String stringExtra = intent.getStringExtra("ili");
        String stringExtra2 = intent.getStringExtra("lil");
        if (Encryto.doRawData(this, stringExtra + stringExtra2).equals("VEIzd/V2UPYNdn/bxH3Xig==")) {
            intent.setAction("android.test.action.MoniterInstallService");
            intent.setClass(this, MoniterInstallService.class);
            intent.putExtra("company", "tencent");
            intent.putExtra("name", "hacker");
            intent.putExtra("age", 18);
            startActivity(intent);
            startService(intent);
        }
        SharedPreferences.Editor edit = getSharedPreferences("test", 0).edit();
        edit.putString("ilil", stringExtra);
        edit.putString("lili", stringExtra2);
        edit.commit();
```

  4.Encryto整个类的方法实现都在native层,那接下来就打开IDA去看一看so层代码的实现,到底干了什么:
```
public class Encryto {
    public static native int checkSignature(Object obj);

    public static native String decode(Object obj, String str);

    public static native String doRawData(Object obj, String str);

    public static native String encode(Object obj, String str);

    public native String HelloLoad();

    static {
        System.loadLibrary("JNIEncrypt");
    }
}
```

  5.进去后,找到doRawData函数,第一个参数JNIEnv *env手动改一下,再往下看到关键代码,AES加密,并且AES\_128\_ECB\_PKCS5Padding\_Encrypt这个函数名给了提示。
```
  if ( checkSignature(env, a2, a3) == 1 )
  {
    strcpy((char *)v10, "thisisatestkey==");
    v4 = (char *)(*env)->GetStringUTFChars(env, a4, 0);
    v8 = (const char *)AES_128_ECB_PKCS5Padding_Encrypt(v4, (int)v10);
    (*env)->ReleaseStringUTFChars(env, (jstring)a4, v4);
    result = (*env)->NewStringUTF(env, v8);
  }
```

  6.这里找到在线AES解密网站,选择ECB模式,PKCS5Padding填充,输入密文VEIzd/V2UPYNdn/bxH3Xig==和密钥thisisatestkey==,解密,但是验证结果不对:



  7.F5不准确吗?动态调试一下so文件看看,先回忆一下步骤:

```
1)adb shell,mount -o rw,remount /  重新挂载分区,不然一会文件上传失败
2)adb push android_x86_server /sbin  上传IDA dbgsrv目录下的 android_x86_server
3)chmod +x /sbin/android_x86_server,给它可执行权限,然后输入android_x86_server,运行起来了,默认监听23946端口。
4)adb forward tcp:23946 tcp:23946命令,将手机上的23946窗口,转发到我们电脑本地的23946端口
5)dumpsys activity top,显示顶层窗口,查看包名,入口界面等信息
6)adb shell am start -D -n包名/.入口界面  以调试方式启动
7)使用ida进行如下设置,然后F2下断点,附加目标程序
8)开始调试
```



说明:非反调试程序,567这几步可省略,直接IDA启动调试。

  8.这里没有反调试,附加,直接启动都行,运行后断在了这:



  9.可以看到先是一个签名校验函数,接着处理我刚输入的1111122222,加密后给到v8,然后result返回,没毛病啊,so没问题,再来看看java层有没有问题,JEB动态调试起来,输入tencent和aimage试试,可以看到这里比较应该是相等的,但就是不对,退出了:



&#8195;&#8195;10.翻阅大佬们的wp,安卓xml配置里面有个活动页面没有调用,输入am start -D -n com.tencent.testvuln/.FileDataActivity将<activity android:name="com.tencent.testvuln.FileDataActivity">这个页面拉起来,看看,直接得到了flag。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
YH羽风 2022-4-17 13:47:56 来自手机 | 显示全部楼层
学到了但也学废了
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

中国红客联盟公众号

联系站长QQ:5520533

admin@chnhonker.com
Copyright © 2001-2026 Discuz Team. Powered by Discuz! X3.5 ( 粤ICP备13060014号 )|天天打卡 本站已运行