无法在简单程序中利用溢出(第 2 章 shellcoder 手册)

Cant exploit overflow in simple program (chapter2 shellcoder's handbook)

我正在阅读 The Shellcoder's Handbook,我目前正在阅读第 2 章,其中我有一个简单的程序可以通过溢出预期输入然后为 ret 指令发出一个新位置以便函数 return_input 可以利用被执行两次!

这是用C语言编写的简单程序

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

这是main函数的反汇编版本,可以看到调用函数的跳转地址

我使用以下命令并输入溢出的字符以及后面应该替换 ret 内容的地址

但如您所见,我没有 运行 return_input 函数两次,而是它只是打印出一个问号并表示分割失败

  1. gets 读取终止字节并将其替换为 NULL 字节,因此您想要的 ret 被该 NULL 字节破坏了。
  2. 您在反汇编代码中看到的偏移量 不是 真实地址,您编译程序时设置了 PIE 标志,因此真实地址可能看起来像 0x55555????58a,这就是 gdb 不允许您插入断点的原因,因为您可能会尝试执行 b *0x58a 或其他操作。用 -no-pie 编译会让生活更轻松。