【问题标题】:hardcoded address in disassembly反汇编中的硬编码地址
【发布时间】:2015-03-28 13:55:42
【问题描述】:

我正在用 C++ 编写优化的基于 Windows 的 shellcode,但在将 C++ 中的硬编码地址传递给函数时,我遇到了问题。

例如:

My_CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)&thread_callback, NULL, NULL, NULL);

DWORD WINAPI thread_callback(LPVOID lpParam)
{
    // stuff..
}

在反汇编中,它显示 CreateThread(..., cardcoded_address, ..); 相反,我想将这个地址传递给“从这个位置到 thread_callback”

有什么办法可以避免吗? (因为shellcode应该是地址无关的?)

问候。

【问题讨论】:

  • 如果您使用的是 gcc 系列编译器,请使用 -fPIC
  • 我正在使用 Visual Studio 2012。编辑:为什么我应该投反对票?

标签: c++ assembly shellcode


【解决方案1】:

无论如何,我正在搜索/做一些事情,我能做的最后一件事是你可以用 delta offset 解决这个问题。

说明:在代码的第一个函数中,应该有这样的函数:

DWORD delta;

__asm {
    call GetBasePointer
    GetBasePointer:
    pop eax
    sub eax, GetBasePointer
    mov [delta], eax
}

您也可以在谷歌上搜索增量偏移量以获取更多详细信息。 之后,您可以执行以下操作:

My_CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)((DWORD)thread_callback + (DWORD)delta), NULL, NULL, NULL);

DWORD WINAPI thread_callback(LPVOID lpParam)
{
    // stuff..
}

它会正常工作,

问候。

【讨论】:

  • 但是delta是内存中的一个位置,具有绝对地址,所以你有同样的问题
  • 嗯,我不知道你指的是哪个绝对地址,但是每当我在随机位置测试时,线程执行得很好,没有异常。
  • 指令mov [delta],eax 生成到绝对地址的移动。
  • @mcleod_ideafix:它不应该......它应该从 ESP 索引。
  • 为什么?是局部变量吗?哦,好吧,那么它是从EBP索引的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-09
  • 2014-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多