软件密码破解1 Write Up Jarvis OJ

尝试放进IDA,结果发现函数巨多,估计不应该是静态分析看出来的,于是拉到OD中去查看,首先第一步检查是否有特征字符串:


发现了这样一堆东西,然后双击字符串定位到这里,如下图所示,发现有四个CMP指令在和一堆常数比较,于是猜测这里是将一个比较重要的字符串与其比较,在它上面的代码应该就是计算这个重要的字符串的,于是下个断点:

之后进行动态调试,发现EXC指向的CTF_100_.004A77F8实际上是一段常数,右击00331C53处的指令,选择数据窗口中跟随,立即数,即可拿到这个数组。之后动态调试这个过程,发现是将得到的这个Byte数组与输入的每一个Byte做异或,然后再和下面一堆CMP指令涉及到的数相比较,所以我们可以直接将下面的数与这里的Byte数组异或,即可拿到flag,写一个C++程序:

#include <iostream>
#include <cstdio>
using namespace std;
int x[14] = {0x28, 0x57, 0x64, 0x6B, 0x93, 0x8F,0x65, 0x51, 0xE3, 0x53, 0xE4, 0x4E, 0x1A, 0xFF};
int y[14] = {0x1B, 0x1C, 0x17, 0x46, 0xF4, 0xFD,0x20, 0x30, 0xB7, 0x0C, 0x8E, 0x7E, 0x78, 0xDE};
int main() {
      for(inti = 0; i < 14; i++) {
            printf("%c",x[i]^y[i]);
      }
      printf("\n");
      return0;
}

猜你喜欢

转载自blog.csdn.net/wannafly1995/article/details/80960638