【问题标题】:Cant exploit overflow in simple program (chapter2 shellcoder's handbook)不能在简单程序中利用溢出(第 2 章 shellcoder 手册)
【发布时间】:2018-10-03 15:01:51
【问题描述】:

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

这是用C编写的简单程序

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

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

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

但正如您所见,我没有运行两次 return_input 函数,而是打印出一个问号并说分段失败

【问题讨论】:

  • UB͏͏͏͏͏͏͏͏͏͏͏͏͏
  • 这种“利用”总是那么愚蠢……如果返回地址恰好包含一个值为 0x00 的字节,你会怎么做?即使没有 ASLR,这反过来似乎也很可能。
  • 请不要将文本粘贴为图像。没有人希望你的整个屏幕截图看到 2 行文字!
  • 您是否尝试过使用预期输入调试程序?
  • @MartinVéronneau 我试过了,但 gdb 不允许我插入断点,它说无法访问内存

标签: c reverse-engineering buffer-overflow exploit


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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-26
    • 1970-01-01
    • 1970-01-01
    • 2016-02-07
    • 2021-11-30
    • 1970-01-01
    • 2012-08-09
    • 1970-01-01
    相关资源
    最近更新 更多