【逆向 - 从入门到放弃01】- 前言与破解程序练习7个

admin 2024年6月14日10:43:38评论6 views字数 5294阅读17分38秒阅读模式

【逆向 - 从入门到放弃01】- 前言与破解程序练习7个



以下是不同类型的C语言程序,每个程序都包含破解后的确认机制。请注意,这些程序仅用于学习和研究目的,请勿用于非法用途。通过反汇编这些程序,可以练习如何识别和破解不同类型的验证逻辑。

为方便练习可使用生成便于反汇编的C语言程序的配置,但工作项目不推荐以下设置:

Visual Studio配置:

  1. 创建新的C++项目

  • 打开Visual Studio,选择“创建新项目”。

  • 选择“控制台应用程序”模板,点击“下一步”。

  • 输入项目名称和位置,点击“创建”。

  • 配置项目属性

    • 右键点击项目名称,选择“属性”。

    • 在“配置属性”下,选择“C/C++” > “优化”,将“优化”设置为“禁用(/Od)”。

    • 在“配置属性”下,选择“C/C++” > “代码生成”,将“运行时库”设置为“多线程调试(/MTd)”。

    • 在“配置属性”下,选择“链接器” > “调试”,将“生成调试信息”设置为“否”。

    • 在“配置属性”下,选择“链接器” > “高级”,将“映像基址”设置为“默认”。

    • 在“配置属性”下,选择“链接器” > “系统”,将“子系统”设置为“控制台(/SUBSYSTEM:CONSOLE)”。

    • 关闭所有安全编译选项: 在项目属性中,找到 "C/C++" -> "代码生成",将其设置为“禁用安全检查(/GS-)”。

  • 生成可执行文件

    • 确保配置完成后,点击“生成”菜单,选择“生成解决方案”来生成可执行文件。

    • 【逆向 - 从入门到放弃01】- 前言与破解程序练习7个

    Linux配置要求:

    1. 安装必要的工具

    • 确保你已经安装了GCC(GNU Compiler Collection)和GDB(GNU Debugger)。

    • 在终端中运行以下命令来安装:

    bash
    sudo apt-get update
    sudo apt-get install build-essential gdb

  • 编译选项

    • 使用g选项生成调试信息。

    • 使用O0选项禁用优化。

    • 示例编译命令:

    bash
    gcc -g -O0 -o my_program my_program.c

    几款常用的反汇编工具:

    1. IDA Pro (Interactive Disassembler Professional):

    • 功能强大: 业界领先的反汇编和调试工具,支持多种处理器架构和文件格式,拥有强大的分析功能,包括函数识别、代码交叉引用、数据流分析等。

    • 插件丰富: 拥有庞大的插件生态系统,可以扩展其功能,例如支持新的处理器架构、文件格式、分析算法等。

    • 收费软件: 价格昂贵,但功能强大,适合专业逆向工程师使用。

    2. Ghidra:

    • 免费开源: 由美国国家安全局 (NSA) 开发并开源,功能强大且完全免费。

    • 支持多种架构: 支持多种处理器架构和文件格式,并提供类似 IDA Pro 的分析功能。

    • 活跃的社区: 拥有活跃的社区支持,不断有新的功能和插件被开发出来。

    3. Binary Ninja:

    • 易用性强: 界面友好,操作直观,易于上手。

    • 分析能力出色: 提供高质量的反汇编代码、控制流图、数据流分析等功能。

    • 插件支持: 支持 Python 插件,可以扩展其功能。

    • 收费软件: 价格相对 IDA Pro 便宜,适合个人开发者和安全研究人员使用。

    4. Radare2:

    • 命令行工具: 功能强大的命令行工具集,适合熟悉命令行操作的用户。

    • 高度可定制: 可以通过配置文件和插件进行高度定制,满足各种需求。

    • 开源免费: 完全开源免费,适合预算有限的用户。

    5. hopper:

    • macOS 平台: 专为 macOS 平台设计的反汇编工具,界面美观,操作便捷。

    • 功能全面: 支持多种处理器架构和文件格式,提供反汇编、调试、分析等功能。

    • 收费软件: 价格适中,适合 macOS 平台的开发者和安全研究人员使用。

    学习反汇编的资源推荐

    书籍

    • 《Reverse Engineering for Beginners》 by Dennis Yurichev: 这本免费的在线书籍是学习反汇编的绝佳入门资源。它涵盖了广泛的主题,从基础知识到高级技术,并包含许多示例和练习。(https://beginners.re/)

    • 《Practical Reverse Engineering》 by Bruce Dang, Alexandre Gazet, Elias Bachaalany: 这本书深入探讨了反向工程的艺术,涵盖了反汇编、调试和代码分析技术。

    • 《The IDA Pro Book》 by Chris Eagle: 这本书是使用 IDA Pro(一种流行的反汇编程序)的全面指南,涵盖了从基本用法到高级脚本的所有内容。

    • 《Reversing: Secrets of Reverse Engineering》 by Eldad Eilam: 这本书涵盖了广泛的反向工程主题,包括反汇编、调试和代码分析。

    网站

    • Lena's Tutorials: Lena's Tutorials 提供了一系列关于各种逆向工程主题的优秀教程,包括反汇编、调试和漏洞利用开发。(https://www.youtube.com/channel/UCdqh8ZdG_2Fle-m2Vgmthnw)

    • OpenSecurityTraining2: OpenSecurityTraining2 提供了关于各种安全主题的免费高质量培训课程,包括逆向工程和漏洞利用开发。(https://www.opensecuritytraining.info/)

    在线反汇编网站

    • Godbolt Compiler Explorer: Godbolt Compiler Explorer 是一个在线工具,允许您查看 C/C++ 代码的汇编输出。它支持各种编译器和架构,是学习汇编语言和理解编译器如何生成代码的绝佳资源。(https://godbolt.org/)

    • Online Disassembler: Online Disassembler 是一个免费的在线工具,允许您反汇编各种文件格式,包括 Windows 可执行文件、Linux ELF 文件和 Java 类文件。(https://onlinedisassembler.com/)

    建议

    • 从基础开始: 在深入研究反汇编之前,务必掌握汇编语言的基础知识。

    • 练习,练习,再练习: 反汇编是一项需要大量实践才能掌握的技能。尝试反汇编不同的程序,并了解它们的代码是如何工作的。

    • 虚心完成 ,合法模拟过程,总结经验,寻找关键跳和关键词

    💡以下程序在vs2022社区版中经过测试,Linux中没有测试,如有问题请及时私信,不胜感激!

    主要模拟破解思路和过程,请忽略明文问题。 💩

    1. 简单的密码验证程序

    题目:要求用户输入密码,如果密码正确则显示“密码正确,访问授予”,否则显示“密码错误,访问拒绝”。

    #include <stdio.h>
    #include <string.h>
    #include <iostream>
    int main() {
    char password[30];
    printf("Enter password: ");
    scanf_s("%s", password,sizeof(password));

    if (strcmp(password, "hackerchi.top-secret123") == 0) {
    printf("Password correct, access granted.\n");
    }
    else {
    printf("Password incorrect, access denied.\n");
    }
    std::cin.get(); // 暂停程序执行
    return 0;
    }

    2. 基于时间的验证码

    题目:要求用户输入当前时间的验证码(格式HHMM),如果正确则显示“验证码正确,访问授予”,否则显示“验证码错误,访问拒绝”。

    示例:

    • 上午 10:30 用 "HHMM" 格式表示为 "1030"

    • 下午 2:05 用 "HHMM" 格式表示为 "1405"

    • 晚上 8:45 用 "HHMM" 格式表示为 "2045"

    #include <stdio.h>
    #include <string.h>
    #include <ctime>
    #include <iostream>
    int main() {
    time_t t;
    struct tm tm_info; // 不再是指针
    char buffer[7]; // 增加缓冲区大小

    time(&t);
    localtime_s(&tm_info, &t); // 使用 localtime_s
    strftime(buffer, sizeof(buffer), "%H%M", &tm_info); // 使用 sizeof 获取缓冲区大小
    printf("Enter current time code (format HHMM): ");

    char input[7]; // 增加缓冲区大小
    scanf_s("%s", input, sizeof(input));
    if (strcmp(buffer, input) == 0) {
    printf("Code correct, access granted.n");
    }
    else {
    printf("Code incorrect, access denied.n");
    }
    std::cin.get(); // 暂停程序执行
    return 0;
    }

    3. 用户名和密码验证

    题目:要求用户输入用户名和密码,如果用户名和密码正确则显示“登录成功,访问授予”,否则显示“用户名或密码错误,访问拒绝”。

    #include <stdio.h>
    #include <string.h>
    #include <iostream>
    int main() {
    char username[30];
    char password[30];

    printf("Enter username: ");
    scanf_s("%s", username, sizeof(username));
    printf("Enter password: ");
    scanf_s("%s", password, sizeof(password));

    if (strcmp(username, "admin") == 0 && strcmp(password, "hackerchi.top_admin123") == 0) {
    printf("Login successful, access granted.\n");
    }
    else {
    printf("Username or password incorrect, access denied.\n");
    }
    std::cin.get(); // 暂停程序执行
    return 0;
    }

    4. 简单的数学题验证

    题目:要求用户计算3 + 4的结果,如果答案正确则显示“答案正确,访问授予”,否则显示“答案错误,访问拒绝”。

    #include <stdio.h>
    #include <iostream>
    int main() {
    int answer;
    printf("Calculate 3 + 4: ");
    scanf_s("%d", answer,sizeof(answer));

    if (answer == 7) {
    printf("Answer correct, access granted.\n");
    }
    else {
    printf("Answer incorrect, access denied.\n");
    }
    std::cin.get(); // 暂停程序执行
    return 0;
    }

    5. 基于文件内容的验证

    题目:要求用户输入一个文件名,读取文件内容并验证,如果文件内容正确则显示“文件内容正确,访问授予”,否则显示“文件内容错误,访问拒绝”。

    #include <stdio.h>
    #include <string.h>
    #include <iostream>
    int main() {
    FILE* file;
    errno_t err; // 用于检查 fopen_s 返回值
    char content[100];

    err = fopen_s(&file, "key.txt", "r");
    if (err != 0) {
    printf("Unable to open file.n");
    return 1;
    }

    fgets(content, 100, file);
    fclose(file);

    if (strcmp(content, "valid_keyn") == 0) {
    printf("File content correct, access granted.n");
    }
    else {
    printf("File content incorrect, access denied.n");
    }
    std::cin.get(); // 暂停程序执行
    return 0;

    }

    6. 简单加密验证

    题目:要求用户输入加密后的密码,如果密码正确则显示“密码正确,访问授予”,否则显示“密码错误,访问拒绝”。

    #include <stdio.h>
    #include <string.h>
    void encrypt(char *str) {
    while (*str) {
    *str = *str + 1;
    str++;
    }
    }
    int main() {
    char input[20];
    printf("Enter encrypted password: ");
    scanf_s("%s", input, sizeof(input));
    encrypt(input);

    if (strcmp(input, "hackerchi-tfdsfu124") == 0) {
    printf("Password correct, access granted.\n");
    } else {
    printf("Password incorrect, access denied.\n");
    }
    return 0;
    }

    原文始发于微信公众号(黑客驰):【逆向 - 从入门到放弃01】- 前言与破解程序练习7个

    • 左青龙
    • 微信扫一扫
    • weinxin
    • 右白虎
    • 微信扫一扫
    • weinxin
    admin
    • 本文由 发表于 2024年6月14日10:43:38
    • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                     【逆向 - 从入门到放弃01】- 前言与破解程序练习7个https://cn-sec.com/archives/2847824.html

    发表评论

    匿名网友 填写信息