首页 > 其他分享 >2019红帽杯ctf-reverse-xx

2019红帽杯ctf-reverse-xx

时间:2022-11-26 23:24:04浏览次数:51  
标签:v30 origin v19 int ctf unsigned xx 红帽 xxtea

一道xxtea加密的题

主要过程分五步

1、读入数据

2、构造key数组

3、xxtea加密

4、打乱数据

5、二次加密

先查壳,64位无壳

直接拖入ida分析

 

 读入数据并计算长度

判断输入的字符串数据是否都在Code中

一开始没有看出来这里是干什么的,直接去分析后面了,后来看了其他师傅的wp才知道,这里是构造xxtea加密的key数组

 这里就是xxtea加密的部分

 在这里打乱了加密后数组的顺序

 在这里又对数组进行了二次加密

 进行最后的校验

以上就是整体流程,所有的过程都是可逆的,只是比较麻烦,直接给出解密脚本 

#include <stdio.h>
#include <string.h>
#include <stdint.h>
#define xxtea_DELTA 0x9e3779b9
#define xxtea_MX (((xxtea_z>>5^xxtea_y<<2) + (xxtea_y>>3^xxtea_z<<4)) ^ ((xxtea_sum^xxtea_y) + (xxtea_key[(xxtea_p&3)^xxtea_e] ^ xxtea_z)))
void xxtea(uint32_t* xxtea_origin, int xxtea_n, uint32_t const xxtea_key[4])
{
    uint32_t xxtea_y, xxtea_z, xxtea_sum;
    unsigned xxtea_p, xxtea_rounds, xxtea_e;
    if (xxtea_n > 1)            /* Coding Part */
    {
        xxtea_rounds = 6 + 52 / xxtea_n;
        xxtea_sum = 0;
        xxtea_z = xxtea_origin[xxtea_n - 1];
        do
        {
            xxtea_sum += xxtea_DELTA;
            xxtea_e = (xxtea_sum >> 2) & 3;
            for (xxtea_p = 0; xxtea_p < xxtea_n - 1; xxtea_p++)
            {
                xxtea_y = xxtea_origin[xxtea_p + 1];
                xxtea_z = xxtea_origin[xxtea_p] += xxtea_MX;
            }
            xxtea_y = xxtea_origin[0];
            xxtea_z = xxtea_origin[xxtea_n - 1] += xxtea_MX;
        } while (--xxtea_rounds);
    }
    else if (xxtea_n < -1)      /* Decoding Part */
    {
        xxtea_n = -xxtea_n;
        xxtea_rounds = 6 + 52 / xxtea_n;
        xxtea_sum = xxtea_rounds * xxtea_DELTA;
        xxtea_y = xxtea_origin[0];
        do
        {
            xxtea_e = (xxtea_sum >> 2) & 3;
            for (xxtea_p = xxtea_n - 1; xxtea_p > 0; xxtea_p--)
            {
                xxtea_z = xxtea_origin[xxtea_p - 1];
                xxtea_y = xxtea_origin[xxtea_p] -= xxtea_MX;
            }
            xxtea_z = xxtea_origin[xxtea_n - 1];
            xxtea_y = xxtea_origin[0] -= xxtea_MX;
            xxtea_sum -= xxtea_DELTA;
        } while (--xxtea_rounds);
    }
}

  
int main()
{
    unsigned char v30[] = {0xce,0xbc,0x40,0x6b,0x7c,0x3a,0x95,0xc0,0xef,0x9b,0x20,0x20,0x91,0xf7,0x2,0x35,0x23,0x18,0x2,0xc8,0xe7,0x56,0x56,0xfa};

    __int64 v23; // rcx
    char v24; // al
    unsigned char *v22; // r8
    int v21 = 1;
    int v18 = 24;
    //第二处加密 
    v22 = v30 + 24;
    v21 = v18;
    for (;v21 > 1;--v22)
    {
        v23 = 0;
        if (v21 / 3 > 0)
        {
            v24 = *v22;
            do
            {
                v24 ^= v30[v23++];
                *v22 = v24;
            }
            while ( v23 < v21 / 3 );
        }
        --v21;
    }
    //恢复打乱的顺序 
    unsigned char *v19;
    v19 = v30;
    *v19   = v30[1]; 
    v19[2] = *v30; 
    v19[3] = v30[2]; 
    v19[1] = v30[3]; 
    v19[6] = v30[4]; 
    v19[4] = v30[5]; 
    v19[7] = v30[6]; 
    v19[5] = v30[7]; 
    v19[10] =v30[8];  
    v19[8] = v30[9]; 
    v19[11] =v30[10];
    v19[9] =v30[11];
    v19[14] =v30[12];
    v19[12] =v30[13];
    v19[15] =v30[14];
    v19[13] =v30[15];
    v19[18] =v30[16];
    v19[16] =v30[17];
    v19[19] =v30[18];
    v19[17] =v30[19];
    v19[22] =v30[20];
    v19[20] =v30[21];
    v19[23] =v30[22];
    v19[21] =v30[23];
/*    for(int i = 0;i < 6;i++)
    {
        printf("0x");
        for(int j = 3;j >= 0;j--)
        {
            printf("%x",v19[i*4+j]);
        }
        printf(",");
    } 
*/    
    unsigned int v11[6] = {0x40cea5bc,0xe7b2b2f4,0x129d12a9,0x5bc810ae,0x1d06d73d,0xdcf870dc};
    uint32_t const key1[4] = { (unsigned int)0x67616c66,(unsigned int)0x0,(unsigned int)0x0,(unsigned int)0x0 };
    
    int n = -6;
    xxtea(v11, n, key1);
    //67616c665858437b646e615f742b2b5f7d616513
/*    for (int i = 0; i < 6; i++)
    {
        printf("%x", v11[i]);
    }
*/    
    int flag[] = {0x67,0x61,0x6c,0x66,0x58,0x58,0x43,0x7b,0x64,0x6e,0x61,0x5f,0x74,0x2b,0x2b,0x5f,0x7d,0x61,0x65};
    for(int i = 0;i < 19;i++)
    {
        printf("%c",flag[i]);
    } 
}

 

标签:v30,origin,v19,int,ctf,unsigned,xx,红帽,xxtea
From: https://www.cnblogs.com/polang19/p/16928619.html

相关文章

  • Vulnhub之KiraCTF靶机解题过程
    KiraCTF作者:jason_huawen靶机基本信息名称:Kira:CTF地址:https://www.vulnhub.com/entry/kira-ctf,594/识别目标主机IP地址──(kali㉿kali)-[~/Vulnhub/KiraCTF]......
  • 启动项目报错:null, message from server: “Host ‘XXX‘ is not allow(数据库只能loca
    step1:之前一直都是连的测试环境由docker镜像生成的mysql,公司老是断电导致mysql数据崩坏,于是在本地整了个8.0.18版本的mysql,启动项目报错:null,messagefromserver:"Host......
  • pwn | bjdctf_2020_babyrop
    pwn|bjdctf_2020_babyropx64ret2libc常规题注意调用约定即可exp:frompwnimport*fromLibcSearcher.LibcSearcherimport*importstructcontext.log_level......
  • pwn | bjdctf_2020_babystack2
    pwn|bjdctf_2020_babystack2ret2text一个整数判断,比较的时候是int,传进read当参数的时候是unsignedint,输入负数就能绕过。然后跳转到后门函数就行了。怪没意思的,直......
  • ctf hub 技能树 密码口令
    弱口令这一关可以通过暴力破解的方式跑出来。具体方式就是burp抓包后发送到狙击手模块。。然后设置变量,暴破但是我的top1000字典没有跑出来。。。没办法又用字典......
  • ctf hub 技能树 XSS(水一篇博客)
    这一道题可以直接在第一个输入框插入代码。但是没有任何反应,这告诉我们需要利用第二个输入框。然后我们发现第二框会成功有一个successfully,但是我们不知道发送到哪里去......
  • ctfshow菜狗杯-无一幸免_FIXED(数组整型溢出绕过赋值式“永真”判断)
    if(isset($_GET['0'])){$arr[$_GET['0']]=1;if($arr[]=1){die("nonono!");}else{die($flag);}}重点在$arr[]=1意思是在数......
  • 《CTFshow - Web入门》03. Web 21~30
    目录web21知识点题解web22知识点题解web23知识点题解web24知识点题解web25知识点题解web26知识点题解web27知识点题解web28知识点题解web29知识点题解web30知识点题解web......
  • xctf-polyre
    一道ollvm的题,主要是去平坦化先查壳,64位elf,无壳直接拖入ida,定位到main函数 发现是ollvm平坦化,我们用在linux中使用deflat进行平坦化去除之后用ida打开找到关键......
  • DFP 数据转发协议应用实例 7.使用 DLS1x 与 VSxxx 设备的 LoRA 匹配
    DFP数据转发协议应用实例7.使用DLS1x与VSxxx设备的LoRA匹配 DFP是什么?稳控科技编写的一套数据转发规则,取自“自由转发协议FFP(FreeForwardProtocol)”,或者......