gpt4 book ai didi

python - 直接修改二进制可执行文件而不损坏它的可能性

转载 作者:行者123 更新时间:2023-11-30 20:31:12 25 4
gpt4 key购买 nike

首先,以防万一有人想知道,这个问题仅用于教育目的。

假设我得到了一个二进制可执行文件(由 C 代码编译而成)。该二进制可执行文件采用单个参数(密码),如果密码正确,它会写出一条 secret 消息。实践$./jeff-binary jeffspassword会产生Secret: Jeff's Secret Message

我希望知道这个 secret ,同时避免知道密码(jeffspassword)的必要性。我知道在创建这些二进制文件的 C 代码中,包含密码的路径是硬编码的。代码中有一部分内容为: fp = fopen("/etc/secret-password-dir/jeff/password", "r");显然,由于我不是 Jeff,因此我无权读取或写入 jeff .

由于我可以访问此二进制文件,因此我当前所做的是将二进制文件作为单个长十六进制字符串读取,然后在其中搜索十六进制字符串匹配(按照示例)/etc/secret-password-dir/jeff/password并将其替换为 /home/fred/Documents/blank_password ,然后创建一个具有此单一更改的新二进制文件。目的是文件指针最终会假设密码是我输入 blank_password 的任何内容。 (我知道),因此我可以使用非密码运行这个修改后的二进制文件,以便它打印出杰夫的 secret 。

具体来说,我当前正在运行的进程是这样​​的:

  1. 我有一个 C 程序,它读取 jeff-binary 的内容。并将其作为十六进制字符串写入 hex_of_jeff_binary.txt .

  2. 然后我有一个 Python 脚本,其内容为 hex_of_jeff_binary.txt通过替换 /etc/secret-password-dir/jeff/password 的十六进制表示来进行一些字符串理解与 /home/fred/Documents/blank_password ,然后将此修改后的二进制文件写入 jeff-binary-mod .

  3. chmod +x jeff-binary-mod使其可执行。

  4. 结果是:Segmentation fault (core dumped) 。嗯。

我的问题是:我尝试做的事情可能吗?如果是这样,我哪里出错了?

最佳答案

我试图重现OP想要实现的目标(据我所知)。

  1. 我用 C 语言编写了一个小的密码“安全”应用程序。

testSecret.c:

#include <string.h>
#include <stdio.h>

int main(int argc, char **argv)
{
const char *password = "MySecretPassword";
if (argc != 2) {
fprintf(stderr, "ERROR! Wrong number of command line arguments.\n");
return -1;
}
if (strcmp(argv[1], password) == 0) {
printf("Hello, proper receiver of secret message.\n");
} else {
fprintf(stderr, "Nice try but FAILED!\n");
}
return 0;
}

cygwin64 中编译和测试在 Windows 10 上:

$ gcc -std=c11 -o testSecret testSecret.c

$ ./testSecret
ERROR! Wrong number of command line arguments.

$ ./testSecret wrong
Nice try but FAILED!

$ ./testSecret MySecretPassword
Hello, proper receiver of secret message.

$
  • 我将二进制文件加载到 Notepad++带有十六进制编辑器插件。我寻找password的初始化文本。
  • snapshot of Notepad++ with found string constant

  • 常量字符串的第一个字节被0覆盖。(重要的是不要插入或删除任何字节。否则,后面的所有地址都会出错,二进制肯定会被破坏。)“修补”文件保存为testSecretCracked.exe
  • snapshot of Notepad++ after patching and saving the binary

  • 测试破解的二进制文件:
  • $ ./testSecretCracked.exe 
    ERROR! Wrong number of command line arguments.

    $ ./testSecretCracked.exe ""
    Hello, proper receiver of secret message.

    $

    破解后的新密码现在为""。因此, secret 简化为在 bash 上传递带有空字符串的参数的体验。

    <小时/>

    当然,这只是一个用于娱乐/教育目的的演示。失败的原因有很多(例如评论中提到的)。商业应用程序可能包含加密数据(在运行时解密)。一个简单的检查可能是对内部数据进行散列并将其与散列码进行比较,这将解密大部分修改。 (顺便说一句。我们的商业应用程序附带了硬件许可证检查,该检查将上述安全技术与其他技术相结合。)

    <小时/>

    只是为了好玩,我按照上面的描述自动化了简单的“破解”:

    testAutoCrack.c:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>

    int main(int argc, char **argv)
    {
    if (argc != 4) {
    fprintf(stderr, "ERROR! Wrong number of command line arguments.\n");
    return -1;
    }
    const char *inFile = argv[1];
    const char *outFile = argv[2];
    const char *password = argv[3];
    /* read binary */
    size_t size = 0x1000;
    char *buffer = malloc(size);
    if (!buffer) {
    fprintf(stderr, "ERROR! Out of memory.\n");
    return -1;
    }
    FILE *fIn = fopen(inFile, "rb");
    if (!fIn) {
    fprintf(stderr, "ERROR! Failed to open '%s'.\n", inFile);
    return -1;
    }
    size_t lenTotal = 0;
    for (;;) {
    size_t lenRead = size - lenTotal;
    size_t len = fread(buffer + lenTotal, 1, lenRead, fIn);
    lenTotal += len;
    if (len < lenRead) break; // EOF
    char *bufferNew = realloc(buffer, 2 * size);
    if (!bufferNew) {
    fprintf(stderr, "ERROR! Out of memory.\n");
    return -1;
    }
    buffer = bufferNew;
    size *= 2;
    }
    fclose(fIn);
    /* find password in binary */
    size_t lenPassword = strlen(password) + 1;
    if (lenTotal < lenPassword) {
    fprintf(stderr, "ERROR! Password longer than binary.\n");
    return -1;
    }
    size_t i = lenTotal - lenPassword;
    while (i-- && strncmp(buffer + i, password, lenPassword) != 0);
    if (i >= lenTotal) {
    fprintf(stderr, "Password '%s' not found!\n", password);
    return -1;
    }
    /* patch password */
    buffer[i] = '\0';
    /* write binary */
    FILE *fOut = fopen(outFile, "wb");
    if (!fOut) {
    fprintf(stderr, "ERROR! Failed to open '%s'.\n", outFile);
    return -1;
    }
    if (fwrite(buffer, 1, lenTotal, fOut) < lenTotal
    || fclose(fOut)) {
    fprintf(stderr, "ERROR! Failed to write '%s'.\n", outFile);
    return -1;
    }
    /* done */
    printf("'%s' successfully cracked.\n", inFile);
    return 0;
    }

    编译并测试:

    $ gcc -std=c11 -o testAutoCrack testAutoCrack.c 

    $ ./testAutoCrack testSecret.exe testSecretAutoCracked.exe MySecretPassword
    'testSecret.exe' successfully cracked.

    $ chmod a+x testSecretAutoCracked.exe

    $ ./testSecretAutoCracked.exe ""
    Hello, proper receiver of secret message.

    $

    关于python - 直接修改二进制可执行文件而不损坏它的可能性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52273855/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com