当前位置:   article > 正文

DASCTF-BabyAndroid

DASCTF-BabyAndroid

一个apk文件

下载下运行不出来

题目有提示

这是截取的信息

第一次写,我就按照大佬的wp思路来

首先我们确定

Host: yuanshen.com

这个信息

jeb打开,搜索

成功锁定到有价值的信息

  1. protected String doInBackground(String[] params) {
  2. String contentText = params[0];
  3. try {
  4. ByteBuffer byteBuffer0 = ByteBuffer.wrap(NoteActivity.this.loadData("Sex.jpg"));
  5. Class class0 = (Build.VERSION.SDK_INT < 26 ? null : new InMemoryDexClassLoader(byteBuffer0, NoteActivity.this.getClassLoader())).loadClass("site.qifen.note.ui.Encrypto");
  6. Method method0 = class0.getMethod("encrypt", String.class);
  7. NoteActivity.this.contentText_back = contentText;
  8. String cipher = (String)method0.invoke(class0.getDeclaredConstructor().newInstance(), NoteActivity.this.sendInit(contentText));
  9. Log.d("JNITest", "Server Response: " + sendRequest.sendPost("http://yuanshen.com/", "data=" + cipher));
  10. return cipher;
  11. }
  12. catch(Exception e) {
  13. e.printStackTrace();
  14. return null;
  15. }
  16. }

首先用一个JPG文件?

查看一下loaddate

一个RC4

 Class class0 = (Build.VERSION.SDK_INT < 26 ? null : new InMemoryDexClassLoader(byteBuffer0, NoteActivity.this.getClassLoader())).loadClass("site.qifen.note.ui.Encrypto");

又加载了一个函数

我们去寻找一下

只发现了这个 encry0(注意原函数引用的o)

这是看出来了,是一个AES加密

可以看见这个keybytes16,被赋值了

它才是密钥,但是我们找不到这个值,也没找到相关的引用

同时DSACTF是初始的key

但是长度也够16的倍数

所以我们还是需要去找到encryo这个函数

先继续分析

这里用了invoke还有sendinint函数

我们找一下(换到JADX)

可以看见invoke就是一个check格式

在library的库中

这里我们可以看见就只要一个so文件

我们现在来理一下:

三个过程---jpg的函数-----encryo-------sendinit函数

一个一个来

jpg

很容易就找到他

用010把他的16进制倒出来

放厨子里面去

厨子自动识别出来了这是dex文件

我们导出这个文件

!

这里就是我们要的encrypto函数

  1. package site.qifen.note.p000ui;
  2. import android.util.Base64;
  3. import javax.crypto.Cipher;
  4. import javax.crypto.spec.SecretKeySpec;
  5. /* renamed from: site.qifen.note.ui.Encrypto */
  6. /* loaded from: C:\Users\15598\Desktop\download.dex */
  7. public class Encrypto {
  8. private static final String KEY = "DSACTF";
  9. private static final String TAG = "Encrypto";
  10. private static byte[] customHash(String input) {
  11. byte[] keyBytes = new byte[16];
  12. int[] temp = new int[16];
  13. for (int i = 0; i < input.length(); i++) {
  14. int charVal = input.charAt(i);
  15. for (int j = 0; j < 16; j++) {
  16. temp[j] = ((temp[j] * 31) + charVal) % 251;
  17. }
  18. }
  19. for (int i2 = 0; i2 < 16; i2++) {
  20. keyBytes[i2] = (byte) (temp[i2] % 256);
  21. }
  22. return keyBytes;
  23. }
  24. public static String encrypt(String data) throws Exception {
  25. byte[] keyBytes = customHash(KEY);
  26. SecretKeySpec secretKeySpec = new SecretKeySpec(keyBytes, "AES");
  27. Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
  28. cipher.init(1, secretKeySpec);
  29. byte[] encryptedBytes = cipher.doFinal(data.getBytes("UTF-8"));
  30. return Base64.encodeToString(encryptedBytes, 2);
  31. }
  32. }

分析可知

对密钥进行了操作

我们直接复制粘贴

  1. import java.security.Key;
  2. public class Main {
  3. private static final String key = "DASCTF";
  4. private static byte[] customHash(String input) {
  5. byte[] keyBytes = new byte[16];
  6. int[] temp = new int[16];
  7. for (int i = 0; i < input.length(); i++) {
  8. int charVal = input.charAt(i);
  9. for (int j = 0; j < 16; j++) {
  10. temp[j] = ((temp[j] * 31) + charVal) % 251;
  11. }
  12. }
  13. for (int i2 = 0; i2 < 16; i2++) {
  14. keyBytes[i2] = (byte) (temp[i2] % 256);
  15. }
  16. return keyBytes;
  17. }
  18. public static void main(String[] args) {
  19. byte[] hashResult1 = customHash("DSACTF");
  20. // 打印第一个哈希结果
  21. System.out.print("Hash result 1: ");
  22. for (byte b : hashResult1) {
  23. System.out.printf("%02X", b);
  24. }
  25. System.out.println(); // 换行
  26. }
  27. }

这里有个草鸡大坑

输入的key是DSACTF

这个比赛叫DASCTF

我服了

_________

Hash result 1: 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D

这里为什么要加0呢,因为我们AES解密需要的是16位

你不可能加个X吧

所以我们加0

同理

厨子

得到了很多的,浮点数?

458.853181,-18.325492,-18.251911,-2.097520,-21.198660,-22.304648,21.103162,-5.786284,-15.248906,15.329286,16.919499,-19.669045,30.928253,-37.588034,-16.593954,-5.505211,3.014744,6.553616,31.131491,16.472500,6.802400,-78.278577,15.280099,3.893073,56.493581,-34.576344,30.146729,4.445671,6.732204

我们再看最后一个函数

直接IDA打开so文件

 

没见过的函数

但是这个cos出现什么的

叫啥余弦变换,我听都没听过,我勒个骚刚

 

  1. import cv2
  2. import numpy as np
  3. # 定义一个输入的频谱(DCT-II变换的结果)
  4. spectrum = np.array([458.853181,-18.325492,-18.251911,-2.097520,-21.198660,-22.304648,21.103162,-5.786284,-15.248906,15.329286,16.919499,-19.669045,30.928253,-37.588034,-16.593954,-5.505211,3.014744,6.553616,31.131491,16.472500,6.802400,-78.278577,15.280099,3.893073,56.493581,-34.576344,30.146729,4.445671,6.732204], dtype=np.float32)
  5. # 对频谱进行逆变换
  6. signal = cv2.idct(spectrum).tolist()
  7. for num in signal:
  8. print(chr(round(num[0])),end='')# round对浮点数四舍五入,第二个参数可指定保留小数位数,默认不保留小数

____________

这场比赛蛮不错的,我感觉,难度其实硬要说,不是很大,可惜我只写了一题,下次加油! 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/木道寻08/article/detail/899501
推荐阅读
相关标签
  

闽ICP备14008679号