间接指针覆盖 - 它如何覆盖 return 地址?

Indirect pointer overwriting - how does it overwrite the return address?

所以我读到如果你不能通过溢出直接覆盖return地址,你仍然可以通过指针间接覆盖return地址。

我知道它的工作原理是使用溢出来覆盖局部变量。然后,如果有一个指针被取消引用到该局部变量的值,那么显然它可以覆盖 return 地址?这是我很难理解的部分。

这可能不是查看此问题的最完美方式,但希望它能让您了解可能发生的事情:

void myFunc() {
  int* ptr = (whatever the code was pointing to);
  int numToBePutInPtr;
  char aString[10];

  // INSERT HERE some way of inputting into aString. To perform the attack
  // input 10 useless bytes, then the address of the code you want to get run,
  // then the address of the return address on the stack

  *ptr = numToBePutInPtr;
}

当最后一行得到 运行 时,而不是 numToBePutInPtr 的原始值进入 *ptr,它是你想要得到的代码的地址 运行 .并且由于您覆盖了 ptr 以实际指向 return 地址在堆栈中的位置,因此 return 地址将替换为您想要 运行 的代码的地址.

这种攻击与更基本的 overflow-to-overwrite-return-address 攻击之间的主要区别在于,更简单的堆栈守卫不会发现您溢出了局部变量(您“跳过”了检查通过仅使用指针)。但是,这仍然受到其他检查的严格防范。