前几天打CTF时遇到的一道安卓逆向,这里简单的写一下思路

  • 首先用jadx打开apk文件,找到simplecheck处(文件名是simplecheck),可以看到基本逻辑就是通过函数a对输入的内容进行判断,如果正确就弹出You get it。

  • 我们去类a里看一下可以发现这个就是一道简单的算法

  • 判断的条件就是在这一个循环里,可以看到成功的条件是,而iArr[]为flag :

a[i2]== b[i2] * iArr[i2]* iArr[i2] + c[i2] * iArr[i2] + d[i2]

a[i2 + 1] == b[i2] * iArr[i2 + 1] * iArr[i2 + 1] + c[i2] * iArr[i2 + 1] + d[i2]

 int i2 = 0;
while (i2 < c.length)
{
if (a[i2] != (((b[i2] * iArr[i2]) * iArr[i2]) + (c[i2] * iArr[i2])) + d[i2] || a[i2 + 1] != (((b[i2] * iArr[i2 + 1]) * iArr[i2 + 1]) + (c[i2] * iArr[i2 + 1])) + d[i2])
{
return false;
}
i2++;
}
return true;
  • 用python进行爆破

a.length指出flag的长度为35个,并且第一个值赋值为0,所以第一个循环从1到34。并且iArr[]里是byte,java中byte的范围从-128到127,所以第二个循环是0到127(ASCII从0开始)

 int[] iArr = new int[a.length];
iArr[0] = 0;

判断条件进行变化,使iArr变成一个变化值f,所以判断条件变为:

(a[m] == b[m-1] * f * f + c[m-1] * f + d[m-1])
(a[m] == b[m] * f * f + c[m] * f + d[m])

最后的爆破程序是

 a= [0, 146527998, 205327308, 94243885, 138810487, 408218567, 77866117, 71548549, 563255818, 559010506, 449018203, 576200653, 307283021, 467607947, 314806739, 341420795, 341420795, 469998524, 417733494, 342206934, 392460324, 382290309, 185532945, 364788505, 210058699, 198137551, 360748557, 440064477, 319861317, 676258995, 389214123, 829768461, 534844356, 427514172, 864054312]
b= [13710, 46393, 49151, 36900, 59564, 35883, 3517, 52957, 1509, 61207, 63274, 27694, 20932, 37997, 22069, 8438, 33995, 53298, 16908, 30902, 64602, 64028, 29629, 26537, 12026, 31610, 48639, 19968, 45654, 51972, 64956, 45293, 64752, 37108]
c= [38129, 57355, 22538, 47767, 8940, 4975, 27050, 56102, 21796, 41174, 63445, 53454, 28762, 59215, 16407, 64340, 37644, 59896, 41276, 25896, 27501, 38944, 37039, 38213, 61842, 43497, 9221, 9879, 14436, 60468, 19926, 47198, 8406, 64666]
d= [0, -341994984, -370404060, -257581614, -494024809, -135267265, 54930974, -155841406, 540422378, -107286502, -128056922, 265261633, 275964257, 119059597, 202392013, 283676377, 126284124, -68971076, 261217574, 197555158, -12893337, -10293675, 93868075, 121661845, 167461231, 123220255, 221507, 258914772, 180963987, 107841171, 41609001, 276531381, 169983906, 276158562] flag="";
for m in range(1,34):
for f in range(0,127):
if (a[m] == b[m] * f * f + c[m] * f + d[m]) | (a[m] == b[m-1] * f * f + c[m-1] * f + d[m-1]) :
flag+=chr(f)
break
else:
pass
print(flag+"}")
  • 结果为

Simplecheck.apk

CTF的一道安卓逆向的更多相关文章

  1. 安卓逆向(一)--Smali基础

    安卓逆向(一)--Smali基础 标签(空格分隔): 安卓逆向 APK的组成 文件夹 作用 asset文件夹 资源目录1:asset和res都是资源目录但有所区别,见下面说明 lib文件夹 so库存放 ...

  2. 20145307陈俊达_安卓逆向分析_Xposed的hook技术研究

    20145307陈俊达_安卓逆向分析_Xposed的hook技术研究 引言 其实这份我早就想写了,xposed这个东西我在安卓SDK 4.4.4的时候就在玩了,root后安装架构,起初是为了实现一些屌 ...

  3. 20145307陈俊达_安卓逆向分析_APKtools分析smail

    20145307陈俊达_安卓逆向分析_APKtools分析smail 引言 真刺激呢!到了第二篇博客了,难度开始加大,之前是简单的dex2jar和有图形界面的jd-gui,现在来隆重介绍强大的反汇编工 ...

  4. 20145307陈俊达_安卓逆向分析_dex2jar&jd-gui的使用

    20145307陈俊达_安卓逆向分析_dex2jar&jd-gui的使用 引言 这次免考选择了四个项目,难度也是从简到难,最开始先写一个工具的使用 想要开发安卓首先要会编写代码,但是想要逆向分 ...

  5. 安卓逆向之基于Xposed-ZjDroid脱壳

    http://bbs.pediy.com/thread-218798.htm     前言 之前介绍了普通常见的反编译模式 但对于使用了 360加固 棒棒 爱加密 等等的加固应用就没办法了. 你会发现 ...

  6. 【转】安卓逆向(一)--Smali基础

    转载自吾爱破解安卓逆向入门教程 APK的组成 文件夹 作用 asset文件夹 资源目录1:asset和res都是资源目录但有所区别,见下面说明 lib文件夹 so库存放位置,一般由NDK编译得到,常见 ...

  7. 【转】安卓逆向实践5——IDA动态调试so源码

    之前的安卓逆向都是在Java层上面的,但是当前大多数App,为了安全或者效率问题,会把一些重要功能放到native层,所以这里通过例子记录一下使用IDA对so文件进行调试的过程并对要点进行总结. 一. ...

  8. 攻防世界Mobile5 EasyJNI 安卓逆向CTF

    EasyJNI 最近正好在出写JNI,正好看到了一道JNI相关的较为简单明了的CTF,就一时兴起的写了,不得不说逆向工程和正向开发确实是可以互补互相加深的 JNI JNI(Java Native In ...

  9. 安卓逆向学习---初始APK、Dalvik字节码以及Smali

    参考链接:https://www.52pojie.cn/thread-395689-1-1.html res目录下资源文件在编译时会自动生成索引文件(R.java ), asset目录下的资源文件无需 ...

随机推荐

  1. 2、html补充

    今天补充几个html标签 <body>内常用标签 1.<div>和<span> <div></div> : <div>只是一个块 ...

  2. [原创]Burp Suite web应用程序渗透测试神器

    [原创]Burp Suite web应用程序渗透测试神器 一 Burp Suite介绍 Burp Suite是Web应用程序测试的最佳工具之一,其多种功能可以帮我们执行各种任务.请求的拦截和修改,扫描 ...

  3. bootstrap-3-验证表单

    js: $('#nqs-add-userxinxi-form').bootstrapValidator({ message: 'This value is not valid', excluded : ...

  4. TRAC-IK机器人运动学求解器

    TRAC-IK和Orocos KDL类似,也是一种基于数值解的机器人运动学求解器,但是在算法层面上进行了很多改进(Specifically, KDL’s convergence algorithms ...

  5. mysql字符串用法

    replace(str,from_str,to_str) --用字符串to_str替换字符串str中的子串from_str并返回 --mysql> select replace('www.mys ...

  6. R语言学习-set.seed()

    今天查了一下R语言中set.seed(),该命令的作用是设定生成随机数的种子,种子是为了让结果具有重复性.如果不设定种子,生成的随机数无法重现. > x<-rnorm(10) #随机生成1 ...

  7. Docker入门 - 003 Docker 实例

    Docker Hello World Docker 允许你在容器内运行应用程序, 使用 docker run 命令来在容器内运行一个应用程序. 输出Hello world runoob@runoob: ...

  8. Linux(CentOS)安装Node.JS和npm的两种方式(yum安装和源码安装)

    yum安装 yum安装是将yum源中的rpm包下载到本地,安装这个rpm包.这个rpm包是别人编译安装好的二进制包.这种方式方便快捷,特别是不用考虑包依赖. 0.了解linux版本 通过 uname ...

  9. 【python】Python的安装和配置

    Python是一种计算机程序设计语言.是一种动态的.面向对象的脚本语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越来越多被用于独立的.大型项目的开发. Pyt ...

  10. (原创)Rocketmq分布式消息队列的部署与监控

    -------------------------------------------------------------------------------------------- 一.Rocke ...