【发布时间】:2011-03-18 13:01:21
【问题描述】:
我阅读了许多关于不安全函数(如 strcpy、memcpy 等)的文章,这些函数可能会在处理外部数据(如文件内容或来自套接字的数据)时导致安全问题。这听起来可能很愚蠢,但我编写了一个易受攻击的程序,但我没有设法“破解”它。
我了解缓冲区溢出的问题。拿这个示例代码:
int main() {
char buffer[1];
int var = 0;
scan("%s", &buffer);
printf("var = 0x%x\n", var);
return 0;
}
当我执行程序并输入“abcde”时,程序输出 0x65646362,即十六进制 + little-endian 的“edcb”。但是我读到您可以修改被压入堆栈的 eip 值,以使程序执行一些不需要的代码(例如,在调用 system() 函数之前)。
然而函数的汇编是这样开始的:
push %ebp
mov %ebp, %esp
and $0xfffffff0, %esp
sub $0x20, %esp
由于 %esp 的值在函数开始时是随机的,并且由于这个“和”,似乎没有可靠的方法将精确值写入推送的 eip 值。
此外,我读到可以执行您在缓冲区中编写的代码(这里的缓冲区只有 1 个字节长,但实际上它足以存储一些代码)但是您会给什么价值eip 为了这样做(考虑到缓冲区的位置是随机的)?
那么为什么开发人员如此担心安全问题(除了程序可能崩溃)?您是否有易受攻击程序的示例以及如何“破解”它以执行不需要的代码?我在 linux 上试过这个,Windows 不安全吗?
【问题讨论】:
标签: c security overflow buffer