gpt4 book ai didi

linux - 调试:我没有在反汇编的调用者中看到回调作为 callq 或内联 asm (Linux x86_64)

转载 作者:行者123 更新时间:2023-12-04 07:53:12 28 4
gpt4 key购买 nike

我正在 CentOS 7.9 上使用 crash 实用程序调试内核 oops (vmcore),我有一个函数 foo,它调用回调,但是当我反汇编 foo 时,我没有看到引用回调的 callq 指令,我也没有看到调用者中回调的程序集(表明它没有内联在那里)。
但是,内核堆栈显示 RIP 位于回调函数的偏移量 33 处。是什么赋予了?
foo 的最后一条指令显示:

callq  0xffffffff91c9af10 <__stack_chk_fail>
这是否可能意味着回调粉碎了堆栈并且 glibc 用这个 stack_chk thingamajig 替换了它?
// signature for foo
foo(some_t *some, size_t off, size_t size,
my_callback_t *func, void *private)

// callback gets called in foo like:
ret = func(args)
更新
我也看到一个 callq 到: __x86_indirect_thunk_rax 我不知道......也许这就是电话?仔细一看,跟回程蹦床有点关系,挺好玩的! XD

最佳答案

通常你应该看到 call *%rcx或其他东西(函数指针可能在不同的寄存器或堆栈内存中,但某种间接调用)。或者使用优化的尾调用,如 jmp *%rcx如果您的代码可以优化为 return func(args) .同样,可能在将函数指针移动到不同的寄存器之后,并在清理堆栈之后。
(第 4 个整数/指针函数 arg 到达 RCX,但最终使用时它可以在任何其他寄存器中)。call _stack_chk_fail只是 -fstack-protector=strong 的一部分机械。

内核代码使用 gcc -mindirect-branch=thunk 启用 GCC 的 幽灵缓解 对于间接调用,是的,间接调用将通过 __x86_indirect_thunk_rax . (或者另一个在任何其他寄存器中获取指针的指针。)
用户空间代码当然也可以使用此选项编译,尽管我认为大多数发行版默认情况下都不会启用它。

typedef int (*my_callback_t)(int);

int foo(int a, int b, int c, my_callback_t func)
{
int ret = func(a);
return ret;
}
像这样编译,使用 -O3 -Wall -mindirect-branch=thunk ( GCC10.2 on Godbolt ,还有 -mcmodel=kernel 也是很好的衡量标准)
# your function
foo:
jmp __x86_indirect_thunk_rcx # like jmp *%rcx tailcall

# extra code that will be present once in the whole kernel, deduplicated by the linker
.section .text.__x86_indirect_thunk_rcx,"axG",@progbits,__x86_indirect_thunk_rcx,comdat
__x86_indirect_thunk_rcx:
call .LIND1
.LIND0:
pause
lfence # block speculation along this never-executed return path that return prediction will jump to.
jmp .LIND0 # this seems unnecessary after lfence in this unreachable code.
.LIND1:
mov %rcx, (%rsp) # overwrite the return address with your func ptr
ret # and pop it into RIP
这是一个 retpoline .
-mindirect-branch=thunk ,你当然得到预期的 jmp *%rcx .

关于linux - 调试:我没有在反汇编的调用者中看到回调作为 callq 或内联 asm (Linux x86_64),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66845097/

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