我正在进行一些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。
答案 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并检查其中的值。在您实际打印/使用该值之前,堆栈可能已损坏?