Shellcode 在涉及代码注入的许多攻击中被广泛使用。编写 Shellcode 是一项具有挑战性的任务。虽然我们可以从互联网上找到现成的 Shellcode,但在有些情况下我们还是需要编写满足特定要求的 Shellcode。此外,从头开始编写自己的 Shellcode 能学到一些有趣的技术。本实验旨在帮助学生理解这些技术,从而能够编写自己的 Shellcode。
编写 Shellcode 有几个挑战,一个是确保二进制代码中没有零,另一个是找到命令中使用的数据的地址。第一个挑战并不难解决,有几种方法。针对第二个挑战的解决方案导致了两种典型的方法来编写 Shellcode。在第一种方法中,数据在执行期间被推入栈中,因此可以从栈指针获取它们的地址。在第二种方法中,数据存储在代码区域,就在 call 指令之后。当执行 call 指令时,数据的地址被当作返回地址并推入栈中。这两种解决方案都非常有意思,我们希望学生能学习这两种技术。