是Linux程序';s堆栈是否以非显式方式进行了修改?

是Linux程序';s堆栈是否以非显式方式进行了修改?,linux,nasm,elf,Linux,Nasm,Elf,我正在尝试在Linux上用NASM编写一个简单的ELF64病毒。它将自身附加到受害者身上(当然也会做所有与节和段相关的事情),并更改受害者的入口点,使其指向恶意代码 当被感染的程序启动时,首先要执行的是我的病毒,当它完成所有工作时,它会跳到原始入口点,受害者的代码也会被执行 当病毒感染简单的C++ Hello World时,一切都很好:正如我在Strues中看到的,病毒正确执行,然后受害者的代码执行。 但如果我附加: printf("%s\n", argv[0]); 对于受害者的代码,重新感染

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

当被感染的程序启动时,首先要执行的是我的病毒,当它完成所有工作时,它会跳到原始入口点,受害者的代码也会被执行

当病毒感染简单的C++ Hello World时,一切都很好:正如我在Strues中看到的,病毒正确执行,然后受害者的代码执行。 但如果我附加:

printf("%s\n", argv[0]);
对于受害者的代码,重新感染它并运行,病毒代码正确执行,“hello world”被打印出来,但随后抛出一个分段错误

我认为这意味着在病毒执行过程中堆栈会发生变化,因此会出现一些随机数,而不是原来的argv[0]

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

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

Linux上NASM中的ELF64病毒

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

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

登记册呢?请注意,在
x86_64上,argv
被传递到
$rsi
中的
main
,而不是堆栈上


您必须阅读并理解
x86\u 64

非常感谢!我的意思是x86_64,我非常确定argv在堆栈上。我会尝试备份rsi并恢复它,如果它解决了问题,我会告诉你。这似乎是不够的,但现在我知道我不能只关注堆栈。你知道关于所有ABI东西的任何新手可读的信息来源吗?@Hugo我已经用指向x86_64调用约定描述的指针更新了答案。还不清楚什么是“不够”。如果你保留了所有的寄存器和堆栈,那就足够了。我在实施修复时犯了一个愚蠢的错误,现在一切正常。非常感谢你!