对于家庭作业,我必须尝试使用缓冲区溢出来破坏简单的c程序。我的问题是我的编译器不会编译gets()
函数,因为它已被弃用且不安全。我理解这一点,但为了这个例子,我想覆盖它。这是代码:
#include <stdio.h>
int main(int argc, char *argv[]) {
int valid = 0;
// Char arrays w/buffer set to 8 chars
char str1[8];
char str2[8];
next_tag(str1);
//This is where I want to use gets and not fgets or other secure functions...
gets(str2);
if(strncmp(str1, str2, 8) == 0) {
valid = 1;
}
// Print
printf("Buffer 1: str1(%s), str2(%s), valid(%d)\n", str1, str2, valid);
}
我的gcc版本是:
rabbitfighter@ECHO:[~/Code/C/BufferOverflowExamples]: gcc -v Using built-in specs. COLLECT_GCC=gcc COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-unknown-linux-gnu/4.9.1/lto-wrapper Target: x86_64-unknown-linux-gnu Configured with: /build/gcc/src/gcc-4.9-20140903/configure --prefix=/usr --libdir=/usr/lib --libexecdir=/usr/lib --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=https://bugs.archlinux.org/ --enable-languages=c,c++,ada,fortran,go,lto,objc,obj-c++ --enable-shared --enable-threads=posix --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-clocale=gnu --disable-libstdcxx-pch --disable-libssp --enable-gnu-unique-object --enable-linker-build-id --enable-cloog-backend=isl --disable-isl-version-check --disable-cloog-version-check --enable-lto --enable-plugin --enable-install-libiberty --with-linker-hash-style=gnu --disable-multilib --disable-werror --enable-checking=release Thread model: posix gcc version 4.9.1 20140903 (prerelease) (GCC)
如果有人可以帮助我,我会非常感激。我正在运行Manjaro Linux(Arch)。
答案 0 :(得分:5)
你可以使用更安全的&#34;像fgets这样的函数,并给它一个虚假的缓冲区大小,以便从中获取不安全的行为。
比实际缓冲区更大的缓冲区大小会让fgets超出其边界并可能导致程序崩溃。
仅仅因为枪具有安全性并不意味着你不能用它射击你的脚。