从其他来源

时间:2017-10-27 11:09:18

标签: 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的a,这是预期的,当我用gdb调试它时,它给出了另一个分段错误。看起来如果我从另一个源生成输入而不是终端本身,它会使用strcopy()给出分段错误。

我用以下程序编译了程序:

# gcc opdr1_vuln.c -o opdr1_vuln 

这是一个Linux debian 2.6.18-4-686 i686系统。

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

1 个答案:

答案 0 :(得分:1)

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')