Linux 程序的堆栈是否以某种非显式方式进行了修改?

Is Linux program's stack somehow modified in a non-explicit way?

我正在尝试在 Linux 上的 NASM 中编写一个简单的 ELF64 病毒。它将自己附加到受害者(当然会做所有与部分和段相关的事情)并更改受害者的入口点,使其指向恶意代码。

被感染程序启动时,第一个执行的是我的病毒,当它全部起作用时,它会跳转到原来的入口点并执行受害者的代码。

当病毒感染简单的 C++ hello world 时,一切正常:正如我在 strace 中看到的那样,病毒正确执行,然后执行受害者的代码。

但是如果我追加:

printf("%s\n", argv[0]);

对受害者代码,重新感染运行,病毒代码正常执行,打印"hello world",但随后抛出段错误。

我认为这意味着堆栈在病毒执行期间被更改,因此有一些随机数而不是原始 argv[0]。

不过我分析了我的整个病毒源,把所有的push、pop和rsp的直接修改都标记出来,仔细分析了一下,堆栈应该是一样的状态。但是,据我所知,事实并非如此。

是否有可能正在以某种非显式方式修改堆栈,例如通过系统调用?或者也许这是不可能的,我应该再花几个小时盯着源代码寻找错误?

ELF64 virus in NASM on Linux

大概在 x86_64 上(64 位 Linux 也可以是 aarch64,或 powerpc64,或 sparcv9,或 ...)。

it seems that the stack should be in the same state

寄存器呢?请注意,x86_64 argv$rsi 中传递给 main,而不是在堆栈上。

必须阅读并理解x86_64calling conventions