【问题标题】:HEX Substraction in Windows ASM Shellcode returns wrong valuesWindows ASM Shellcode 中的十六进制减法返回错误值
【发布时间】:2017-01-04 14:21:51
【问题描述】:

我正在编写一些 shellcoding,并在我的 Windows 虚拟机上得到了这个奇怪的结果。这个想法是,从零开始,创造一些价值。在这种情况下,我需要该值等于:0x50505353

(gdb) print /x 0 - 0x38383536 - 0x77777777
$1 = 0x50505353

在 Python、GDB、OSX、Linux 和其他一切中,此操作按预期工作。在 Windows VM 上,当我在 OllyDBG 或 Immunity 上执行 PUSH 时,结果是:0x52535051

所以问题是,为什么?我在这里缺少什么?

这是在 ASM 中完成的操作:

AND EAX,65656565
AND EAX,1A1A1A1A
SUB EAX,38383536
SUB EAX,77777777
PUSH EAX

第一对AND变换EAX = 0x00000000。然后我可以从中减去。需要说明的是,我不能在这个测试中使用 XOR。

【问题讨论】:

  • “ASM 中的减法” 在汇编代码中你在哪里做减法?我在您的问题中没有看到任何地方。
  • 这看起来不像是有效的 x86 程序集。你用的是哪个汇编程序?看着你的问题,我仍然看不到任何与汇编语言编程相关的东西。它似乎完全是关于 GDB 中的算术运算。
  • 抱歉,Michael,我刚刚更新了问题以添加有关 ASM 部分的更多详细信息。是普通的 x86 程序集。
  • 为什么两个AND 操作和两个SUB 操作而不是一个?从问题中并不清楚。或者为什么你不能只使用MOV。无论如何,你为什么要在汇编代码中减去36353838 而不是38383536
  • 是一个 shellcode,由于字符限制,我不能使用 MOV 或 XOR。修复了 ASM 代码的副本。

标签: windows assembly gdb hex shellcode


【解决方案1】:

这是因为你不是减去0x38383536,而是减去0x36353838,得到了你所说的结果。

【讨论】:

  • 我没有投反对票,但以防万一,我修复了复制粘贴。问题仍然存在。
  • 哦,男孩,而不是要求 OP 进行澄清,有人对正确答案投了反对票。赞成撤消错误。两个错误不是一个正确的,但是哦,好吧......
  • @IInspectable 很好,谢谢,虽然答案似乎是徒劳的。
【解决方案2】:

明确地说,您是说 gdb 命令行以及 Windows VM 程序中发生错误吗?如果 gdb 提供垃圾,那么 VM 有问题。

你有 gdb 或其他调试器在 Windows VM 上工作吗?我对您看到错误的运行时环境有点困惑

如果您有发生错误的 gdb,那么这里是如何调试的。

如果只是程序,则使用 stepi 和 info regs 来查看发生了什么。最后一次减法之前的 $eax 值可能是感兴趣的值,但请检查每条指令。如果 $eax 在推送时具有正确的值,则在内存中查看 $sp 以获取该值。如果它仍然正确,则按照函数的返回并查找相应的弹出或堆栈读取并检查那里的值。在您实际打印/使用该值之前,堆栈可能已损坏?

【讨论】:

    【解决方案3】:

    我刚刚发现了问题。当我在调试器之外进行计算时,忘记了为了在 shellcode 中使用它们的小细节,我应该以相反的 Endian 顺序使用相同的值。

    心理提示:永远记得检查你的工作顺序。

    谢谢大家。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-06
      • 2015-08-23
      • 2022-06-28
      • 2012-05-27
      • 2014-10-12
      • 1970-01-01
      • 2018-05-16
      • 1970-01-01
      相关资源
      最近更新 更多