如何编译使用已弃用函数的C程序,例如gets()

时间:2014-11-06 18:22:42

标签: c linux gcc

对于家庭作业,我必须尝试使用​​缓冲区溢出来破坏简单的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)。

1 个答案:

答案 0 :(得分:5)

你可以使用更安全的&#34;像fgets这样的函数,并给它一个虚假的缓冲区大小,以便从中获取不安全的行为。

比实际缓冲区更大的缓冲区大小会让fgets超出其边界并可能导致程序崩溃。

仅仅因为枪具有安全性并不意味着你不能用它射击你的脚。