1

我正在尝试使用“Shell 编码器手册”中描述的代码,您溢出缓冲区并导致相同的代码被执行两次......

void return_input (void)
{ char array[5]; 
  gets (array); 
  printf(“%s\n”, array); 
}
 main() 
 { 
  return_input();
  return 0; 
 } 

任务是覆盖缓冲区并将“return 0”的地址替换为“return_input()”的地址,以便输入的字符串被打印两次。

我编译如下

gcc -fno-stack-protector overflow.c

覆盖保护机制。问题是我不能让它执行两次。在这种情况下,函数 ri() 的地址位于 0x08048440 。我输入如下

./a.out
aaaaaaaaaaaaa\x40\x84\x04\x08 

这不应该导致函数被调用两次吗?它总是返回

aaaaaaaaaaaaaaaa�� 
Segmentation fault (core dumped)

我怎样才能溢出缓冲区来调用函数两次?

4

3 回答 3

1

\x40\x84\x04\x08不支持。您应该使用其他程序将十六进制输入转换为字节。

如果您使用的是 bash,则可以尝试echo -e '\x40\x84\x04\x08' | ./a.out. 我在linux shell scripting 中找到了该解决方案:hex string to bytes

于 2013-06-01T11:23:03.243 回答
0

根据您的机器类型,您可能需要进行调整。 http://www.tenouk.com/Bufferoverflowc/Bufferoverflow4.html

于 2013-06-01T11:56:26.370 回答
0

根据定义,缓冲区溢出的行为是不可预测的。如果您碰巧在相同的操作系统等上使用相同版本的相同编译器和相同的设置,您只会得到相同的行为,等等。

于 2013-06-01T11:21:47.450 回答