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; }
|
脚本不见得写的多优秀,师傅们见谅