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

时间:2016-05-07 17:28:23

标签: linux nasm elf

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

当启动受感染的程序时,第一个要执行的程序是我的病毒,它什么时候起作用,它会跳转到原始入口点并且受害者的代码正在被执行

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

但如果我追加:

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

对受害者的代码,重新感染并运行,病毒'代码正确执行," hello world"打印,但然后抛出分段错误错误。

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

然而,我已经分析了我的病毒的全部来源,标记了所有推送,弹出和rsp的直接修改,仔细分析它们,似乎堆栈应该处于相同的状态。但是,正如我所见,它不是。

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

1 个答案:

答案 0 :(得分:3)

  

Linux上的NASM中的ELF64病毒

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

  

似乎堆栈应该处于相同的状态

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

必须阅读并理解x86_64 calling conventions