Hello, CTF

分析

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

在这里插入图片描述

在这里插入图片描述

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

在这里插入图片描述

EXP

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#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;
}

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