偃师网站制作要多少钱【域名企业邮箱服务器注册申请办理】偃师网络优化公司哪家好、偃师软件开发外包价格、偃师高端企业网站页面制作设计专业公司、偃师微信公众号小程序购物支付搭建制作公司-网站优化-网站建设【企业网站制作|网页设计】- 高端网站建设 - 书生商友信息科技-

全国热线:400-111-6878

网站建设推广专家

偃师网站制作要多少钱【域名企业邮箱服务器注册申请办理】偃师网络优化公司哪家好、偃师软件开发外包价格、偃师高端企业网站页面制作设计专业公司、偃师微信公众号小程序购物支付搭建制作公司

发表日期: 2021-04-30 10:04:43 浏览次数:125

偃师网站制作要多少钱【域名企业邮箱服务器注册申请办理】偃师网络优化公司哪家好、偃师软件开发外包价格、偃师高端企业网站页面制作设计专业公司、偃师微信公众号小程序购物支付搭建制作公司


偃师区,隶属于河南省洛阳市,位于河南省西部,总面积668.58平方千米 [1]  。截至2019年末,偃师区总人口63.2万人 [3]  ,截至2020年6月,偃师区下辖4个街道、9个镇 [2]  ,偃师区人民政府驻槐新街道民主路27号。 [24] 

周,设偃师县。1993年,偃师撤县设市。 [4]  2021年3月,撤销县级偃师市,设立洛阳市偃师区 [25]  。偃师区是河南省制造业高质量发展综合评价试点市 [5]  、革命文物保护利用片区分县 [6]  、国家卫生城市(区)。 [18] 

2019年,偃师区实现地区生产总值443.6亿元,固定资产投资193.8亿元,一般公共预算收入24.6亿元,社会消费品零售总额222.6亿元。 [7] 


前言

样例来源于3W班10月份第1题,考察java核心代码被保护起来,如何通过修改aosp源码,快速逆向分析方法,破解flag。

思路

apk核心的Java层代码被转换为Native,jadx反编译工具,无法正常的静态分析。我们可以跟老师学习的技能,从aosp源码修改入手,结合frida,破解apk

解题

静态分析apk


核心onCreate方法,被vmp保护了,变为native方法。这里无需对vmp函数还原,可以修改aosp对函数调用进行探测,从而达到分析目的。

VMP LOG分析

修改aosp源码,监控InvokeWithArgArray。刷入修改后的rom,手机运行app,结合frida hook strstr函数,获取具体代码call日志。重要信息如下:

======summery
called: java.lang.String com.kanxue.test.MainActivity.stringFromJNI(java.lang.String)
called: byte[] java.lang.String.getBytes(java.lang.String)
called: void javax.crypto.spec.SecretKeySpec.<init>(byte[], java.lang.String)
called: javax.crypto.Cipher javax.crypto.Cipher.getInstance(java.lang.String)
called: void javax.crypto.Cipher.init(int, java.security.Key)
called: byte[] javax.crypto.Cipher.doFinal(byte[])
called: byte[] android.util.Base64.encode(byte[], int)
called: java.lang.String java.lang.StringFactory.newStringFromBytes(byte[])
called: java.lang.String java.lang.String.replace(java.lang.CharSequence, java.lang.CharSequence)
called: boolean java.lang.String.equals(java.lang.Object)

 

从而得到具体的流程,将其分为2个阶段:

1> 输入input -->srtingFromJNI(libnative-lib.so)
2> Cipher加密分析

Frida hook分析具体函数

根据log日志,选择如下函数,进行frida hook监测:

1> java.lang.String com.kanxue.test.MainActivity.stringFromJNI(java.lang.String)
2> javax.crypto.Cipher.getInstance(java.lang.String)
3> void javax.crypto.Cipher.init(int, java.security.Key)
4> byte[] javax.crypto.Cipher.doFinal(byte[])
5> byte[] android.util.Base64.encode(byte[], int)

 

app输入input: 1111
frida监测到核心日志

1
2
3
4
5
6
7
8
9
10
11
MainActivity.stringFromJNI::  1111  rst: ptx4WA==
 
Cipher.getInstance :: AES/ECB/PKCS5Padding
 
Cipher.init :: 1
Cipher.init :: [48,49,50,51,52,53,54,55,56,57,97,98,99,100,101,102]
 
Cipher.doFinal input:: ptx4WA==
 
Base64.encode:: int--0
Base64.encode rstStr:: bauiEdMM9zdcklxoLHXU9g==

这里应该就是对输入的flag进行处理,总结流程:

<1>input --> stringFromJNI (1111 --> ptx4WA==)

<2> AES_ECB_PKCS5Padding (key: 0123456789abcdef) --> Base64

 

那么梳理一下,就是输入flag进行上述处理,得出的结果,与真实的flag进行比较。
这里需要找到真实的flag, 可以rom log后面,有调用:

called: boolean java.lang.String.equals(java.lang.Object)

 

可以用frida hook该函数,获取真实的flag:

String.equals:: arg1: +OcSHGzedhKYu34wz2DqbONkdYp9OGzQ+KkX552G6S0=

 

可以就按照上述过程,反过来逆向出真实的flag.

正确的密码: +OcSHGzedhKYu34wz2DqbONkdYp9OGzQ+KkX552G6S0=
加密流程:
stringFromJni -->AES/ECB/PKCS5Padding(已知key) --> base64算法
故而解除密码:
base64算法 --> AES/ECB/PKCS5Padding(已知key) --> stringFromJni

AES/ECB/PKCS5Padding算法

<1>将aes_ecb_pks5padding的key, 转换为base64字符串或者hex:

[48,49,50,51,52,53,54,55,56,57,97,98,99,100,101,102]
tohex: 30313233343536373839616263646566
toBase64: MDEyMzQ1Njc4OWFiY2RlZg==
toUTF8: 0123456789abcdef

 

<2>base64正确flag进行aes_ecb算法加密

Input(base64):: +OcSHGzedhKYu34wz2DqbONkdYp9OGzQ+KkX552G6S0=

 


得到结果:8YEoDpO3wRFihWIGSzZ0/Q==

stringFromJNI分析

需要分析出stringFromJNI对input做了哪些处理,获取完整的流程,后面就可以根据流程反推出正确的flag
用ida64打开zlibnative-lib.so,没有任何混淆,代码可读性好。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
__int64 __fastcall Java_com_kanxue_test_MainActivity_stringFromJNI(__int64 a1, __int64 a2, __int64 a3)
{
  __int64 v3; // ST48_8
  __int64 v4; // x0
  __int64 v5; // ST28_8
  __int64 v6; // x0
  __int64 v7; // ST20_8
  __int64 v8; // ST08_8
  __int64 v9; // ST18_8
 
  v3 = a1;
  v4 = sub_15EC(a1, a3, 0LL);
  v5 = v4;
  v6 = strlen(v4);
  v7 = malloc(v6);
  strcpy(v7, v5);
  sub_1440(&unk_3008, v7); //关键函数
  v8 = strlen(v5);
  v9 = sub_8AC(v7, v8);  //标准的base64算法
  sub_1440(&unk_3008, v7);
  return sub_163C(v3, v9);
}

这里可以用frida hook sub_1440和sub_8AC, 进一步验证:
输入:1111
frida hook关键日志:

1> sub_1440(&unk_3008, v7); //关键函数
核心日志:
sub_1440 onEnter==========
sub_1440 arg0:: 0 1 2 3 4 5 6 7 8 9 A B C D E F 0123456789ABCDEF
7edacf6008 72 63 34 74 65 73 74 00 00 00 00 00 00 00 00 00 rc4test.........
sub_1440 arg1:: 1111
sub_1440 onLeave==========
sub_1440 ret:: 0x7feced9600
sub_1440 this.arg1:: 0 1 2 3 4 5 6 7 8 9 A B C D E F 0123456789ABCDEF
7ee6fff600 a6 dc 78 58
2> sub_8AC(v7, v8);
核心日志:
sub_8AC arg0:: 0 1 2 3 4 5 6 7 8 9 A B C D E F 0123456789ABCDEF
7ee6fff450 a6 dc 78 58
sub_8AC arg1:: 0x4
sub_8AC onLeave==========
sub_8AC ret:: ptx4WA==

 

验证是否是标准的base64算法:
FromHex: a6dc7858
ToBase64:ptx4WA==

 

stringFromJNI核心算法:sub_1440 -> sub_12C4
发现sub_12C4应该是一个RC4算法,且key为: rc4test
在线cyberchef网站验证:
测试样例:1111 ---> a6dc7858

 

stringFromJNI算法:
rc4(key:rc4test) ---> base64

 

那么得到真实的flag:

 

获取的真实的FLAG:
flag{kanxue6666}


微信图片_20210425092605.jpg


偃师网站制作要多少钱域名企业邮箱服务器注册申请办理偃师网络优化公司哪家好、偃师软件开发外包价格、偃师高端企业网站页面制作设计专业公司、偃师微信公众号小程序购物支付搭建制作公司

上一条:偃师网络公司哪家好【偃师企业网站百度SEO推广公司】偃师做网站开发价格、偃师淘宝店铺开店装修设计运营、公司网站制作方案流程改版维护费用、偃师高端企业网站页面制作设计专业公司需要多少钱
下一条:偃师400电话申请开通【偃师企业网站建设】偃师微信公众号小程序开发运营价格、偃师微信公众号APP软件客户端设计运营、偃师网页页面设计公司费用、偃师公司网站制作方案流程改版维护大概需要多少钱
网站制作
小程序制作
网站优化
网站开发
400电话办理
网络推广
网站建设
网店装修
微信公众号开发
网页设计
网络公司
域名企业邮箱
服务器空间
网站案例报价
百科问答
编辑排版美工
App软件开发
百度推广
代运营托管
logo设计
网络全网营销
网站备案
网站定制
小程序开发公司
首页
电话
立即预约