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_64
calling conventions。
我正在尝试在 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_64
calling conventions。