gpt4 book ai didi

linux - 通过 ASM (x86) 处理系统调用(需要 ebp)

转载 作者:太空宇宙 更新时间:2023-11-04 11:16:19 25 4
gpt4 key购买 nike

在 x64 上,我通过在堆栈上保留一些空间并将所有参数 (6) 复制到堆栈来处理系统调用(我挂接系统调用,然后自己调用它们)。我保存了所有参数,以便稍后在代码中使用它们。

这是我的代码的样子(英特尔语法):

push rbp;
mov rbp, rsp;
sub rsp, 64;

mov [rbp - 8], rax;
mov [rbp - 16], rdi;
mov [rbp - 24], rsi;
mov [rbp - 32], rdx;
mov [rbp - 40], rcx;
mov [rbp - 48], r8;
mov [rbp - 56], r9;
...
...
...

请注意,我正在使用 rbp 访问堆栈。

现在我正在尝试为 x86 编写相同的代码。我认为它几乎是一样的,但后来我意识到(根据 https://stackoverflow.com/a/2538212/940158 )ebp 用于系统调用的第 6 个参数,这意味着我不能使用 ebp 访问堆栈。或者我可以吗?

我怎样才能实现我在 x64 中所做的同样的事情?

最佳答案

你可以这样做,只是(相当于你的代码)做类似的事情:

push ebp
mov ebp, esp
sub esp, 64

mov [ebp - 4], eax
mov [ebp - 8], ebx
mov [ebp - 12], ecx
mov [ebp - 16], edx
mov [ebp - 20], esi
mov [ebp - 24], edi
mov eax, [ebp] ; restore original ebp into eax
mov [ebp - 28], eax ; and store into “ebp” location

我想知道的是为什么你在这里引用 Linux/amd64 和 Linux/i386 系统调用 ABI,但似乎在做内核组件......(如果你正在破解你自己的操作系统,有更好的调用约定用于系统调用;如果你正在破解 Linux,你将永远看不到原始调用参数)。但不是手头的问题,所以……好吧。

关于linux - 通过 ASM (x86) 处理系统调用(需要 ebp),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20799522/

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