一个apk文件
下载下运行不出来
题目有提示
这是截取的信息
第一次写,我就按照大佬的wp思路来
首先我们确定
Host: yuanshen.com
这个信息
jeb打开,搜索
成功锁定到有价值的信息
protected String doInBackground(String[] params) {
String contentText = params[0];
try {
ByteBuffer byteBuffer0 = ByteBuffer.wrap(NoteActivity.this.loadData("Sex.jpg"));
Class class0 = (Build.VERSION.SDK_INT < 26 ? null : new InMemoryDexClassLoader(byteBuffer0, NoteActivity.this.getClassLoader())).loadClass("site.qifen.note.ui.Encrypto");
Method method0 = class0.getMethod("encrypt", String.class);
NoteActivity.this.contentText_back = contentText;
String cipher = (String)method0.invoke(class0.getDeclaredConstructor().newInstance(), NoteActivity.this.sendInit(contentText));
Log.d("JNITest", "Server Response: " + sendRequest.sendPost("http://yuanshen.com/", "data=" + cipher));
return cipher;
}
catch(Exception e) {
e.printStackTrace();
return null;
}
}
首先用一个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函数
package site.qifen.note.p000ui;
import android.util.Base64;
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
/* renamed from: site.qifen.note.ui.Encrypto */
/* loaded from: C:\Users\15598\Desktop\download.dex */
public class Encrypto {
private static final String KEY = "DSACTF";
private static final String TAG = "Encrypto";
private static byte[] customHash(String input) {
byte[] keyBytes = new byte[16];
int[] temp = new int[16];
for (int i = 0; i < input.length(); i++) {
int charVal = input.charAt(i);
for (int j = 0; j < 16; j++) {
temp[j] = ((temp[j] * 31) + charVal) % 251;
}
}
for (int i2 = 0; i2 < 16; i2++) {
keyBytes[i2] = (byte) (temp[i2] % 256);
}
return keyBytes;
}
public static String encrypt(String data) throws Exception {
byte[] keyBytes = customHash(KEY);
SecretKeySpec secretKeySpec = new SecretKeySpec(keyBytes, "AES");
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
cipher.init(1, secretKeySpec);
byte[] encryptedBytes = cipher.doFinal(data.getBytes("UTF-8"));
return Base64.encodeToString(encryptedBytes, 2);
}
}
分析可知
对密钥进行了操作
我们直接复制粘贴
import java.security.Key;
public class Main {
private static final String key = "DASCTF";
private static byte[] customHash(String input) {
byte[] keyBytes = new byte[16];
int[] temp = new int[16];
for (int i = 0; i < input.length(); i++) {
int charVal = input.charAt(i);
for (int j = 0; j < 16; j++) {
temp[j] = ((temp[j] * 31) + charVal) % 251;
}
}
for (int i2 = 0; i2 < 16; i2++) {
keyBytes[i2] = (byte) (temp[i2] % 256);
}
return keyBytes;
}
public static void main(String[] args) {
byte[] hashResult1 = customHash("DSACTF");
// 打印第一个哈希结果
System.out.print("Hash result 1: ");
for (byte b : hashResult1) {
System.out.printf("%02X", b);
}
System.out.println(); // 换行
}
}
这里有个草鸡大坑
输入的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出现什么的
叫啥余弦变换,我听都没听过,我勒个骚刚
import cv2
import numpy as np
# 定义一个输入的频谱(DCT-II变换的结果)
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)
# 对频谱进行逆变换
signal = cv2.idct(spectrum).tolist()
for num in signal:
print(chr(round(num[0])),end='')# round对浮点数四舍五入,第二个参数可指定保留小数位数,默认不保留小数
____________
这场比赛蛮不错的,我感觉,难度其实硬要说,不是很大,可惜我只写了一题,下次加油!