Linux程序的堆栈以某种非显式方式修改?

我正在尝试在Linux上的NASM上编写一个简单的ELF64病毒。 它将自身附加到受害者身上(当然也包括所有这些部分和细分相关的东西),并改变受害者的入口点,以便指向恶意代码。

当被感染的程序启动时,第一个被执行的是我的病毒,什么时候工作,它跳转到原来的入口点,受害者的代码正在执行。

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

但是,如果我追加:

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

到受害者的代码,重新感染它并运行,病毒的代码正确执行,“打印你好世界”,但是然后引发一个分段错误错误。

我认为这意味着在病毒执行过程中堆栈正在被更改,以便有一些随机数而不是原始的argv [0]。

但是,我分析了我的病毒的全部来源,标记了rsp的所有推送,popup和直接修改,仔细分析它们,看起来堆栈应该处于相同的状态。 但是,正如我所看到的,事实并非如此。

是否有可能通过例如系统调用以某种非显式方式修改堆栈? 或者,也许这是不可能的,我应该花更多的时间盯着源find一个错误?

Linux上NASM的ELF64病毒

想必在x86_64 (64位Linux也可以是aarch64 ,或powerpc64 ,或sparcv9 ,或…)。

看来堆栈应该处于相同的状态

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

必须阅读并理解x86_64 调用约定 。