Hello, CTF

分析

一道逆向题,运行一下发现需要我们输入一个序列号,然后程序判断对错

在这里插入图片描述

在这里插入图片描述

打开IDA分析可以得知,当v10和v13相等时,会返回success
接下来,要分析的就是v10是怎么来的,通过上面的代码可以知道v10是通过将输入的字符串以十六进制读取而成的
那么,我们将v13转换成10进制(两位一转),再通过Ascll码变成字符,就可以得到正确的结果,也就是我们需要输入的东西,结果如下

在这里插入图片描述

EXP

放一个转换的脚本(手算有些累人哦)

#include<iostream>
using namespace std;

char jisuan(char a)
{
    switch (a)
        {
            case '0': return 0; break;
            case '1': return 1; break;
            case '2': return 2; break;
            case '3': return 3; break;
            case '4': return 4; break;
            case '5': return 5; break;
            case '6': return 6; break;
            case '7': return 7; break;
            case '8': return 8; break;
            case '9': return 9; break;
            case 'a': return 10; break;
            case 'b': return 11; break;
            case 'c': return 12; break;
            case 'd': return 13; break;
            case 'e': return 14; break;
            case 'f': return 15; break;
        }
}

int main(int argc, char const *argv[])
{
    string arr = "437261636b4d654a757374466f7246756e";
    char a;
   
    for (int i = 0; i < arr.length(); i+=2)
    {
        a = jisuan(arr[i]) * 16 + jisuan(arr[i+1]);
        cout << a;
        
    }
    
    return 0;
}

脚本不见得写的多优秀,师傅们见谅

Q.E.D.


来都来了,点个广告再走吧(=・ω・=)