在x64上我通过在堆栈上保留一些空间并将所有参数(6)复制到堆栈来处理系统调用(我挂钩系统调用然后自己调用它们)。我保存了所有参数,以便稍后在代码中使用它们。
这就是我的代码(intel语法):
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个参数,这意味着我不能使用{{1}访问堆栈。或者我可以吗?
我怎样才能实现我在x64中所做的同样的事情?
答案 0 :(得分:1)
你可以这样做,只是(相当于你的代码)做类似的事情:
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,你将永远不会看到原始调用参数)。但不是手头的问题,所以......好吧。