当其他静态数组溢出时覆盖堆栈静态数组

时间:2016-03-17 09:26:25

标签: c stack

#include<stdio.h>

int main(){
  char A[10];
  char B[10];
  sprintf(A,"Hello");
  sprintf(B,"AAAAAAAAAABBBBBBBBBBCCCCCCCCCC");
  printf("%s:%s\n",A,B);
  return(0);
}

(gdb) p &A
$1 = (char (*)[10]) 0x7fffffffe450
(gdb) p &B
$2 = (char (*)[10]) 0x7fffffffe440
(gdb) step
2: B = "AAAAAAAAAA"
1: A = "BBBBCCCCCC"
printf o/p- BBBBCCCCCCCCCC:AAAAAAAAAABBBBBBBBBBCCCCCCCCCC

问题 -

A在堆栈框架中排在第一位,B在后面排在第一位。如果B覆盖A,则所有"BBBBBBBBBB"应该进入A为什么A从"BBBBCCCCCCCCCC"开始?

另外我想知道是否覆盖了BP,程序会终止吗?

1 个答案:

答案 0 :(得分:2)

确定B&#34;&#34;&#34;堆栈中A,但堆栈(通常,假设在您的平台上基于打印输出)向下向下。请注意,B的地址小于A的地址。

因此B的覆盖进入A

另外我认为gdb很聪明,只打印了来自B的10个字符,因为它打印 10 A&#39} s并且没有终止。

您无法使用流氓字符串格式覆盖处理器寄存器,寄存器不在内存中(一般情况下,肯定不会在您可能正在使用的x86上)。

请注意,您的代码会调用未定义的行为,因此可能因此而终止。