设计思路:
所输入的字符串(称呼其为A1)在mian函数中做一个异或处理成为字符串A2。
在这个程序中有一个全局字符串变量。这个全局字符串(称呼其为G1)在 在全局对象的析构函数中被 异或成为G2,
然后A1和G2进行比较。如果相等,则显示ok,如果不想等,则什么都不显示。
为了降低难度,在题目中给大家提示析构函数!
破解思路:
找到全局对象中的析构函数,里面就有最终的字符串比较。
这个wp我用出题思路来代替解题思路,本程序使用的是C++编写,所以使用OD分析比较累赘,程序汇编代码会特别的长,考验大家的C++反汇编能力。
难点:
很多人做不出来是因为这道题的真正算法部分和字符串比较都在析构函数中,大多数人都会有固定思维,认为功能都会写到main函数里,使用IDA不断的在main函数中寻找思路,但是这这道题故意把功能设定到main结束之后,只有耐心分析到程序结尾才能看到真的功能!
程序源码:
#include "pch.h"
#include <stdio.h>
#include <string.h>
#include <iostream>
//全局变量
char sTr[30];
char a[] = "dnceCzwglkzkclenwlvclC";
char*string = new char[30];
char*F1(char*sTr)
{
sTr[4] = 'A';
sTr[21] = 'A';//第5个和第22个字符都统一换成A
for (int i = 0; i < strlen(sTr); i++)
{
sTr[i] = sTr[i] ^ 44;//0x2C
}
return sTr;
}
//全局构造
class MyClass
{
public:
~MyClass();
private:
char *F2(char *sTr);
};
MyClass::~MyClass()
{
F2(a);
}
char * MyClass::F2(char * sTr2)
{
if (sTr2 != nullptr)
{
for (int i = 0; i < strlen(sTr2); i++)
{
sTr2[i] = sTr2[i] ^ 46;
}
if (!strcmp(sTr2, string))
{
char a = 'o';
char b = 'k';
char c[] = "恭喜您完成打卡,感谢支持学逆向论坛";
std::cout << a;
std::cout << b << std::endl;
std::cout << c;
system("pause");
}
}
return 0;
}
MyClass myclass;
int main()
{
std::cout << "欢迎来到学逆向论坛打卡" << std::endl;
std::cout << "Please Input:";
scanf_s("%s", &sTr, 30);
int nLen = strlen(sTr);
if (nLen > 30 || nLen < 10)
{
printf("输入错误;");
_exit(0);//不调用全局析构
}
else
{
strcpy_s(string, 30, sTr);
if (string[5] != 'x')
{
printf("输入错误;");
_exit(0);//不调用全局析构
}
F1(string);
}
return 0;
}
|