[2019红帽杯]childRE

太久没有写re题了,今天来re看了看

首先简单的看一看代码整体结构

 

很容易就可以知道,这里是个按表与下标来验证的,一个取余一个除数,不就是除数*商+余数等于原数,所以我们要求的就是原数

 

 写出一下脚本

#include<iostream>
#include<string>
using namespace std;
int main()
{
    string s1 = "(_@4620!08!6_0*0442!@186%%0@3=66!!974*3234=&0^3&1@=&0908!6_0*&";
    string s2 = "55565653255552225565565555243466334653663544426565555525555222";
    string s3 = "1234567890-=!@#$%^&*()_+qwertyuiop[]QWERTYUIOP{}asdfghjkl;'ASDFGHJKL:\"ZXCVBNM<>?zxcvbnm,./";
    string s4 = "";
    for (int j = 0; j < 62; j++)
    {
        int idx1 = -1, idx2 = -1;
        for (int i = 0; i < s3.size(); i++)
        {
            if (s3[i] == s2[j])
            {
                idx1 = i;
            }
            if (s3[i] == s1[j])
            {
                idx2 = i;
            }
        }
        s4 = s4+(char)(idx1*23 + idx2);
    }
    cout << s4;

}

 

 接下来看了看UnDecorateSymbolName函数,百度了一下,让函数容易识别,也就是C++在编译函数的时候,会把一下关键字用些特殊的符号代替,这里我就直接去嫖了下别人师傅的wp

 得到的原函数是:?My_Aut0_PWN@R0Pxx@@AAEPADPAE@Z

接着网上看,v14是我们输入的,进入了v4,然后经过了一些奇怪的加密,不过这个name其实就是我们上面求出来的函数名

 

 在我点进去这个函数的时候,发现是个递归函数,然后一个一个的赋值,所以可以知道只是简单的换位而已

 

 并且通过动调,可以进一步得到验证

 

 

 

 接下来输入A-Z再然后0-4输入进去,查看其交换的顺序即可

这里接着用下43v3rY0unG师傅的博客,差点忘了,上面那个递归函数是个二叉树,没有仔细逆(用不惯ida的调试(没想到我的ida终于可以调试了,以前一调试直接卡死),周末有时间,拿x64dbg调试一下试试)

 

#include <stdio.h>
#include <string.h>
int main()
{
    char name[32] = "?My_Aut0_PWN@R0Pxx@@AAEPADPAE@Z";
    int biao[] = { 0x50, 0x51, 0x48, 0x52, 0x53, 0x49, 0x44, 0x54, 0x55, 0x4a, 0x56, 0x57, 0x4b, 0x45, 0x42, 0x58, 0x59, 0x4c, 0x5a, 0x5b, 0x4d, 0x46, 0x5c, 0x5d, 0x4e, 0x5e, 0x5f, 0x4f, 0x47, 0x43, 65 };
    char input[32] = { 0 };
    int i;
    for (i = 0; i < strlen(name); i++)
        input[biao[i] - 65] = name[i];
    puts(input);
    return 0;
}

在md5加密得到

可惜这种题目现在都是签到题了,都不会出了,毕竟数据结构起步才是个签到题,不过最近补了写3环和0环知识,感觉又可以接着往下刷了

posted @ 2021-01-09 02:01  PYozo_free  阅读(456)  评论(0编辑  收藏  举报