我正在尝试在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
调用约定 。