从另一个源生成输入时出现分段错误
Segmentation fault when generating input from another source
对于家庭作业,我必须对他们的程序执行缓冲区溢出攻击。该程序的代码如下:
#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 系统。
我不知道为什么会这样,有人可以帮助我吗?
在
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')
对于家庭作业,我必须对他们的程序执行缓冲区溢出攻击。该程序的代码如下:
#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 系统。
我不知道为什么会这样,有人可以帮助我吗?
在
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')