ISCC-MOBILE

133 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第22天,点击查看活动详情

MOBILE

Amy's Code

在这里插入图片描述 输入的字符串从第五位到""这一部分传入到Jlast,在Jlast里面进行md5+base64,在这里插入图片描述 从这里可以看出,""到倒数第二位全部进行AES加密再进行base64加密, key为加密之后的"K@e2022%%y", iv是"I&V2022*", 进行逆向运算

#include<iostream>
using namespace std;

int main() {
    int i = 0;
    bool z = false;
    char a[] = "=IkMBb+=gF2/Try5PCUruw1j";
    char b[100];
    for (int i2 = 5; i2 >= 0; i2--) {
        if (!z) {
            for (int i3 = 3; i3 >= 0; i3--) {
                b[(i3 * 6) + i2] = a[i];
                i++;
            }
            z = true;
        }
        else {
            for (int i4 = 0; i4 <= 3; i4++) {
                b[(i4 * 6) + i2] = a[i];
                i++;
            }
            z = false;
        }
    }
    for (int num = 0; num < 24; num++) {
        cout << b[num];
    }
    cout << endl;
    system("pause");
    return 0;
}

然后将得到的内容进行MD5,base64解密。 得到的内容进行aes解密 在这里插入图片描述 就能得到flag。

MobileB

在这里插入图片描述 在这里插入图片描述 通过分析so文件 构造·payload

a = input("加密的数据:")[:-1]
print("输入so的数据:")
b = input("one:")
b+=b
c = input("two:")
c+=c
d = input("three:")
d+=d
e = input("four:")
e+=e
f = input("five:")
f+=f
g = input("six:")
g+=g
h = input("seven:")
h+=h
i = input("eight:")
i+=i
j = input("nine:")
j+=j
k = input("ten:")
k+=k
l = input("eleven:")
l+=l
m = input("twelve:")
m+=m
n = [5,1,51,2,52,12,512,3,53,13,513,23,523,123,5123,4,54,14,514,24,524,124,5124,34,534,134,5134
,234,5234,1234,51234]
a=list(map(int,a.split("0")))
o="ABCDEFGHIJKLMNOPQRSTUVWXYZ"
p = []
for r in a:
    p.append(o[n.index(r)])
q = [d,m,g,i,h,c,e,l,b,f,j,k]
print("ISCC{",end='')
for r in range(12):
    print(q[r][q[r].index(p[r],26)-9],end='')
print('}')

MobileC

输入错误会有"输入错误,继续加油"的提示。 逻辑分析: 将输入进行 CBC 模式的 AES 加密,key通过Myjni.GetKey 获得,iv 是 aUBTJjg4Q2NDLg== 然后Base64后调用了 GetStr 后和指定的字符串比较,GetKey和GetStr都是mobilec库里的native函数 在这里插入图片描述

GetKey和GetStr都是mobilec库里的native函数 GetKey的值可以通过 objection hook直接获得: QERAPG9dPyZfTC5f 在这里插入图片描述

在这里插入图片描述

在libmobilec.so中找到Java_com_example_mobilec_MyJNI_Myjni_GetStr 调用了GetStrc

GetStrc里将第一个输入用"="补齐,然后分成了6组, 然后根据第二个输入选择6组中的几组作为结果返回,逆推回去,所以结果肯定6个组都包含,所以只需排列组合一下,用aes解密后筛选出有意义的答案即可。

from Crypto.Cipher import AES
import base64
def decrypt(password):
key = b'QERAPG9dPyZfTC5f'
iv = b"aUBTJjg4Q2NDLg=="
aes = AES.new(key,AES.MODE_CBC,iv)
result = aes.decrypt(base64.b64decode(password.encode()))
return result
from itertools import product
t =['c3KJ+XJQ','zJbrlKs=','NzQp2BU=','iLfdeK4=','J0xVWTT=','N3k3Kzy=']
for c in product(range(1,6),repeat=5):
if len(set(c)) != len(c):
continue
d = [0] + list(c)
s=''
for i in range(8):
for idx in d:
s+=t[idx][i]
print(decrypt(s[:-4]))