我想使用以下NASM代码生成shellcode:
global _start
extern exit
section .text
_start:
xor rcx, rcx
or rcx, 10
call exit
这里的问题是我不能使用它,因为exit
函数的地址不能被硬编码。那么,如何使用库函数而不必使用系统调用重新实现它们呢?
我能想到的一种方法是使用exit
在预处理程序中检索GetProcAddress
函数的地址,并将其替换为适当位置的shellcode。
但是,此方法不会生成可以按原样运行的shellcode。我确信必须有更好的方法来做到这一点。
答案 0 :(得分:0)
我不是编写shellcode的专家,但你可以尝试找到目标程序的导入地址表(IAT),并使用存储的函数指针来调用windows函数。 请注意,您将受限于目标程序使用的功能。 此外,由于重定位,您必须让shellcode计算IAT相对于进程基址的位置。当然,您可以依赖Windows不重定位,但这可能会在少数情况下导致错误。 另一个问题是您必须从外部找到目标进程的基址。 一个完全不同的尝试是使用系统调用,但它们真的很难使用,而不是在谈论使用它们的危险。
有关PE文件结构的信息: https://msdn.microsoft.com/en-us/library/ms809762.aspx