我正在尝试在Linux上的NASM中编写一个简单的ELF64病毒。它会将自己附加到受害者身上(当然还包括所有部分和分段相关的内容)并更改受害者的入口点,以便它指向恶意代码。
当启动受感染的程序时,第一个要执行的程序是我的病毒,它什么时候起作用,它会跳转到原始入口点并且受害者的代码正在被执行
当病毒感染简单的C ++ hello world时,一切正常:正如我在strace中看到的那样,病毒正常执行,然后受害者的代码就会执行。
但如果我追加:
printf("%s\n", argv[0]);
对受害者的代码,重新感染并运行,病毒'代码正确执行," hello world"打印,但然后抛出分段错误错误。
我认为这意味着在病毒期间堆栈正在被更改。执行以便有一些随机数而不是原始的argv [0]。
然而,我已经分析了我的病毒的全部来源,标记了所有推送,弹出和rsp的直接修改,仔细分析它们,似乎堆栈应该处于相同的状态。但是,正如我所见,它不是。
是否可能通过某种非显式方式修改堆栈,例如系统调用?或者也许这是不可能的,我应该花几个小时盯着源找到一个bug?
答案 0 :(得分:3)
Linux上的NASM中的ELF64病毒
可能在x86_64
上(64位Linux也可能是aarch64
,或powerpc64
,或sparcv9
,或......)。
似乎堆栈应该处于相同的状态
寄存器怎么样?请注意,x86_64
argv
传递给main
中的$rsi
,而不是堆栈。
您必须阅读并理解x86_64
calling conventions。