我读了许多关于像strcpy、memcpy等不安全函数的文章。当处理外部数据时,例如文件内容或来自套接字的数据,这些函数可能会导致安全问题。这听起来可能很愚蠢,但我写了一个容易受攻击的程序,但我没有成功“黑进”它。
我理解缓冲区溢出的问题。看看这个示例代码:
int main() {
char buffer[1];
int var = 0;
scan("%s", &buffer);
printf("var = 0x%x\n", var);
return 0;
}
当我执行程序并输入"abcde"时,程序输出0x65646362,这是十六进制+小端形式下的"edcb"。然而,我读到过可以修改被压入堆栈的eip值,以便在调用system()函数之前执行一些不需要的代码。但是,该函数的汇编从这里开始:push %ebp
mov %ebp, %esp
and $0xfffffff0, %esp
sub $0x20, %esp
由于函数开始时%esp的值是随机的,加上此处的"and"操作符,似乎没有可靠的方法将精确值写入推送的eip值中。
而且,我读到过可以在缓冲区中执行你编写的代码(这里缓冲区只有1个字节长,但实际上它足够大以存储一些代码),但考虑到缓冲区的位置是随机的,你会给eip赋什么值来执行它呢?
那么,为什么开发者会如此担心安全问题呢(除了程序可能会崩溃)?你有一个易受攻击的程序示例和如何"黑掉"它以执行不需要的代码吗?我在Linux上尝试过这个,Windows是否更安全?
and $0xfffffff0, %esp
指令会将偏移量渲染为EIP变量,因此他们似乎掌握了基本的溢出机制。 - torakbuffer
的第一个字节和返回EIP存储地址之间的字节数。然而,我刚刚意识到这个额外偏移量可能的值只有0、4、8或12。这些都是四个字节(地址大小)的倍数。因此,将要写入返回EIP的值重复即可。 - torak