#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,程序会终止吗?
答案 0 :(得分:2)
确定B
&#34;&#34;&#34;堆栈中A
,但堆栈(通常,假设在您的平台上基于打印输出)向下向下。请注意,B
的地址小于A
的地址。
因此B
的覆盖进入A
。
另外我认为gdb很聪明,只打印了来自B
的10个字符,因为它打印 10 A
&#39} s并且没有终止。
您无法使用流氓字符串格式覆盖处理器寄存器,寄存器不在内存中(一般情况下,肯定不会在您可能正在使用的x86上)。
请注意,您的代码会调用未定义的行为,因此可能因此而终止。