gpt4 book ai didi

C:执行手动映射的文本段,无需编写太多程序集

转载 作者:行者123 更新时间:2023-11-30 18:51:18 26 4
gpt4 key购买 nike

问题:

我想在内存中映射一个新的(单页)文本段并从 C 程序执行它,而无需编写大量汇编代码。为此,我复制了程序本身的 C 函数,并设置了一个标志,以便当我跳转到该函数时,将调用该函数中的不同路径。您可能认为这很愚蠢,但这与我们在 fork() 进程时所做的事情是一样的。

为什么

我在 Android 上实现了最小的捕获和重放机制,link 。目前我正在使用一种不太优雅的方式来重放真实的 Android 应用程序,这需要禁用 ASLR,除了安全漏洞(目前可以简单地忽略)之外,它还会给我们带来一些其他问题。因此,我想从纯 C 进程进行转换并重放 Android 函数。如果我采用以下方法来工作,那么当前的方法会更好,该方法会干预第一个被调用且属于主线程的 Android 函数,并且.. bla bla ..!

方法:

在 C 程序中,我映射一个文本段,它基本上是程序本身的 C 函数的副本。为此,我调用一个名为 entrypoint 的函数一次,获取程序计数器、设置标志并返回。然后,我在内存中映射一个页面(入口点函数的代码大小不应大于此值),比如说在 0xabc000 处,然后我在其中复制一个从我的 PC 开始的页面。我得到了。这意味着页面 abc 应该包含从 pc 到至少入口点函数末尾的文本/代码的副本(基本上是从 pc 开始的页面)我将页面 abc 的权限设置为可执行,然后跳转到该页面。

我遇到了分段冲突。但我想知道,为什么?

示例代码:

bool entered_ = false;
void *pc_ = 0x0;

void entrypoint() {
if(!entered_){
entered = 1;
pc_ = GET_PROGRAM_COUNTER();
return;
}

// ..
// SPECIAL CODE
// ..

}

int main(..) {

entrypoint();
// map a new rdwr private page (4096)
newtextseg = mmap(..args..);

// copy 1 page of text from this application's text segment,
// starting from the point where I got the pc
memcpy(newtextseg, pc, PAGE_SIZE);

// give exec permissions to newtextseg
mprotect(..args);

// Jump to the code, and expect the
// SPECIAL CODE to run
JUMP(newtextseg);

}

额外信息

C 库与我的应用程序静态链接。我在带有arm架构的Android设备上运行它。不幸的是,操作系统没有提供任何有关分段的信息,因为它是与 libc 静态链接的纯 C 进程。那里没有任何与 Android 相关的内容。甚至llog也没有。

假设

汇编操作正确(获取并跳转到 PC)。此外,还会检查 mmap 和 mprotect 调用结果,并通过打印 proc/self/maps 文件进行验证。

随机想法:

由于我与 libc 静态链接,并且我正在对 entrypoint 执行一些 printf 来进行调试,因此可能会出现以下情况:指向函数与原始代码段的开头(我从中复制的入口点)有一些固定的偏移量,因此当我尝试从不同的偏移量执行时,事情会中断?

最佳答案

您可以使用函数指针来完成此操作。

(我坦白承认这可能违反了 C Standard ... 的许多部分)

首先,typedef 是一个函数指针类型,因为如果使用 typedef,处理函数指针会容易得多:

typedef ( *randomAddressFunc_t )( void );

// define a function pointer
randomAddressFunc_t JUMP;

// assign an address to the function pointer:
JUMP = ( randomAddressFunc_t ) newtextseg;

// call it
JUMP();

应该尝试执行 newtextseg 指向的任何二进制位。

关于C:执行手动映射的文本段,无需编写太多程序集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37322282/

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