1

我试图通过更改它的 EIP 来破解另一个程序。有两个程序正在运行,一个是目标程序,它告诉作为“核心函数”的函数(例如,接收密码字符串作为参数并返回真或假的函数)在内存中的位置。然后现在我知道核心功能在哪里,我想用另一个程序修改 EIP,以便目标程序可以调用我的函数并简单地从中获取一个真实的内容并打印出一个漂亮的“访问权限”。

我的代码现在是这样的:

目标程序:

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


int checkPwd(char *pwd)
{
    printf("\nstill in the function\n");
    if(strcmp(pwd, "patrick") == 0) return true;
    else return false;
}


int main()
{
    char pwd[16];

    printf("%d", checkPwd);
    scanf("%s", &pwd);
    system("pause");
    if(checkPwd(pwd)) printf("Granted!\n");
    else printf("Not granted\n");
    system("pause");
}

攻击者程序:

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

int returnTrue()
{
    return true;
}
int main()
{
    int hex;
    scanf("%d", &hex);
    memcpy((void*)hex, (void*)returnTrue, sizeof(char)*8);
    system("pause");
}

我想补充一点,我试图将十六进制代码(没有 scanf 部分)直接放入攻击者程序中并且没有工作,它崩溃了。

所以我想我在这里遗漏了一些理论。我很高兴知道它是什么。

提前致谢。

4

2 回答 2

5

这是行不通的——进程占用不同的内存空间!

现代操作系统旨在保护用户程序免受此类攻击。一个进程无法访问另一个进程的内存——事实上,数据地址仅在该进程内部有效。

当程序运行时,它有自己的内存视图,只能“看到”内核已指示内存管理单元(MMU)为其映射的内存。

一些参考资料:

于 2012-07-13T03:07:21.553 回答
2

可以将一个函数注入另一个进程,但它比你想象的要复杂一些。第一件事是你需要适当的函数长度,你可以通过创建两个函数来做到这一点。

static int realFunction() { ... }
static void realFunctionEnd() {}

现在,当您复制函数时,您会执行以下操作:

realFunctionEnd - realFunction

这会给你尺寸。现在您不能只调用其他函数,因为如前所述,它们不能保证在其他进程中位于同一地址,但您可以假设,我将假设 windows,kernal32.dll 位于同一地址,因此您实际上可以创建远程线程时将其传递给 realFunction 。

现在,至于你的真正问题。您需要做的是注入一个 dll 或将一个函数复制到另一个进程中,然后挂钩您需要更改的函数。您可以通过复制另一个函数并使该代码可执行,然后通过跳转到注入的代码覆盖目标函数的前五个字节来做到这一点,或者您可以执行适当的 detour 类型挂钩。无论哪种情况,它都应该起作用。或者,您可以找到函数的偏移量并通过编写适当的操作码代替真实代码自行修补它,例如返回 true。

完成此操作需要某种注入或修补程序,您有基本的想法,但目前的想法比您想象的要多。我有 Windows 的工作代码,可以将一个函数复制到另一个进程中,但我相信这是一次很好的学习体验。

于 2012-07-13T03:24:12.913 回答