2011-05-16 97 views
1

我目前正在准备一个关于我的同学之间的计算机安全的小演讲。为了让他们至少有点激动,我想演示如何利用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取代。 有没有人知道最新的代码问题?我是否缺少一些基本点或者它是否对基于堆栈的缓冲区溢出提供某种保护?

谢谢,

+0

您正在使用哪种版本的Python(2.x或3.x)? – 2011-05-16 21:51:07

+0

对不起,我忘记提到:我在Windows 7上使用Python 3.1 64位 – AlexanderF 2011-05-17 05:42:39

回答

1

它看起来像您的文本正在接受UTF-8转换。请注意,您的原始字节:

75 9a 21 1b 
    ^^ 

75 c2 9a 21 1b 
    ^^^^^ 

我已经强调了UTF-8编码的字节替换。如果你使用的是Python 3,尝试:

os.system(b"test.exe ABCDEFGHI\x75\x9a\x21\x1bNOPQRSTUVWXYZ") 

b""表示该数据是字节序列,并且不应该从Unicode转换为默认编码(而你的情况似乎是UTF-8)。

+0

嗨,我之前尝试过,不幸的是它会导致Type错误,因为os.system()调用需要一个字符串而不是字节。 – AlexanderF 2011-05-17 05:51:39

+0

@AlexanderF:或许你可以尝试'subprocess'模块。我能够通过'subprocess.Popen([“test.exe”,b“ABCDE”])''成功传递原始字节。 – 2011-05-17 08:29:46

+0

这在这里不起作用,它表示Type str不支持缓冲区api。但是,我能够从另一个使用system()调用的C程序传递所需的字节。 – AlexanderF 2011-05-17 08:58:26