c - 从另一个源生成输入时出现段错误

标签 c security buffer-overflow

对于家庭作业,我必须对他们的程序执行缓冲区溢出攻击。该程序的代码如下:

#include <stdio.h>
#include <string.h>

void vulnerable_function(char *input)
{
   char buffer[256];
   strcopy(buffer, input);
   printf("buffer:%s\n", buffer);
}

int main(int argc, char **argv)
{
   vulnerable_function(argv[1]);
}

因此,当我在终端上执行此命令时:perl -e 'print "A"x32' | ./opdr1_vuln 无论我们生成的输入有多大,我总是遇到段错误。

程序终止于:

#0  0xb7f17f50 in strcopy () from /lib/tls/i686/cmov/libc.so.6

但是,当我像这样在终端中手动填写许多 a 时:

./opdr1_vuln aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

它在 260's a's 崩溃,这是预期的,当我用 gdb 调试它时,它给出了另一个段错误。看起来如果我从终端本身以外的其他来源生成输入,它会给出 strcopy() 的段错误。

我用以下代码编译程序:

# gcc opdr1_vuln.c -o opdr1_vuln 

Linux debian 2.6.18-4-686 i686系统。

我不知道为什么会这样,有人可以帮助我吗?

最佳答案

perl -e 'print "A"x32' | ./opdr1_vuln

你没有传递任何参数,你只是为你的程序提供标准输入

argv[1] 是无效的 (NULL),并且由于参数计数没有被检查,你会得到未定义的行为(该函数是易受攻击的,但是 main 程序也是)

要将 perl 命令的输出提供给您的代码,您必须将输出作为参数传递,而不是作为输入。在经典的 bash 中将是:

./opdr1_vuln `perl -e 'print "A"x32'`

或(可能更具可读性)

./opdr1_vuln $(perl -e 'print "A"x32')

关于c - 从另一个源生成输入时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46973672/

相关文章:

security - Phoenix/Elixir 中 api key 的散列并为此使用 comeonin

安卓应用内支付验证

c - 基于堆栈的缓冲区溢出攻击中修改后的返回地址是如何近似的?

C: IF 语句未按预期触发

c - mmap/dev/null 用于写入

MySql LOAD_FILE 奇怪的权限问题?

c++ - 用于测试目的 : which floating point (IEEE754 32b) numbers are "special"?

c++ - 在 Windows 10 上创建缓冲区溢出

c - 来自不兼容指针类型的警告分配

c - 如何在 Linux 上的 C 中设置鼠标光标位置?