首先运行题目所给程序,如下图所示:
再看压缩包下的ReadMe.txt文件,可知要求Serial为5B134977135E7D13时的Input Name,直接把程序拖进IDA,之后F5获取伪代码,如下图所示:
很显然可以看出,输入v9计算serial然后和输入的serial比较,也就是和v13比较,如果结果正确,即为correct,注意31-36行代码,v3用于做遍历Input Name的下标,v6,v7和v8为连续地址,且即为&(v6),&(v6+1)与&(v6+2),分别为16,32,48。双击aS02x可知,这里实际为%s%02x,29行的aS也是,注意到一件事,如果有如下代码:
char v = 0;
sprintf(&v, “%s”, &v);
这种代码不论执行多少次都不会对结果有影响,v始终为空。因此只要考虑后边的%02x即可,可以看出这里实际是将输入的Input Name的每一个字符分别依次和v6、v7与v8进行xor,即可得到最终结果,如果a xor b=c,那么c xor b=a,附上C++程序:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
char s[] ="5B134977135E7D13";
int b[3] = {16, 32, 48};
int char2num(char a) {
if(a>= 'A' && a <= 'Z') {
returna - 'A' + 10;
}
if(a>= '0' && a <= '9') {
returna - '0';
}
}
int main() {
intindex = 0;
for(inti = 0; i < strlen(s); i+= 2) {
if(index>= 3) {
index= 0;
}
intnum1 = char2num(s[i]);
intnum2 = char2num(s[i + 1]);
intnum = num1 * 16 + num2;
printf("%c",num^b[index++]);
}
}
最近来实验室了,感受到了实验室浓厚的CTF氛围,所以一直在刷题,估计毕设的事就此为止了,哈哈。之后继续Jarvis OJ与Reversing.kr的刷题,同时也要学学Python,另外也要在有空的时候复习一下算法竞赛,感觉每天过地很充实,很喜欢这里,后面的日子要用心去珍惜在这里遇见的人!