首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Linux上绕过一个函数?

如何在Linux上绕过一个函数?
EN

Stack Overflow用户
提问于 2020-04-27 04:02:22
回答 1查看 166关注 0票数 0

我做了一个32位的测试程序,我试图绕开这个函数(在内部):

代码语言:javascript
复制
void Function(int number)
{
    std::cout << "Your number is: " << number << std::endl;
}

使用我做的这个绕道函数(它在memcpy上抛出一个SIGSEV分段错误,即使内存是有效的,并通过执行/读/写保护):

代码语言:javascript
复制
bool Detour(byte_t* src, byte_t* dst, size_t size)
{
    if(size < HOOK_MIN_SIZE) return false;
    mprotect(src, size, PROT_EXEC | PROT_READ | PROT_WRITE);
    mem_t jmpAddr = ((mem_t)dst - (mem_t)src) - HOOK_MIN_SIZE;
    byte_t CodeCave[] = { JMP, 0x0, 0x0, 0x0, 0x0 };
    *(mem_t*)((mem_t)CodeCave + sizeof(JMP)) = jmpAddr;
    memcpy(src, CodeCave, sizeof(CodeCave));
    return true;
}

它是这样命名的:

代码语言:javascript
复制
Detour((byte_t*)&Function, (byte_t*)&hkFunction, HOOK_SIZE);

为了适应汇编跳跃(0xE9 0x00 0x00 0x00),HOOK_MIN_SIZE等于5,而HOOK_SIZE等于7,因为它必须适合所有被覆盖的指令(对于弹床,但在这种情况下无关紧要):

代码语言:javascript
复制
Dump of assembler code for function Function(int):
   0x5655631d <+0>:    push   ebp
   0x5655631e <+1>:    mov    ebp,esp
   0x56556320 <+3>:    push   ebx
   0x56556321 <+4>:    sub    esp,0x4
   0x56556324 <+7>:    call   0x56556220 <__x86.get_pc_thunk.bx>

GDB错误:

代码语言:javascript
复制
Program received signal SIGSEGV, Segmentation fault.
0x565564c9 in Detour (
    src=0x5655631d <Function(int)> "U\211\345S\203\354\004\350\367\376\377\377\201\303\367+",
    dst=0x56556372 <hkFunction(int)> "U\211\345S\203\354\004\350\242\376\377\377\201â+", size=7) at main.cpp:51
51        memcpy(src, CodeCave, sizeof(CodeCave));

Typedefs:

代码语言:javascript
复制
typedef unsigned int mem_t;
typedef unsigned char byte_t;

这个绕道功能有什么问题?我已经在Windows上成功地制作了32位和64位版本,但在Linux上似乎有所不同。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-27 06:27:09

我成功了!问题是这个地址不是系统页面的倍数,我可以使用这个函数来修复它:

代码语言:javascript
复制
int ProtectMemory(mem_t address, size_t size, int protection)
{
    long pagesize = sysconf(_SC_PAGE_SIZE);
    address = address - (address % pagesize);
    return mprotect((void*)address, size, protection);
}

Detour函数现在看起来如下所示:

代码语言:javascript
复制
bool Detour(byte_t* src, byte_t* dst, size_t size)
{
    if(size < HOOK_MIN_SIZE) return false;
    //mprotect(src, size, PROT_EXEC | PROT_READ | PROT_WRITE);
    int out = ProtectMemory((mem_t)src, size, PROT_EXEC | PROT_READ | PROT_WRITE);
    //std::cout << out << std::endl;
    mem_t jmpAddr = ((mem_t)dst - (mem_t)src) - HOOK_MIN_SIZE;
    byte_t CodeCave[] = { JMP, 0x0, 0x0, 0x0, 0x0 };
    *(mem_t*)((mem_t)CodeCave + sizeof(JMP)) = jmpAddr;
    memcpy(src, CodeCave, sizeof(CodeCave));
    return true;
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61447288

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档