[2019红帽杯] Reverse复现

1.EasyRe

wp

根据在字符串追踪引用至该函数中。该函数可以得到一个一个提示,已经一个无用的网站。提示信息大意为前4个字节为flag,后面有用。
在这里插入图片描述
其实到这步的时候很容易卡在,我动调半天没发现什么,最好看其他师傅WP基本思路都是从.data段的定义的变量入手,追踪到关键处。
其实这个思路并不明显,我自己思考了一下似乎也没有什么好的想法,也只有追踪可以全局变量这一个了,当然如果你足够有毅力也可以注意查看每一个函数。

最终关键函数在.fini_array段,关于本题涉及的ELF相关的知识将在其后总结 。
在这里插入图片描述
在这里插入图片描述
根据之前的提示,获得以后data数据获得key,在用key进行循环解密即可。
在这里插入图片描述

flag{Act1ve_Defen5e_Test}

总结

ELF文件结构博文
初始化节与终止节

2.XX

WP

所有程序流程都在main中,第一时间快速浏览后发现有xxtea加密算法,以字节移位,循环异或,等等。至于xxtea前面一堆循环,经过我使用IDA的调试功能确定,应该是一些check之类的,并未改变输入数据,因此不用理会。
在这里插入图片描述
在这里插入图片描述

#include <stdint.h>
#include <iostream>

using namespace std;
const int DELTA = 0x9e3779b9;

void XXTeaDecrypt(int n, uint32_t* v, uint32_t const key[4])
{
    uint32_t y, z, sum;
    unsigned p, rounds, e;
    rounds = 6 + 52 / n;
    sum = rounds * DELTA;
    y = v[0];
    do {
        e = (sum >> 2) & 3;
        for (p = n - 1; p > 0; p--)
        {
            z = v[p - 1];
            y = v[p] -= (((z >> 5 ^ y << 2) + (y >> 3 ^ z << 4)) ^ ((sum ^ y) + (key[(p & 3) ^ e] ^ z)));
        }
        z = v[n - 1];
        y = v[0] -= (((z >> 5 ^ y << 2) + (y >> 3 ^ z << 4)) ^ ((sum ^ y) + (key[(p & 3) ^ e] ^ z)));
        sum -= DELTA;
    } while (--rounds);
}

int main(int argc, char const *argv[])
{
    uint8_t endata[] = { 
        0xCE, 0xBC, 0x40, 0x6B, 0x7C, 0x3A, 0x95, 0xC0, 0xEF, 0x9B,
        0x20, 0x20, 0x91, 0xF7, 0x02, 0x35, 0x23, 0x18, 0x02, 0xC8,
        0xE7, 0x56, 0x56, 0xFA
    };
    uint8_t data[24] = {0};
    uint8_t box[] = {2,0,3,1,6,4,7,5,10,8,11,9,14,12,15,13,18,16,19,17,22,20,23,21};
    uint32_t key[] = {0x67616C66,0,0,0};

    for (int i = 23; i >= 0; --i)
        for (int j = 0; j < i / 3; ++j)
            endata[i] ^= endata[j];

    for (size_t i = 0; i < 24; i++)
    {
        data[box[i]] = endata[i];
    }

    XXTeaDecrypt(6,(uint32_t*)data, key);
    
    cout << data << endl; # flag{CXX_and_++tea}
    return 0;
}

在这里插入图片描述

3.childRe

主要
重要的逻辑就四步,输入构建一颗二叉树,用后序遍历排列输入,调用UnDecorateSymbolName进行逆粉碎命名,最好比对。
主要就是逆向出树以及搞懂C++命名粉碎规则和UnDecorateSymbolName函数。
在这里插入图片描述
flag{86ea625b7f3322cfbd8b1b2981a20e23}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值