我正在尝试使用“Shell编程手册”中描述的代码,其中溢出缓冲区并导致相同的代码执行两次...
void return_input (void)
{ char array[5];
gets (array);
printf(“%s\n”, array);
}
main()
{
return_input();
return 0;
}
任务是覆盖缓冲区并用'return_input()'的地址替换'return 0'的地址,以便输入的字符串打印两次..
我编译如下
gcc -fno-stack-protector overflow.c
覆盖保护机制。问题是我不能让它执行两次。在这种情况下,函数ri()的地址为0x08048440。我给出了如下输入
./a.out
aaaaaaaaaaaaa\x40\x84\x04\x08
这不应该导致函数被调用两次吗?它总是返回
aaaaaaaaaaaaaaaa��
Segmentation fault (core dumped)
如何溢出缓冲区以调用该函数两次?
答案 0 :(得分:1)
\x40\x84\x04\x08
不受支持。您应该使用其他程序将十六进制输入转换为字节。
如果您使用的是bash,则可以尝试使用echo -e '\x40\x84\x04\x08' | ./a.out
。我在linux shell scripting: hex string to bytes
答案 1 :(得分:0)
根据定义,缓冲区溢出的行为是不可预测的。如果您恰好在同一操作系统等上使用相同版本的相同编译器,则只会获得相同的行为。
答案 2 :(得分:0)
根据您的机器类型,您可能需要进行调整。 http://www.tenouk.com/Bufferoverflowc/Bufferoverflow4.html