【问题标题】:NASM linking libraries during runtime运行时 NASM 链接库
【发布时间】:2014-09-08 19:28:08
【问题描述】:

我遇到的这篇关于 windows shellcoding 的帖子展示了如何为位于 kernel32.dll 中的 Sleep 函数制作一个简单的 shellcode。我理解代码,但似乎你不能在不知道库中函数的确切地址的情况下调用函数,你必须使用帖子作者提供的arwin32.exe

;sleep.asm
[SECTION .text]

global _start


_start:
        xor eax,eax
        mov ebx, 0x77e61bea ;address of Sleep
        mov ax, 5000        ;pause for 5000ms
        push eax
        call ebx        ;Sleep(ms);

Shellcoding for Linux and Windows

在 MASM32 中,仅包含库和 dll,但我不知道这是否与 NASM 中的情况相同,我尝试使用 RadAasm 包含 kernel32.lib 但出现错误。

对睡眠的未定义引用。

我的问题是:如何在不知道任何函数的确切地址的情况下调用 NASM 中的 Sleep 函数,无论是 GetProcAddress 等。

注意:即使是其他示例,他也提供了函数的绝对地址。

【问题讨论】:

  • 我对 windows 上的 nasm 不熟悉,但你试过 nasm -f bin source.asm 吗? (或 windows 的 win32)

标签: assembly nasm shellcode


【解决方案1】:

你可以使用extern关键字。

例如:

section .text

extern Sleep

global Start
Start:
  push ebp
  mov ebp, esp
  push 2000
  call Sleep
  mov esp, ebp
  pop ebp
  ret

您必须将编译后的目标文件与 kernel32.dll 链接。以下是使用 GoLink 的方法:

nasm -f win32 sleep.asm -o sleep.obj
GoLink /files /console sleep.obj kernel32.dll

您可以在这里找到 GoLink:www.godevtool.com/Golink.zip

如果您需要其他库中的函数而不使用 extern,您可能必须使用带有硬编码地址的 GetProcAddress。 kernel32.dll 会自动加载到每个进程的相同地址,因此 Sleep(和其他 kernel32 函数)应该具有恒定地址。因此,您必须使用一些工具来获取所需函数的地址,然后将其用作硬编码值(如示例中所示)。实际上我很久以前就尝试过,它确实有效,但我怀疑它取决于 Windows 版本。

【讨论】:

  • 不幸的是,我是 asm 的初学者,所以如果要求不高,请评论您的代码。 :) 我了解您使用 push 2000 参数调用 sleep 的部分,但上面的其他 2 个是新的。
  • 我没有 GoLink,我应该下载它吗?
  • 添加了指向 GoLink 的链接以进行回答。 push 上方和 call 下方的行只是基本的堆栈帧内容,在这种情况下并不真正需要(您可以在此处阅读有关堆栈帧和调用约定的更多信息:http://www.unixwiz.net/techtips/win32-callconv-asm.html
  • 感谢您的回答,它有效,但不能完全回答我的问题。它应该生成 shellcode,但创建的 obj 文件具有空字节,这与示例中的硬编码不同。
  • 我不确定我是否跟随。所以你想让一些硬编码的地址出现在生成的代码中而不使用硬编码的地址?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多