帧指针/程序计数器/阵列溢出

时间:2010-01-11 04:43:43

标签: c

我正在研究C编程的练习题集,我遇到了这个问题。我不完全确定问题是什么......鉴于xDEADBEEF是暂停指令,但我们在哪里注入deadbeef?为什么FP在这个问题上有用?谢谢!

你被指派为执行星球太空任务的首席计算机工程师。在太空数月后,该船的主计算机HAL9000开始出现故障,并开始杀死机组人员。你是最后一个活着的机组成员,你需要欺骗HAL 9000计算机执行HALT指令。好消息是你知道暂停指令的机器代码是(十六进制)xDEADBEEF(十进制,这是-559,038,737)。坏消息是HAL 9000操作系统愿意实际运行的唯一程序是国际象棋。幸运的是,我们有一个详细的国际象棋程序源代码打印输出(下面给出了所有重要部分的摘录)。请注意,getValues函数读取一组非零整数,并将每个数字按顺序放在数组x中。该程序的原作者显然希望我们只提供两个正数,但程序中没有任何内容可以阻止我们输入三个或更多数字。我们也知道堆栈将使用介于8000和8999之间的内存位置,并且初始帧指针值将为8996.

void getValues(void) {
  int x[2]; // array to hold input values
  int k = 0;
  int n;
  n = readFromKeyboard(); // whatever you type on the keyboard is assigned to n
  while (n != 0) {
    x[k] = nextNumber;
    k = k + 1;
    n = readFromKeyboard();// whatever you type on the keyboard is assigned to n
  }
  /* the rest of this function is not relevant */
}

int main(void) {
  int x;
  getValues();
  /* the rest of main is not relevant */
}

键盘上应键入哪些数字序列以强制计算机执行暂停指令?

SAMPLE Solution

   One of the first three numbers should be -559038737.  The fourth number must be the address of where 0xdeadbeef was placed into memory.  Typical values for the 4th number are 8992 (0xdeadbeef is the second number) or 8991 (0xdeadbeef is first number).  

2 个答案:

答案 0 :(得分:2)

您要做的是溢出输入,以便程序返回到您在返回地址覆盖的一组指令。

问题在于:

  int x[2]; // array to hold input values

通过传递3个以上的值,您可以覆盖不应该的内存。解释示例示例:

  1. 首先输入-559,038,737将xDEADBEEF放入内存
  2. 第二次输入-559,038,737,为什么不呢。
  3. 第三个号码-559,038,737不能伤害
  4. 第四个数字8992是我们希望函数返回的地址。
  5. 当函数调用返回时,它将返回到地址,用(8992)覆盖堆栈上的返回地址。

    以下是一些方便的资源和摘录:

    实际的缓冲区溢出黑客工作是这样的:

    1. 查找具有溢出潜力的代码。

    2. 将要执行的代码放入 缓冲区,即堆栈上的缓冲区。

    3. 将返回地址指向相同的代码 你刚刚上堆。
    4. 如果你喜欢搞乱堆栈和调用程序,那么关于这个主题的好书也是“Hacking: The art of exploitation”。

      在您的情况下,似乎他们正在寻找您在传递给输入的整数中编码指令。

      An article on buffer overflowing

答案 1 :(得分:0)

提示:阅读buffer overflow漏洞。