学逆向论坛

找回密码
立即注册

只需一步,快速开始

发新帖

2万

积分

41

好友

1157

主题
发表于 2019-6-7 16:45:02 | 查看: 5246| 回复: 2

相关题目:

♦ 析构函数

设计思路:

所输入的字符串(称呼其为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;
}
温馨提示:
1.如果您喜欢这篇帖子,请给作者点赞评分,点赞会增加帖子的热度,评分会给作者加学币。(评分不会扣掉您的积分,系统每天都会重置您的评分额度)。
2.回复帖子不仅是对作者的认可,还可以获得学币奖励,请尊重他人的劳动成果,拒绝做伸手党!
3.发广告、灌水回复等违规行为一经发现直接禁言,如果本帖内容涉嫌违规,请点击论坛底部的举报反馈按钮,也可以在【投诉建议】板块发帖举报。
论坛交流群:672619046
发表于 2019-6-7 21:38:30
我看到了两个异或,然后猜了一下,把A改成大括号,成了= =
发表于 2019-6-7 21:44:58
Lily 发表于 2019-6-7 21:38
我看到了两个异或,然后猜了一下,把A改成大括号,成了= =

可以,做出来就是最棒的

小黑屋|手机版|站务邮箱|学逆向论坛 ( 粤ICP备2021023307号 )|网站地图

GMT+8, 2024-4-17 01:12 , Processed in 0.100741 second(s), 49 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表