我目前正在准备一份关于同学中计算机安全的小型演讲。为了让他们至少有点兴奋,我想证明如何利用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取代。 有谁知道代码的问题是什么?我是否遗漏了一些基本观点,还是某种针对基于堆栈的缓冲区溢出的保护?
谢谢,
答案 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)。