WhaleCTF平台Android部分题解


###android01

利用工具对该apk进行反编译,利用jd查看其java源码由于增加了混淆,且没有so文件,java文件较少,随意浏览了一下几个文件,意外发现一段要base64解密的数列:

public static String a()  {return new String(Base64.decode(new byte[] { 97, 72, 82, 48, 99, 68, 111, 118, 76, 122, 81, 49, 76, 106, 77, 121, 76, 106, 81, 51, 76, 106, 107, 52 }, 0));  }

将上述数列转化为字符串,解密后竟然真的得到了IP。。。。。。


Android05

将apk反编译后用jd查看java源码–坑!!!

按照MainActivity.class中的源码分析:

     public void onClick(View paramAnonymousView)  {for (;;){  try  {str = MainActivity.this.text.getText().toString();PackageInfo localPackageInfo = MainActivity.this.getPackageManager().getPackageInfo("com.example.yaphetshan.tencentgreat", 16384);paramAnonymousView = localPackageInfo.versionName;int i = localPackageInfo.versionCode;j = 0;if ((j >= str.length()) || (j >= paramAnonymousView.length())) {  continue;}if (str.charAt(j) != (paramAnonymousView.charAt(j) ^ i)){  Toast.makeText(MainActivity.this, "再接再厉,加油~", 1).show();  return;}  }  catch (PackageManager.NameNotFoundException paramAnonymousView)  {String str;int j;Toast.makeText(MainActivity.this, "年轻人不要耍小聪明噢", 1).show();continue;  }  j++;  continue;  if (str.length() != paramAnonymousView.length()) {continue;  }  Toast.makeText(MainActivity.this, "恭喜开启闯关之门", 1).show();}  }

对上分析可得对字符串versionname的每个字节与versioncode进行异或即可得flag-----坑来了:我先对com.example.yaphetshan.tencentgreat和16384进行异或发现错误,然后找正确的versioncode,当在BuildConfig。class中找到正确versioncode时竟发现versionname也是错的 [/想哭]

public final class BuildConfig{  public static final String APPLICATION_ID = "com.example.yaphetshan.tencentgreat";  public static final String BUILD_TYPE = "debug";  public static final boolean DEBUG = Boolean.parseBoolean("true");  public static final String FLAVOR = "";  public static final int VERSION_CODE = 15;  public static final String VERSION_NAME = "X

然后对上述两个进行异或即可得到答案了


Android09

1、将apk反编译并利用JD查看其java源码,并将apk在模拟器中运行

2、通过题意以及apk运行至submit之后获得结果页面,定位到关键词“local”、“24H”、“History”这几个固定字符串

3、通过APK改之理等搜索关键词,定位到名为HighScoresActivity.smali的文件,利用jd查看(history只是在其中进行了定义),出于对文件名的怀疑继续查看源码,发现了showGlobalList()方法,对其中的getGlobalScores()方法继续追踪,又对其内的Score类追踪,发现了getScore()方法:

public double getScore()  {double d;if (GET_SCORE_FLAG == 11) {  d = getvalue();}for (;;){  return d;  if (GET_SCORE_FLAG == 31) {d = getScoreReal();  } else {d = -1.0D;  }}  }public double getvalue(){return 20000.0D;}

从上可见对与GET_SCORE_FLAG变量进行修改即可得到flag


Android13

1、对apk反编译后利用jd查看其java源码,定位到simple.class的check()方法[此处怀疑jd对smali的反汇编存在问题,直接对smali文件进行分析,emmm,一大堆的switch判断语句。(简单的理了一下,果断选择找大神的WP)

2、通过大神的WP,尝试利用jeb2.2.7(用2.3.7半天加载不出进程)对APK的动态分析(还有一个是log注入输出)

https://blog.csdn.net/whklhhhh/article/details/78025563
(https://bbs.ichunqiu.com/thread-25351-1-1.html)

3、成功debug(直接用的虚拟机,没有出现大佬WP中的问题)后下断点、我们将断点下载return之前,这样既保证数据处理完毕,寄存器中的值又没有初始化

4、在模拟器中随意输入并check即可查看到VM/locals窗口下的this/B数组中的值了,将前几个非0的十六进制转化为ascii码即为flag


###Android02

1.用jadx直接查看其java源码,发现他调用了名为msky的so中的rx3sdfx函数来获取默认的信息

2.提取并利用IDA查看其so文件并反汇编分析rx3sdfx函数的伪代码

3.在伪代码的后面发现大量的异或,将数值较小的异通过ascii码转换能够正常进行转换但大数值异或后不能转化(在这上面困惑了很久)后来凑巧发现它是将数值转化为16进制并两两拆分进行异或运算。(解释如下:)

v135 ^= 0x6B6B6B6Bu;v136 ^= 0x6B6B6B6Bu;v137 ^= 0x6Bu;v138 ^= 0x6Bu;v139 ^= 0x6Bu;v6 = (*(int (__fastcall **)(int, int *))(*(_DWORD *)v3 + 668))(v3, &v135);上述v136 = 1548966746;正常异或-->结果:926429233本题异或-->1548966746 == 0x5c535b5a 将0x5c、0x53...分别与0x6B进行异或得出结果

这题做出来还是凑巧的,表示能力还是不行啊

之后的学习目标–>手动脱壳

更多相关文章

  1. [置顶] 在此分享android源码下载地址 绝对可以下
  2. FFmpeg学习—android 利用ffmpeg 录制ogg格式音频文件
  3. Android(安卓)条码扫描器 一维条形码 二维QR码 apk 源码 下载
  4. android自动化测试CTS源码分析之一
  5. 带你一步一步深入Handler源码,拿下面试官不在话下!
  6. Android(安卓)弹出式布局之Dialog源码分析
  7. HttpURLConnection 源码分析
  8. android studio dependencies依赖的库(jar包)的存储位置
  9. 国内优秀Android学习资源汇总全集

随机推荐

  1. Android(安卓)AlertDialog ————单选
  2. Android(安卓)PinyinIME 源码笔记 -- 0.
  3. 隐藏菜单APP显示图标
  4. android init.rc增加一个自定义的service
  5. Installation error: INSTALL_FAILED_INS
  6. Android(安卓)Studio打包设置分支
  7. android网络图片的下载
  8. android前台渲染图片
  9. Android图形报表之AchartEngine(附开发包
  10. Android中循环的几种方式