缓冲区溢出的困境

时间:2013-06-01 11:12:46

标签: c

我正在尝试使用“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)

如何溢出缓冲区以调用该函数两次?

3 个答案:

答案 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