初见

附件为一个apk,无提示信息。

安装apk并打开:

随便输入一个字符串,点击确认:

好大的错误信息。

从使用上看,就获得这些信息,关键在“确认”按键的按下处理函数中。

接下来静态分析看看。

静态分析

使用jadx加载apk,除了R、BuildConfig、JNI就剩下一个MainActivity类。

MainActivity类代码也很简单,按钮点击响应函数为:

this.button.setOnClickListener(new View.OnClickListener() { public void onClick(View v) {MainActivity.this.Show(JNI.getResult(MainActivity.this.pwd.getText().toString()));}
});

就是以输入字符串为参数,调用JNI函数getResult。再以JNI函数的返回值为参数,调用Show:

    public void Show(int type) {switch (type) {case 0:this.textView.setText("Wrong");return;case 1:this.textView.setText("Great");return;default:return;}}

看来我们需要getResult函数返回1。

下面我们来看看JNI函数getResult。

getResult

将apk后缀名改为zip,解压。

在/lib/armeabi-v7a目录下可以找到JNI库:libNative.so。

使用IDA打开,找到Java_com_example_test_ctf03_JNI_getResult函数。

分析发现这原来是个算法题,不过算法也不复杂。该函数中重要部分代码如下:

bool __fastcall Java_com_example_test_ctf03_JNI_getResult(int a1, int a2, int a3)
{v3 = 0;if ( strlen(str_in) == 15 ){v5 = (char *)malloc(1u);v6 = (char *)malloc(1u);v7 = (char *)malloc(1u);//1111111111111111111111111111111111111111111Init(v5, v6, v7, str_in, 15);//2222222222222222222222222222222222222222222if ( !First(v5) )goto LABEL_6;//33333333333333333333333333333333333333333333for ( i = 0; i != 4; ++i )v6[i] ^= v5[i];//44444444444444444444444444444444444444444444if ( !strcmp(v6, byte_2888) ){//5555555555555555555555555555555555555555555555for ( j = 0; j != 4; ++j )v7[j] ^= v6[j];//6666666666666666666666666666666666666666666666v3 = strcmp(v7, byte_288E) == 0;}else{
LABEL_6:v3 = 0;}}return v3;
}

我用注释将上面代码分隔为几部分,方便讲解。

可以看出输入字符串长度应该为15。

从参数看,最上面的Init函数应该对输入字符串进行了处理,并填充v5、v6、v7的内容,因为输入字符串之后再没使用过。先看看这个函数。

Init

该函数伪代码为:

char *__fastcall Init(char *v5, char *v6, char *v7, const char *str, int strlen)
{int i; // r5int v16; // r10int v17; // r6if ( strlen < 1 ){v16 = 0;}else{i = 0;v16 = 0;do{v17 = i % 3;if ( i % 3 == 2 ){v7[i / 3u] = str[i];}else if ( v17 == 1 ){v6[i / 3u] = str[i];}else if ( !v17 ){++v16;v5[i / 3u] = str[i];}++i;}while ( strlen != i );}v5[v16] = 0;v6[v16] = 0;v7[v16] = 0;return v5;
}

这个函数就是将输入字符串的0/3/6/9/12字节给v5,1/4/7/10/13字节给v6,2/5/8/11/14字节给v7。

反过来看,知道了调用Init后v5、v6、v7内容,也就知道了输入字符串的内容。

下面分别推导v5、v6、v7。

v5

在注释2和注释3之间,以v5为参数调用了First函数,该函数伪代码为:

bool __fastcall First(char *a1)
{int i; // r1for ( i = 0; i != 4; ++i )a1[i] = (2 * a1[i]) ^ 0x80;return strcmp(a1, byte_1074) == 0;
}

该函数需要返回1,也就是最后a1内容和byte_1074内容相同。

a1变为byte_1074内容之前,经过的变换就是将前4字节乘以2并异或0x80。

逆变换就是先异或0x80再除以2。

据此,我们就可以得到First的参数a1,也就是Init后v5的内容。

并且调用完First函数,v5的内容为byte_1074。

v7

回到getResult函数继续向下看。

这里需要从后往前,逆推。

先看注释6下面的:

v3 = strcmp(v7, byte_288E) == 0;

v3是返回值,需要为1,所以strcmp函数需要返回0。也就是v7和byte_288E相等,为:

.rodata:0000288E byte_288E       DCB 0x41, 0x46, 0x42, 0x6F, 0x7D

再看注释4和注释5之间:

if ( !strcmp(v6, byte_2888) )

这个 if 判断需要为真,也就是strcmp返回0,也就是在注释4和注释5之间,v6内容和byte_2888相同,为:

.rodata:00002888 byte_2888       DCB 0x20, 0x35, 0x2D, 0x16, 0x61

现在,我们知道了注释5之前的v6,知道了注释6之后的v7,注释5和6之间,是将v6和v7的前4个字节异或并赋值给v7,也就是注释5之前,v7的内容为注释6之后的v7异或v6。

总结一下,到注释4为止:

  • v7的前4字节为byte_288E和byte_2888的异或,第5字节为byte_288E的第5字节。
  • v6内容为byte_2888

v7在注释4之前没有再被修改过,至此我们就得到了Init后v7的内容。

v6

注释3和注释4之间,v5的前4字节与v6进行了异或,并赋值给v6。

再注释4时,v6内容为byte_2888。注释3时,v5内容为byte_1074。

可以得到注释3时,v6内容前4字节为byte_2888与byte_1074的异或,第5字节为byte_2888第5字节。

而注释3之前再没修改过v6,这里就得到了Init后的v6内容。

计算v5、v6、v7脚本

计算这三个值的python脚本为:

def main():byte_288E = [0x41, 0x46, 0x42, 0x6F, 0x7D]byte_2888 = [0x20, 0x35, 0x2D, 0x16, 0x61]v7 = [0, 0, 0, 0, 0]for i in range(4):v7[i] = byte_2888[i] ^ byte_288E[i]v7[4] = byte_288E[4]byte_1074 = [0x4C, 0x4E, 0x5E, 0x64, 0x6C]v5 = [0, 0, 0, 0, 0]for i in range(4):v5[i] = (byte_1074[i] ^ 0x80) >> 1v5[4] = byte_1074[4]v6 = [0, 0, 0, 0, 0]for i in range(4):v6[i] = byte_1074[i] ^ byte_2888[i]v6[4] = byte_2888[4]print('v5:%x-%x-%x-%x-%x' % (v5[0], v5[1], v5[2], v5[3], v5[4]))print('v6:%x-%x-%x-%x-%x' % (v6[0], v6[1], v6[2], v6[3], v6[4]))print('v7:%x-%x-%x-%x-%x' % (v7[0], v7[1], v7[2], v7[3], v7[4]))if __name__ == "__main__":main()

运行结果为:

之后我们按列,竖着拼接,即可得到flag:flag{sosorryla}

XCTF_MOBILE17_Android2.0相关推荐

  1. 估算带卷积核二分类0,3的网络的收敛时间和迭代次数

    制作一个网络分类minst的0和3求出这网络的迭代次数曲线表达式n(δ),和准确率表达式p-max(δ),用预期准确率去估算n,并推算需要的时间. 将minst的28*28的图片缩小到9*9,网络用一 ...

  2. 神经网络收敛标准与准确率之间的数学关系

    制作一个带一个3*3卷积核的神经网络,测试集是minst的0和2图片集,将28*28的图片缩小成9*9,隐藏层30个节点所以网络的结构是 S(minst0)-(con3*3)49-30-2-(1,0) ...

  3. 用共振频率去进行图片分类的尝试

    假设有一种物质,这种物质的原子核的质子数和电子数可以不同,允许质子的带电量不同,并且质子带负电,同时这个原子的电子不满足鲍利不相容原理,环境温度是 (1/1.3806505)*10^23k,电子波的频 ...

  4. 收敛标准对迭代次数影响

    制作一个n*n的网络,将收敛标准分别设定在,0.001,0.01,0.02,0.03,0.04,0.05,0.06,0.07,0.08,0.09,0.1,观察网络达到平衡时迭代次数的变化. 比如如图的 ...

  5. vue省市区三级联动mysql,js/json,html/jsp

    大家好,我是烤鸭: 省市区三级联动数据及页面: 测试的时候,发现少了几个地区,现在补上了,也优化了下排版. 如果你懒得复制和看的话,这里是打包的下载地址. 之前的资源地址也改了,http://down ...

  6. ZAM 3D 制作3D动画字幕 用于Xaml导出

    ZAM 3D 制作3D动画字幕 用于Xaml导出 原文:ZAM 3D 制作3D动画字幕 用于Xaml导出 原地址-> http://www.cnblogs.com/yk250/p/5662788 ...

  7. 将执行文件转化为bat批处理文件的工具(批处理文件方式提供)

    update 2006.4.25 15:20 支持64kb以上的执行文件/// @echo e 0100 4d 5a 90 0 3 0 0 0 4 0 0 0 ff ff 0 0 >>Da ...

  8. 完整的境外、港澳台、电信、移动、联通、教育网、国内其他ISP的IPv4列表(数据整理日期2022年4月)-IP列表太长只能份2篇发布(1/2)

    完整的境外.港澳台.电信.移动.联通.教育网.国内其他ISP的IPv4列表(数据整理日期2022年4月)-IP列表太长只能份2篇发布(1/2) 综述 境外(不含港澳台)IPv4地址 综述 企业所在地南 ...

  9. 聚宽JQData说明书

    由于内容较多,可使用Ctrl+F搜索您需要的数据. 注意:query函数的更多用法详见:sqlalchemy.orm.query.Query对象 JQData是什么 JQData是聚宽数据团队专门为金 ...

最新文章

  1. 微信 request 合法域名校验出错
  2. 2021年春季学期-信号与系统-第八次作业参考答案
  3. 【Paper】Few-Shot Charge Prediction with Discriminative Legal Attributes
  4. png 转数组 工具_推荐8款实用在线制图工具
  5. 怎么中文读_这些中文名字如果用日语念出来会怎样?!
  6. SQLite3中的数据类型
  7. 【zookeeper系列】centos7安装zookeeper
  8. 如果没有Visual Studio 2015,我们如何创建.NET Core项目 ?
  9. 数据集可以导入mysql_利用数据集进行数据访问操作
  10. 2017上海ACM ECL-final 总结
  11. 我眼中的2011年互联网大事记
  12. python爬虫实现下载酷我里面周杰伦的付费歌曲
  13. android开发中常用的Eclipse快捷键详细整理
  14. 简述网卡的作用和工作原理_简述网卡的主要功能
  15. 2018年结婚大数据来了:深圳离婚率高居第三,原因竟然是……
  16. 文本代码编辑器UltraEdit v26.00.0.74 中文版下载与破解方法【亲测有效】
  17. 用C#实现鼠标左右键的切换
  18. Swagger-ui.html页面简单的修改
  19. 7、帆软填报-分页预览
  20. python面向对象试题_python面向对象程序设计-中国大学mooc-试题题目及答案

热门文章

  1. putenv() has been disabled for security reasons [srv_status.php:22 → require_once() → ZBase-run() →
  2. A9G GPS定位系统介绍(物联网、.NET Core web、Winform、Wpf、STM32)
  3. 超好用的网易mumu模拟器mac版 还是免费的哦!!!
  4. 图片转文字哪个软件好?分享实用图片转文字软件
  5. 从两边往中间流水灯c语言程序,单片机控制LED流水灯从中间向两边.doc
  6. 疫情之下特殊的升旗仪式
  7. 投资持续升温,智能汽车“网络安全”赛道风口已至
  8. 谷歌百度以图搜图 感知哈希算法 C#简单实现
  9. Windows这些自带应用一定不要删,否则会直接影响到电脑使用
  10. Linux 音频player对比