Windows ASM Shellcode中的HEX Substraction返回错误的值

时间:2016-08-28 12:23:48

标签: windows assembly gdb hex shellcode

我正在进行一些shell编码,并且在我的Windows VM上有这个奇怪的结果。这个想法是,从零开始,创造出一些价值。在这种情况下,我需要该值等于: 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。

3 个答案:

答案 0 :(得分:1)

这是因为您没有减去0x38383536,而是减去0x36353838,这会给出您所说的结果。

答案 1 :(得分:0)

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

心理记录:务必记住检查您的工作顺序。

感谢所有人。

答案 2 :(得分:-1)

要明确的是,您是说错误发生在gdb命令行以及Windows VM程序中?如果gdb给了垃圾,那么虚拟机出了问题。

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

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

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