Reversing.kr Easy Keygen Write Up 及 日常记录2018-6-24

首先运行题目所给程序,如下图所示:


再看压缩包下的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,另外也要在有空的时候复习一下算法竞赛,感觉每天过地很充实,很喜欢这里,后面的日子要用心去珍惜在这里遇见的人!

猜你喜欢

转载自blog.csdn.net/wannafly1995/article/details/80793989
今日推荐