强网——re

Ezre

打开Ida翻到这个函数

这里面有两个盒子,查出来是sm4解密即可

Ezre 强网先锋

起调试长度为32

调试断点取每个的表的值

第一次base64encode :

1+USN4J5Rfj0TaVOcnzXiPGZIBpoAExuQtHyKD692hwmqe7/Mgk8v1sdCW3bYFLr

第二次base64decode:

FGseVD3ibtHWR1czhLnUfJK6SEZ2OyPAIpQoqgY0w49u+7rad5CxljMXvNTBkm/8

第三次base64encode:

Hc0xwuZmy3DpQnSgj2LhUtrlVvNYks+BX/MOoETaKqR4eb9WF8ICGzf6id1P75JA

第四次 base64decode:

pnHQwlAveo4DhGg1jE3SsIqJ2mrzxCiNb+Mf0YVd5L8c97/WkOTtuKFZyRBUPX6a

第五次 base64encode:

p1xXOZtaiUneJIhk7qSYEjD1Km94o0FTu52VQgNL3vCBH8zsA/b+dycGPRMwWfr6

这里还有一次加密

需要逆向,v7的值,不知道为什么我的main函数无法去平坦化,只有内部函数可以

data = [0x3A, 0x2C, 0x4B, 0x51, 0x68, 0x46, 0x59, 0x63, 0x24, 0x04,0x5E, 0x5F, 0x00, 0x0C, 0x2B, 0x03, 0x29, 0x5C, 0x74, 0x70,0x6A, 0x62, 0x7F, 0x3D, 0x2C, 0x4E, 0x6F, 0x13, 0x06, 0x0D,0x06, 0x0C, 0x4D, 0x56, 0x0F, 0x28, 0x4D, 0x51, 0x76, 0x70,0x2B, 0x05, 0x51, 0x68, 0x48, 0x55, 0x24, 0x19]

key = list("plxXOZtaiUneJIhk7qSYEjD1Km94o0FTu52VQgNL3vCBH8zsA/b+dycGPRMwWfr6")
flag=[]
for i in range(len(key)):
    flag.append(ord(key[i]) ^ 0x27)

v7 = 2023
v6 = 0
v8 = 48
xor = []
while v6 < v8 - 1:
    if v6 % 3 == 1:
        v7 = (v7 + 5) % 20
        v3 = flag[6+v7 + 1]
    elif v6 % 3 == 2:
        v7 = (v7 + 7) % 19
        v3 = flag[6+v7 + 2]
    else:
        v7 = (v7 + 3) % 17
        v3 = flag[6+v7 + 3]
    v6 += 1
    xor.append(v3)
for i in range(len(data)-1-1, -1, -1):
    data[i] ^= data[i-1]
    data[i] ^= xor[i]
print(''.join([chr(x)for x in data]))

解flag

babyre

魔改的xtea

修改好脚本

好像无法调试,使用attach  跟进发现密文和秘钥被改了

正确的密文:[0x9523F2E0, 0x8ED8C293, 0x8668C393, 0xDDF250BC, 0x510E4499, 0x8C60BD44, 0x34DCABF2, 0xC10FD260]

正确的Key=[0x62, 0x6F, 0x6D, 0x62]

循环变成了33次

就剩下sum不知道了,方法把encrypt改成正向加密,输出正确的sum,得到解密脚本

#include <stdio.h>
#include <stdint.h>

//加密函数
void encrypt(unsigned int num_rounds, uint32_t v[2], uint32_t const key[4]) {
    unsigned int i;
    uint32_t v0 = v[0], v1 = v[1], sum = 0x90508D47, delta =0x77BF7F99;
    for (int y=0;y<4;y++){
    for (i = 0; i < num_rounds; i++) {
        v0 += (((v1 >> 4) ^ (v1 << 5)) + v1) ^ (sum + key[sum & 3]);
        v1 += (((v0 >> 4) ^ (v0 << 5)) + v0) ^ (sum + key[(sum >> 11) & 3]);
        sum -= delta;

    }
    }
    v[0] = v0; v[1] = v1;
    printf("%x",sum);
}

//解密函数
void decrypt(unsigned int num_rounds, uint32_t v[2], uint32_t const key[4]) {
    unsigned int i;
    uint32_t v0 = v[0], v1 = v[1], sum = 0xd192c263, delta =0x77bf7f99 ;
    for(int j=0;j<4;j++){
    for (i = 0; i < num_rounds; i++) {
        sum += delta;
        v1 -= (((v0  >>4) ^ (v0 << 5)) + v0) ^ (sum + key[(sum >> 11) & 3]);
        
        v0 -= (((v1 >> 4) ^ (v1 << 5)) + v1) ^ (sum + key[sum & 3])^sum;
        

    }
    v[0] = v0; v[1] = v1;
}
}
int main()
{
    // v为要加解密的数据,两个32位无符号整数
    uint32_t v[] = {   0x34DCABF2, 0xC10FD260};
    // k为加解密密钥,4个32位无符号整数,密钥长度为128位, 0x8D62CA9B, 0xD2FC5DB0, 0x421C5589, 0x9B76A850, 0x2FC6B2EA, 0xDE11CF7C
    uint32_t k[4] = {0x62, 0x6F, 0x6D, 0x62 };
    int n = sizeof(v) / sizeof(uint32_t);
    // num_rounds,建议取值为32
    unsigned int r = 33;

    decrypt(r,v, k);
    printf("0x%x 0x%x\n", v[0], v[1]);
    for (int i = 0; i < 2; i++)
    {
        for (int j = 0; j < sizeof(uint32_t) / sizeof(uint8_t); j++)
        {
            printf("%c", (v[i] >> (j * 8)) & 0xFF);
        }
    }
    printf("\n");
    return 0;
}
/*W31com3_2_Th3_QwbS7_4nd_H4v3_Fun*/

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值