这是一道纯算法还原题

1. apk安装到手机,提示输入flag,看来输入就是flag

2. jadx 打开apk查看

  1. this.button.setOnClickListener(new View.OnClickListener() { // from class: com.example.test.ctf03.MainActivity.1
  2. @Override // android.view.View.OnClickListener
  3. public void onClick(View v) {
  4. String str = MainActivity.this.pwd.getText().toString();
  5. int result = JNI.getResult(str);
  6. MainActivity.this.Show(result);
  7. }
  8. });

JNI.java

  1. public class JNI {
  2. public static native int getResult(String str);
  3. static {
  4. System.loadLibrary("Native");
  5. }
  6. }

3. IDA打开 libNative.so 看看

  1. bool __fastcall Java_com_example_test_ctf03_JNI_getResult(JNIEnv *env, jclass a2, jstring str)
  2. {
  3. int v3; // r4
  4. const char *str_chars; // r8
  5. char *v5; // r6
  6. char *v6; // r4
  7. char *v7; // r5
  8. int i; // r0
  9. int j; // r0
  10. v3 = 0;
  11. str_chars = (*env)->GetStringUTFChars(env, str, 0);
  12. if ( strlen(str_chars) == 15 )
  13. {
  14. v5 = (char *)malloc(1u);
  15. v6 = (char *)malloc(1u);
  16. v7 = (char *)malloc(1u);
  17. Init(v5, v6, v7, str_chars, 15);
  18. if ( !First(v5) )
  19. return 0;
  20. for ( i = 0; i != 4; ++i )
  21. v6[i] ^= v5[i];
  22. if ( !strcmp(v6, a5) )
  23. {
  24. for ( j = 0; j != 4; ++j )
  25. v7[j] ^= v6[j];
  26. return strcmp(v7, "AFBo}") == 0;
  27. }
  28. else
  29. {
  30. return 0;
  31. }
  32. }
  33. return v3;
  34. }

先看一下Init函数在干什么

  1. int __fastcall Init(int result, char *a2, char *a3, const char *str_chars, int len)
  2. {
  3. int v5; // r5
  4. int v6; // r10
  5. int v7; // r6
  6. if ( len < 1 )
  7. {
  8. v6 = 0;
  9. }
  10. else
  11. {
  12. v5 = 0;
  13. v6 = 0;
  14. do
  15. {
  16. v7 = v5 % 3;
  17. if ( v5 % 3 == 2 )
  18. {
  19. a3[v5 / 3u] = str_chars[v5];
  20. }
  21. else if ( v7 == 1 )
  22. {
  23. a2[v5 / 3u] = str_chars[v5];
  24. }
  25. else if ( !v7 )
  26. {
  27. ++v6;
  28. *(_BYTE *)(result + v5 / 3u) = str_chars[v5];
  29. }
  30. ++v5;
  31. }
  32. while ( len != v5 );
  33. }
  34. *(_BYTE *)(result + v6) = 0;
  35. a2[v6] = 0;
  36. a3[v6] = 0;
  37. return result;
  38. }

通过分析可知,该函数将字符串分为了三分,第一个字符给a1,第二个给a2,第三个给a3,第四个给a1,这样循环下去

再看First函数
  1. bool __fastcall First(char *a1)
  2. {
  3. int i; // r1
  4. for ( i = 0; i != 4; ++i )
  5. a1[i] = (2 * a1[i]) ^ 0x80;
  6. return strcmp(a1, "LN^dl") == 0;
  7. }

这里是 拿着a对应的字符做个计算然后取和一个常量比较,这里可以倒推出a1的值,对应python

  1. def first():
  2. b = "LN^dl"
  3. a1 = ''
  4. for i in range(0, 4):
  5. print(i)
  6. a1 += (chr(int((ord(b[i])^0x80)/2)))
  7. a1 += 'l'
  8. print(a1)
  9. #得到 fgorl

注意这里得到了a1原来的值,但是这里a1已经被改了,值为"LN^dl", 我就在这里被坑到了

first函数过了之后,v6 做了一些计算,然后又和一个常量比较,那么又可以用上面的方法取干活
  1. for ( i = 0; i != 4; ++i )
  2. v6[i] ^= v5[i];
  3. if ( !strcmp(v6, a5) ){
  4. ......
  5. }

对应python

  1. def second():
  2. a5 = [ord(' '), ord('5'), ord('-'), 0x16, ord('a')]
  3. # v5 = [ord('f'), ord('g'), ord('o'), ord('r'), ord('l')]
  4. v5 = [ord('L'), ord('N'), ord('^'), ord('d'), ord('l')]
  5. v6 = ""
  6. for i in range(0, 4):
  7. t = v5[i]^a5[i]
  8. v6 += (chr(t))
  9. v6 += 'a'
  10. print(v6)
  11. # 得到 l{sra

最后v7 也是一个套路,这里就直接给还原的代码了

  1. def third():
  2. a6 = [ord('A'), ord('F'), ord('B'), ord('o'), ord('}')]
  3. v6 = [ord(' '), ord('5'), ord('-'), 0x16, ord('a')]
  4. v7 = ''
  5. for i in range(0, 4):
  6. t = v6[i]^a6[i]
  7. v7 += (chr(t))
  8. v7 += '}'
  9. print(v7)
  10. # 得到 asoy}

最后把三个值拼起来,也就是最上面分析的那个循环赋值的逻辑,这里是还原算法

  1. s1 = 'fgorl'
  2. s2 = 'l{sra'
  3. s3 = 'asoy}'
  4. flag = ''
  5. for i in range(5):
  6. flag += s1[i] + s2[i] + s3[i]
  7. print(flag)
  8. # 得到 flag{sosorryla}

【Android 逆向】【攻防世界】android2.0的更多相关文章

  1. 逆向-攻防世界-crackme

    查壳,nSpack壳,直接用软件脱壳,IDA载入程序. 很明显,就是将402130的数据和输入的数据进行异或,判断是否等于402150处的数据.dwrd占4字节. 这道题主要记录一下刚学到的,直接在I ...

  2. 逆向-攻防世界-maze

    题目提示是走迷宫. IDA载入程序分析. 输入字符长度必须是24,开头必须是nctf{,结尾必须是}.在125处按R就可以变成字符. sub_400650和sub_400660是关键函数,分析sub_ ...

  3. 逆向-攻防世界-CSAW2013Reversing2

    运行程序乱码,OD载入搜索字符串,断电到弹窗Flag附近. 发现跳过00B61000函数,弹窗乱码,我们试试调用00B61000函数.将00B61094的指令修改为JE SHORT 00B6109b. ...

  4. 逆向-攻防世界-logmein

    iDA载入程序,shift+F12查看关键字符串,找到双击来到所在地址,进入函数 然后进入主函数, 经过分析,可以得出:输入的字符要等于  经过处理的v7和v8的异或.v8很明显,但是v7是怎么回事呢 ...

  5. 逆向-攻防世界-no-strings-attached

    看题目就知道查找不到关键字符串,为防止踩坑,strings命令查看,没有找到有用的字符串.IDA载入程序查找入口函数, main函数中有4个函数,经过分析判断authenticate()为关键函数,跟 ...

  6. 攻防世界逆向——game

    攻防世界逆向:game wp 攻防世界逆向新手区的一道题目. 是一道windows的creak,动态调试打开是这样的: 题目说明是让屏幕上所有的图像都亮之后,会出现flag,看来应该是可以玩出来的. ...

  7. [转]Android逆向之动态调试总结

    一.在SO中关键函数上下断点 刚学逆向调试时.大多都满足于在SO中某关键函数上下断点.然后通过操作应用程序,去触发这个断点,然后进行调试 详细的步骤可以参见非虫大大的<Android软件安全与逆 ...

  8. 攻防世界 reverse evil

    这是2017 ddctf的一道逆向题, 挑战:<恶意软件分析> 赛题背景: 员工小A收到了一封邮件,带一个文档附件,小A随手打开了附件.随后IT部门发现小A的电脑发出了异常网络访问请求,进 ...

  9. 攻防世界 reverse 进阶 APK-逆向2

    APK-逆向2 Hack-you-2014 (看名以为是安卓逆向呢0.0,搞错了吧) 程序是.net写的,直接祭出神器dnSpy 1 using System; 2 using System.Diag ...

  10. Android trap攻防思路整理

    Android trap攻防                                                                      图/文 h_one 0x01 反 ...

随机推荐

  1. 【转帖】nginx变量使用方法详解-1

    https://www.diewufeiyang.com/post/575.html Nginx 的配置文件使用的就是一门微型的编程语言,许多真实世界里的 Nginx 配置文件其实就是一个一个的小程序 ...

  2. [转帖]Linux—CPU核数、上下文切换介绍及pidstat等命令详解

    https://www.jianshu.com/p/0ae0c1153c34 关注:CodingTechWork,一起学习进步. 引言 并发编程   并发编程的目的是为了改善串行程序执行慢问题,但是, ...

  3. [转帖]vs调试运行程序出现:“由于找不到MSVCP140D.dll,无法继续执行代码 ”的解决方法

    碎碎念 最近在使用Visual studio调试程序的时候,突然冒出了"由于找不到MSVCP140D.dll,无法继续执行代码.重新安装程序可能会解决次问题."的错误.如下图所示. ...

  4. [转帖]一行Python代码实现同一局域网内的文件共享

    在不同的设备之间传输文件除了数据线,网盘传输外是否还有其他优雅的方法?我们可以使用一行Python代码使局域网内的所有设备都可以访问并下载文件夹内的文件. 要求: 电脑中安装配置好python 访问的 ...

  5. CentOS8 安装 SQLSERVER2019的简单过程

    1. 获取rpm包直接从微软官方网站即可 -rw-r--r-- 1 root root 820984 Apr 5 22:23 msodbcsql17-17.5.2.1-1.x86_64.rpm -rw ...

  6. Concat、Push、Spread syntax性能差异对比

    今天在力扣上做了一道数组扁平化的题,按理来说,应该熟能生巧了,但是在使用concat时候超出了时间限制,使用push可以通过,代码如下: /** * @describe 使用concat,超出时间限制 ...

  7. Spring Boot 统一RESTful接口响应和统一异常处理

    一.简介 基于Spring Boot 框架开发的应用程序,大部分都是以提供RESTful接口为主要的目的.前端或者移动端开发人员通过调用后端提供的RESTful接口完成数据的交换. 统一的RESTfu ...

  8. 设计模式学习-使用go实现迭代器模式

    迭代器模式 定义 优点 缺点 适用范围 代码实现 参考 迭代器模式 定义 迭代器模式(Iterator Design Pattern),也叫作游标模式(Cursor Design Pattern). ...

  9. trick1---实现tensorflow和pytorch迁移环境教学

    相关文章: [一]tensorflow安装.常用python镜像源.tensorflow 深度学习强化学习教学 [二]tensorflow调试报错.tensorflow 深度学习强化学习教学 [三]t ...

  10. 7.3 Windows驱动开发:内核监视LoadImage映像回调

    在笔者上一篇文章<内核注册并监控对象回调>介绍了如何运用ObRegisterCallbacks注册进程与线程回调,并通过该回调实现了拦截指定进行运行的效果,本章LyShark将带大家继续探 ...