从Python传递shellcode作为命令行参数

时间:2011-05-16 21:35:58

标签: python utf-8 buffer-overflow

我目前正在准备一份关于同学中计算机安全的小型演讲。为了让他们至少有点兴奋,我想证明如何利用strcpy-function inc C的错误使用。 这是易受攻击程序的代码:

#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

这为EIP提供了正确的0x4D4C4B4A(MLKJ)。如果我用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,它是ESCAPE的ASCII字符,被0xC2取代。 当我改变地址的顺序时,它看起来像这样:\ x21 \ x1b \ x75 \ x9a,9a被同一个神秘的C2取代。 有谁知道代码的问题是什么?我是否遗漏了一些基本观点,还是某种针对基于堆栈的缓冲区溢出的保护?

谢谢,

1 个答案:

答案 0 :(得分: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)。