我目前正在准备一个关于我的同学之间的计算机安全的小演讲。为了让他们至少有点激动,我想演示如何利用strcpy-function inc C的错误用法。 这是脆弱的程序代码:从Python传递shellcode作为命令行参数
#include<string.h>
#include<stdio.h>
void function(char *buffer1)
{
char buffer2[5];
strcpy(buffer2,buffer1);
}
int main (int argc, char **argv)
{
function(argv[1]);
return 0;
}
只需使用命令行,我能够通过调用它与
test.exe ABCDEFGHIJKLMNOPQRSTUVWXYZ
这给了我正确的0x4D4C4B4A(MLKJ)的应用程序崩溃EIP。它也可以,如果我把它用Python:
os.system("test.exe ABCDEFGHIJKLMNOPQRSTUVWXYZ")
但是,如果我想提出一个地址,而不是JKLM,像这样:
os.system("test.exe ABCDEFGHI\x75\x9a\x21\x1bNOPQRSTUVWXYZ")
它给了我下面的输出附近的ESP上堆栈:
0028cca0 e4 21 d7 41 42 43 44 45-46 47 48 49 75 c2 9a 21 .!.ABCDEFGHIu..!
0028ccb0 1b 4e 4f 50 51 52 53 54-55 56 57 58 59 5a 00 00 .NOPQRSTUVWXYZ..
在这里,75 C2 9A 21点很重要,因为它几乎是我所期待的,除了0x1B,这是ASCII字符转义,通过为0xC2取代。 当我改变地址的顺序时,它看起来像这样:\ x21 \ x1b \ x75 \ x9a,9a被相同的神秘C2取代。 有没有人知道最新的代码问题?我是否缺少一些基本点或者它是否对基于堆栈的缓冲区溢出提供某种保护?
谢谢,
您正在使用哪种版本的Python(2.x或3.x)? – 2011-05-16 21:51:07
对不起,我忘记提到:我在Windows 7上使用Python 3.1 64位 – AlexanderF 2011-05-17 05:42:39