首页
社区
课程
招聘
[原创]2021虎符Re-GoEncrypt
发表于: 2021-4-9 02:42 6900

[原创]2021虎符Re-GoEncrypt

2021-4-9 02:42
6900

题目文件下载地址:

链接:https://pan.baidu.com/s/1CcaW8R02wB6puHSCsY89nQ
提取码:0syj

找到mainmain开始分析
图片描述
对main_check的分析,其实就在这个函数里,一个字符串地址给的提示
图片描述

然后回到main函数分析这个主要的加密
图片描述
点进去之后发现是改了delta的一个xtea加密
图片描述
然后分析一下过程,看一下哪些变量对应哪些变量

这里给个链接,这篇文章中有TEA,XTEA,XXTEA三种加解密的分析

https://bbs.pediy.com/thread-266933.htm

然后现在我们还需要key和加密后的数据才能解密,分析了加密过程我们知道这个key就是v21,我们随便输入flag{12345678-1234-1234-1234-12345678abcd}满足前面条件的假flag

然后进行动调
图片描述
直接在那条命令的下一条指令下断点F9然后查看V21的值即可得到key,如下图

图片描述
得到key为{0x10203, 0x4050607, 0x8090A0B, 0x0C0D0E0F};

继续动调,到比较函数的地方下个断点再次F9,然后F7进入比较函数

图片描述

慢慢单步,发现cmd rdi, rsi的时候我们可以得到我们想要的加密之后的值(我是连续动调了两次发现这个值没变得出的这个是加密后的数据这个结论的)
图片描述
得到加密后的值:0EC311F045C79AF3EDF5D910542702CB

上脚本:

图片描述

 
 
 
 
 
 
 
 
 
 
 
 
#include <stdio.h>
#include <stdint.h>
/* take 64 bits of data in v[0] and v[1] and 128 bits of key[0] - key[3] */
void encipher(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=0, delta=0x12345678;
    for (i=0; i < num_rounds; i++) {
        v0 += (((v1 << 4) ^ (v1 >> 5)) + v1) ^ (sum + key[sum & 3]);
        sum += delta;
        v1 += (((v0 << 4) ^ (v0 >> 5)) + v0) ^ (sum + key[(sum>>11) & 3]);
    }
    v[0]=v0; v[1]=v1;
}
 
void decipher(unsigned int num_rounds, uint32_t v[2], uint32_t const key[4]) {
    unsigned int i;
    uint32_t v0=v[0], v1=v[1], delta=0x12345678, sum=delta*num_rounds;
    for (i=0; i < num_rounds; i++) {
        v1 -= (((v0 << 4) ^ (v0 >> 5)) + v0) ^ (sum + key[(sum>>11) & 3]);
        sum -= delta;
        v0 -= (((v1 << 4) ^ (v1 >> 5)) + v1) ^ (sum + key[sum & 3]);
    }
    v[0]=v0; v[1]=v1;
}
 
int main()
{
    uint32_t v_part1[2]={0x0EC311F0, 0x45C79AF3}; //动调得到的加密后的值,内存中就是小端储存我们不用再手动改变0EC311F0 45C79AF3 EDF5D910 542702CB
    uint32_t v_part2[2]={0xEDF5D910, 0x542702CB};
    uint32_t const k[4]={0x10203, 0x4050607, 0x8090A0B, 0x0C0D0E0F}; //动调得到的key
    unsigned int r=32;//num_rounds建议取值为32// v为要加密的数据是两个32位无符号整数// k为加密解密密钥,为432位无符号整数,即密钥长度为128位printf("加密前原始数据:%u %u\n",v[0],v[1]);
    //encipher(r, v, k);
    //printf("加密后的数据:%u %u\n",v[0],v[1]);
    decipher(r, v_part1, k);
    decipher(r, v_part2, k);
    printf("解密后的数据:%x %x %x %x\n",v_part1[0],v_part1[1], v_part2[0], v_part2[1]);
    return 0;
}
//最后按照开始分析的flag的格式排列一下得到flag{3bbcf9ea-2918-4fee-8a2e-201b47dfcb4e}
#include <stdio.h>
#include <stdint.h>
/* take 64 bits of data in v[0] and v[1] and 128 bits of key[0] - key[3] */
void encipher(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=0, delta=0x12345678;

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

最后于 2021-4-22 17:42 被kanxue编辑 ,原因: 上传附件
上传的附件:
收藏
免费 1
支持
分享
最新回复 (1)
雪    币: 503
活跃值: (2204)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
2
牛了 牛了 
2021-4-23 08:34
0
游客
登录 | 注册 方可回帖
返回
//